2016-07-01 8 views
0

Ich verwende das PyGMO-Paket für Python, für Multi-Objektive-Optimierung. Ich bin nicht in der Lage, die Dimension der Fitness-Funktion im Konstruktor zu reparieren, und die Dokumentation ist auch nicht sehr beschreibend. Ich frage mich, ob jemand hier in der Vergangenheit Erfahrungen mit PyGMO gemacht hat: Das könnte ziemlich einfach sein.Multi-Ziel-Optimierung mit PyGMO

Ich versuche unter einem Minimum Beispiel zu konstruieren:

from PyGMO.problem import base 
from PyGMO import algorithm, population 
import numpy as np 
import matplotlib.pyplot as plt 


class my_problem(base): 
    def __init__(self, fdim=2): 
     NUM_PARAMS = 4 
     super(my_problem, self).__init__(NUM_PARAMS) 
     self.set_bounds(0.01, 100) 

    def _objfun_impl(self, K): 
     E1 = K[0] + K[2] 
     E2 = K[1] + K[3] 

     return (E1, E2,) 


if __name__ == '__main__': 
    prob = my_problem() # Create the problem 
    print (prob) 
    algo = algorithm.sms_emoa(gen=100) 
    pop = population(prob, 50) 
    pop = algo.evolve(pop) 

    F = np.array([ind.cur_f for ind in pop]).T 
    plt.scatter(F[0], F[1]) 
    plt.xlabel("$E_1$") 
    plt.ylabel("$E_2$") 
    plt.show() 

fdim=2 oben ist ein gescheiterter Versuch, die Fitness-Dimension zu setzen. Der Code schlägt mit dem folgenden Fehler fehl:

ValueError: ..\..\src\problem\base.cpp,584: fitness dimension was changed inside objfun_impl(). 

Ich wäre dankbar, wenn jemand helfen kann, dies herauszufinden. Vielen Dank!

Antwort

1

Schauen Sie sich die correct documentation an?

Es gibt keine fdim (was in Ihrem Beispiel sowieso nichts tut, da es nur eine lokale Variable ist und nicht verwendet wird). Aber es gibt n_obj:

n_obj: number of objectives. Defaults to 1

Also, ich glaube, Sie wollen so etwas wie (korrigiert dank @Distopia):

#(...) 
def __init__(self, fdim=2): 
    NUM_PARAMS = 4 
    super(my_problem, self).__init__(NUM_PARAMS, 0, fdim) 
    self.set_bounds(0.01, 100) 
#(...) 
+0

Ich bekomme den Fehler: 'n_obj' scheint ein undefiniertes Schlüsselwort Argument zu sein. Allerdings ist die Lösung von @Distopia unten funktioniert --- Ich rate die Reihenfolge der Argumente für "__init__" ist Problem Dimension (oder Anzahl der Parameter), gefolgt von Constraint-Dimensionen und schließlich fitness Dimension. –

+0

Kein Problem, froh, dass es geholfen hat – rll

+0

Ich habe das Code-Snippet aus Gründen der Fertigstellung aktualisiert. – rll

1

ich ihr Beispiel verändert und dies schien für mich zu arbeiten.

#(...) 
def __init__(self, fdim=2): 
    NUM_PARAMS = 4 
    # We call the base constructor as 'dim' dimensional problem, with 0 integer parts and 2 objectives. 
    super(my_problem, self).__init__(NUM_PARAMS,0,fdim) 
    self.set_bounds(0.01, 100) 
#(...)