1

我正在使用 pymoo 包进行多目标优化,但在设置模型时遇到了问题,因为在尝试将其他自变量作为参数传递时出现错误(除了正在优化的参数)。对于 OOP 和函数式编程,我尝试按照 getting_started 示例 ( https://pymoo.org/getting_started.html )。我的目标函数有自变量 t、total 和 G,其中 t 和 total 是数组,G 是标量。我尝试像这样通过它们:

class MyProblem(Problem): 
    
    def __init__(self):
        super().__init__(n_var = 3, 
                         n_obj = 2, 
                         n_constr = 0, 
                         xl = np.array([0.0.0,0.0, -0.5]), 
                         xu = np.array([0.8, 10.0, 0.9]),
                         elementwise_evaluation = True)   
    
    def _evaluate(self, p, out, total, G, t):                         # *args = [total, G, t]
        f1 = 1/3*total*(1+2*((p[0]-p[2])*np.exp(-t/p[1]) + p[2]))
        f2 = 1/3*total*G*(1-((p[0]-p[2])*np.exp(-t/p[1]) + p[2]))
        
        out["F"] = np.column_stack([f1, f2])

elementwise_problem = MyProblem()

problem = elementwise_problem

导致:

TypeError:_evaluate() 得到了一个意外的关键字参数“算法”

p 是我要优化的三个参数的列表。

使用函数式编程我找不到可以在 FunctionalProblem 对象中传递参数的位置,所以我只是这样做了:

objs = [
        lambda p, total, t: 1/3*total*(1+2*((p[0]-p[2])*np.exp(-t/p[1]) + p[2])), 
        lambda p, total, t, G: 1/3*total*G*(1-((p[0]-p[2])*np.exp(-t/p[1]) + p[2]))
        ]
    
constr_ieq = []
 
functional_problem = FunctionalProblem(3,  
                                    objs,      
                                    constr_ieq = constr_ieq,    
                                    xl = np.array([0.0, 0.01, -0.1]),   
                                    xu = np.array([0.8, 50.0, 0.8]))   
    
problem = functional_problem

这导致:

TypeError: () 缺少 2 个必需的位置参数:'total' 和 't'

其余代码(算法和终止对象等)与 Getting_started 示例中的相同,因为我现在只是想让它运行..

有没有人尝试过使用 pymoo 传递参数并且知道如何正确地做到这一点?

4

1 回答 1

1

您可以在MyProblem类中定义自变量,然后

def _evaluate(self, p, out):                         
        f1 = 1/3*self.total*(1+2*((p[0]-p[2])*np.exp(-self.t/p[1]) + p[2]))
        f2 = 1/3*self.total*self.G*(1-((p[0]-p[2])*np.exp(-self.t/p[1]) + p[2]))
于 2021-07-14T09:24:17.660 回答