2016-11-11 51 views
1

可调用在Python我有一类类型错误:名单'对象不是在数学规划

class someClass: 
    def objFunction(self, weights): 
     return [self.obj1(weights), self.obj2(weights), self.obj3(weights)] 

    def asf(self, f): 

     def obj(x): 
      return np.max(np.array(f(x[0],x[1],x[2])))+0.00001*np.sum(f(x[0],x[1],x[2])) 

     res=minimize(obj, 
     [0.3,0.3,0.4], method='SLSQP' 
     ,jac=ad.gh(obj)[0],options = {'disp':True, 'ftol': 1e-20, 
            'maxiter': 1000}) 
     return res 

其中OBJ1,OBJ2和OBJ3一些目标函数优化的限定的funtion。我正在这种方法分别制作的对象:

newObj = SomeClass() 
newObj.objFunction(weights) 

这工作得很好,给预期的结果。但是当我在类中的另一个方法中使用相同的方法时,它会返回上述错误。这是我正在做的:

a = someClass() 
a.asf(a.objFunction(weights) 

它抛出这个:

Traceback (most recent call last): 
    File "D:/*******.py", line 332, in <module> 
    print(investment.asf(obj1(w),ref,ideal,nadir, rho)) 
    File "*******.py", line 313, in asf 
    ,options = {'disp':True, 'ftol': 1e-20, 'maxiter': 1000}) 
    File "C:\Users\*****\Downloads\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\lib\site-packages\scipy\optimize\_minimize.py", line 455, in minimize 
    constraints, callback=callback, **options) 
    File "C:\Users\*****\Downloads\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\lib\site-packages\scipy\optimize\slsqp.py", line 363, in _minimize_slsqp 
    fx = func(x) 
    File "C:\Users\*******\Downloads\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\lib\site-packages\scipy\optimize\optimize.py", line 289, in function_wrapper 
    return function(*(wrapper_args + args)) 
    File "D:********.py", line 305, in obj 
    return np.max(np.array(f(x[0], x[1], x[2], x[3])))+rho*np.sum(f(x[0], x[1], x[2], x[3])) 
TypeError: 'list' object is not callable 

我想我做了一些OOP(面向对象编程)错误的代码,因为我不擅长。对此有何建议?谢谢

+1

请提及整个堆栈跟踪。有了这个错误,我只能告诉你在你的代码 –

+0

什么地方叫'list(n)'而不是'list [n]'什么是'ad.gh'? – kilojoules

回答

1

a.objFunction(weights)返回list,这是从定义中明确。

a.asf预计称为f一个参数,它的定义被使用,如:

f(x[0],x[1],x[2]) 

所以你给a.asf列表,并试图把它像一个功能。

相关问题