2017-01-16 113 views
0

我正在並行優化問題PyGMO。不幸的是,文檔不是很有幫助。據these guidelines,我riting我的問題,因爲PyGMO自定義類與__init__錯誤

import PyGMO as pygmo 
class my_problem(pygmo.base): 
    def __init__(self,model,config,pars,**kwargs): 
     # Does some parameter definition according to input arguments model, config etc... 
     ... 

     # Invoke base class as required by PyGMO 
     super(my_problem,self).__init__(self.__dim) 

    def _objfun_impl(self,x): 
     ... 
     f = ... # Cost function to optimize 
     return (f,) 

# Main 
model = 'ei' 
config = 'x1' 
args = (...) 
prob = my_problem(model,config,args) 
algo = pygmo.algorithm.de(gen=20) 
isl = pygmo.island(algo,prob,20) 
print isl.population.champion.f 
isl.evolve(10) 
print isl.population.champion.f 

這並不工作,併產生以下錯誤:

File  "/home/maurizio/Dropbox/Stability_Analysis_network/mymain.py", line 643, in main_routine 
isl = pygmo.island(algo,prob,20) 
File "/usr/lib/python2.7/site-packages/PyGMO/core/__init__.py", line 239, in island 
return _generic_island_ctor(None, *args, **kwargs) 
File "/usr/lib/python2.7/site-packages/PyGMO/core/__init__.py", line 132, in _generic_island_ctor 
return py_island(*args, **kwargs) 
File "/usr/lib/python2.7/site-packages/PyGMO/core/__init__.py", line 119, in _generic_island_ctor 
super(type(self), self).__init__(*ctor_args) 
File "/usr/lib/python2.7/site-packages/PyGMO/core/__init__.py", line 48, in __init__ 
_core._base_island.__init__(self, *args) 
File "/usr/lib/python2.7/site-packages/PyGMO/problem/_base.py", line 36, in __get_deepcopy__ 
return deepcopy(self) 
File "/usr/lib64/python2.7/copy.py", line 190, in deepcopy 
y = _reconstruct(x, rv, 1, memo) 
File "/usr/lib64/python2.7/copy.py", line 329, in _reconstruct 
y = callable(*args) 
TypeError: __init__() takes exactly 4 arguments (1 given) 

任何想法,以什麼__init__指的是和缺少什麼參數?我懷疑這是我的班級定義的問題。

+0

我沒有看到你在代碼中打電話給你的班級... –

+0

對不起,我正在編輯...這篇文章是一個泛化。 – maurizio

+0

@alec_djinn我懷疑這是'super'調用和基類'__init__'的問題... – maurizio

回答

0

該問題是由my_problem.__init__(...)(即Child類)和base.__init__(即父類)的輸入參數之間的不匹配造成的。如果沒有提供這些參數的默認值,那麼__init__的繼承由super(my_problem,self)base產生衝突。在實踐中,修正後加工的版本是:

import PyGMO as pygmo 
class my_problem(pygmo.base): 
    def __init__(self,model='ei',config='conf1',pars=[1]*20): 
     # Does some parameter definition according to input arguments model, config etc... 
    ... 

    self.__dim = 3 
    ... 

    # Invoke base class as required by PyGMO 
    super(my_problem,self).__init__(self.__dim) 

    def _objfun_impl(self,x): 
     ... 
     f = ... # Cost function to optimize 
     return (f,) 

# Main 
... 

這是不可能的,而不是來傳遞範圍內對**kwargs子類作爲base是硬編碼的,應相應變更爲this post