当前位置: 首页 > 知识库问答 >
问题:

Pymoo Python:TypeError:_evaluate()获得意外的关键字参数'algorithm'

徐飞龙
2023-03-14

我试图用Python的Pymoo库设置我的优化,我使用他们的“入门”指南,但传递我自己的独立变量,也不使用约束。我使用指南中的示例函数得到了相同的结果(我在下面的代码中注释了它们)。

代码如下:

class MyProblem(Problem): 
    
    def __init__(self,total,G,t):                      
        super().__init__(n_var = 3,  # 2 in the case of the example from guide
                         n_obj = 2, 
                         n_constr = 0, 
                         #xl = np.array([-1.0,0.0]),    # for example from guide
                         #xu = np.array([1.0, 10.0]),
                         xl = np.array([-1.0,0.0, -1.0]), 
                         xu = np.array([1.0, 10.0, 1.0]),
                         elementwise_evaluation = True)
        self.total = total,         # my own independent variables 
        self.G = G,
        self.t = t
    
    def _evaluate(self, x, out):   
        f1 = 1/3*self.total*(1+2*((x[0]-x[2])*np.exp(-self.t/x[1]) + x[2]))
        f2 = 1/3*self.total*self.G*(1-((x[0]-x[2])*np.exp(-self.t/x[1]) + x[2]))
        #f1 = x[0]**2 + x[1]**2         # example from guide
        #f2 = (x[0]-1)**2 + x[1]**2
        
        out["F"] = np.column_stack([f1, f2])
        
elementwise_problem = MyProblem(total,G,t)

problem = elementwise_problem

algorithm = NSGA2(pop_size = 100,
                  n_offspring = 10, 
                  sampling = get_sampling('real_random'),
                  crossover = get_crossover('real_sbx', prob = 0.9, eta = 15),
                  mutation = get_mutation('real_pm',eta = 20),
                  eliminate_duplicates = True)

termination = get_termination("n_gen", 40)

# method 1
results = minimize(problem,
                   algorithm,
                   termination,
                   seed = 1, 
                   save_history = True,
                   verbose = True)

# method 2
obj = copy.deepcopy(algorithm)

obj.setup(problem, termination = termination, seed = 1)

# until the termination criterion has not been met
while obj.has_next():
    # perform an iteration of the algorithm
    obj.next()
    # access the algorithm to print some intermediate outputs
    print(f"gen: {obj.n_gen} n_nds: {len(obj.opt)} constr: {obj.opt.get('CV').min()} ideal: {obj.opt.get('F').min(axis=0)}")
    

result = obj.result()

当我打印出问题类中_evaluate_elementwise方法中的kwargs时,我确实得到了它是算法对象:

{'算法':

我很难理解它是如何将algorithm对象作为_evalute的参数的,它接受(_x,_out,*args,**kwargs)。如果有人更熟悉这个软件包,我将非常感谢您的帮助!

以下是完整的轨迹回溯:

关键字args:{'algorithm':

文件“”,第6行,格式为verbose=True)

文件“C:\Users\anaconda3\lib\site packages\pymoo\optimize.py”,第85行,在minimize res=算法中。解决()

文件"C:\用户\anaconda3\lib\site-包\pymoo\Model\algorithm.py",第226行,在解决自._solve(self.problem)

文件"C:\用户\anaconda3\lib\site-包\pymoo\Model\algorithm.py",第321行,_solveself.next()

文件"C:\用户\anaconda3\lib\site-包\pymoo\Model\algorithm.py",第243行,下self.initialize()

文件“C:\Users\anaconda3\lib\site packages\pymoo\model\algorithm.py”,第215行,在initialize self中_初始化()

文件“C:\Users\anaconda3\lib\site packages\pymoo\algorithms\genetic\u algorithm.py”,第81行,在初始化self中。评估员。eval(self.problem,pop,算法=self)

文件“C:\Users\anaconda3\lib\site packages\pymoo\model\evaluator.py”,第78行,在eval self中_评估(问题,pop[I],**kwargs)

文件"C:\用户\anaconda3\lib\site-包\pymoo\Model\evaluator.py",第97行,在_eval**kwargs)

文件“C:\Users\anaconda3\lib\site packages\pymoo\model\problem.py”,第284行,在evaluate out=self中_按元素计算(X,计算梯度,out,*args,**kwargs)

文件“C:\Users\anaconda3\lib\site packages\pymoo\model\problem.py”,第413行,在元素方面[ret.append(func(x))为x中的x]

文件“C:\Users\anaconda3\lib\site packages\pymoo\model\problem.py”,第413行,在[ret.append(func(x))中,用于x中的x]

文件“C:\Users\anaconda3\lib\site packages\pymoo\model\problem.py”,第400行,在func self中_评估(x,out,*args,**kwargs)

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

共有1个答案

符鸿光
2023-03-14

您的错误似乎是由于\u evaluate函数中缺少*args、**kwargs而发生的。我编辑了您的代码,您可以检查:

class MyProblem(Problem):
    
    total = 5.0        # my own independent variables 
    G = 6.0
    t = 7.0
        
    def __init__(self):                      
        super().__init__(n_var = 3,  # 2 in the case of the example from guide
                         n_obj = 2, 
                         n_constr = 0, 
                         #xl = np.array([-1.0,0.0]),    # for example from guide
                         #xu = np.array([1.0, 10.0]),
                         xl = np.array([-1.0,0.0, -1.0]), 
                         xu = np.array([1.0, 10.0, 1.0]),
                         elementwise_evaluation = True)

    
    def _evaluate(self, x, out, *args, **kwargs): # added *args, **kwargs   
        f1 = 1/3*self.total*(1+2*((x[0]-x[2])*np.exp(-self.t/x[1]) + x[2]))
        f2 = 1/3*self.total*self.G*(1-((x[0]-x[2])*np.exp(-self.t/x[1]) + x[2]))
        #f1 = x[0]**2 + x[1]**2         # example from guide
        #f2 = (x[0]-1)**2 + x[1]**2
        
        out["F"] = np.column_stack([f1, f2])
        
elementwise_problem = MyProblem()

#problem = elementwise_problem

algorithm = NSGA2(pop_size = 100,
                  n_offspring = 10, 
                  sampling = get_sampling('real_random'),
                  crossover = get_crossover('real_sbx', prob = 0.9, eta = 15),
                  mutation = get_mutation('real_pm',eta = 20),
                  eliminate_duplicates = True)

termination = get_termination("n_gen", 40)

# method 1
results = minimize(elementwise_problem,
                   algorithm,
                   termination,
                   seed = 1, 
                   save_history = True,
                   verbose = True)
 类似资料:
  • 我尝试使用pandas DataFrame的pivot_table方法; 但是,我收到以下错误: 上述命令摘自Wes McKinney(pandas的创建者)的《Python用于数据分析》一书

  • 我有wiev功能: 装饰: "index"函数正常工作,但"细节"向下错误: TypeError:包装器()获得意外的关键字参数“id” P.S.id参数在url模式中

  • 我将我的项目从Django 1.11升级到2.2,做了所有的更改,但带来了新的错误,说login()得到了一个意想不到的关键字参数template_name。它与Django 1.11的前一个版本运行良好(所有其他网址都在工作,只有着陆页给出了错误)。我找不到任何关于这个问题的参考资料。以下是该问题的错误、网址和视图。 着陆\urls.py 着陆\views.py C:\Users\User\ve

  • 我试图使用以下代码从上面的数据框创建一个有序的类别- 但是它给出了错误:astype()得到了一个意外的关键字参数“categories”。

  • 我正在尝试转换大熊猫的unix时间。我从一个csv文件中读取了这个,但是当我试图转换它时,我得到了上面的错误。 完全回溯 附加信息: 熊猫的版本是:0.8。0 操作系统:Debian,使用sudo apt get install python pandas安装(根据官方网站) 样本数据

  • 我有一张大桌子,我根据它们的日期把它切成许多小桌子: 我已经对dfs['2019-06-23']特定表进行了一些修改,现在我想将其保存在我的计算机上。我尝试了两种方法: 他们都提出了这个错误: get_handle()得到了一个意外的关键字参数错误 我不知道为什么会出现这个错误,也没有找到任何原因。我用这种方式保存了很多文件,但以前从未用过。 我的目标是:在修改后将此数据帧保存为csv