Вызов решения Gekko дает TypeError: объект типа int не имеет len ()

Я пытаюсь решить задачу оптимального управления с помощью Gekko. Когда я пытаюсь позвонить m.solve(), он дает мне TypeError: object of type 'int' has no len(), подробности ниже. Я получаю эту ошибку независимо от выбора целевой функции; однако только похожая проблема, которую я обнаружил возникла проблема с недифференцируемыми ограничениями, и я уверен, что мои ограничения дифференцируемы. Есть ли еще одна причина, по которой я могу получить этот тип ошибки с Gekko?

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-25-9f7b73717b27> in <module>
      1 from gekko import GEKKO
----> 2 solve_system()

<ipython-input-24-f224d4cff3fc> in solve_system(theta, alpha, rho, chi, L_bar, n, w, delta_inc, xi, phi, tau, kappa, GAMMA, T, SIGMA, BETA, s_init, i_init, r_init)
    257     ##### solve model #####
    258     m.options.IMODE = 6
--> 259     m.solve()

~\Anaconda3\lib\site-packages\gekko\gekko.py in solve(self, disp, debug, GUI, **kwargs)
   1955         # Build the model
   1956         if self._model != 'provided': #no model was provided
-> 1957             self._build_model()
   1958         if timing == True:
   1959             print('build model', time.time() - t)

~\Anaconda3\lib\site-packages\gekko\gk_write_files.py in _build_model(self)
     54             model += '\t%s' % variable
     55             if not isinstance(variable.VALUE.value, (list,np.ndarray)):
---> 56                 if not (variable.VALUE==None):
     57                     i = 1
     58                     model += ' = %s' % variable.VALUE

~\Anaconda3\lib\site-packages\gekko\gk_operators.py in __len__(self)
     23         return self.name
     24     def __len__(self):
---> 25         return len(self.value)
     26     def __getitem__(self,key):
     27         return self.value[key]

~\Anaconda3\lib\site-packages\gekko\gk_operators.py in __len__(self)
    142 
    143     def __len__(self):
--> 144         return len(self.value)
    145 
    146     def __getitem__(self,key):

TypeError: object of type 'int' has no len()

Я вызываю внешнюю (но дифференцируемую) функцию в своих ограничениях. Однако его удаление и выполнение работы без функции не решило проблему. Я был бы очень признателен за любой вклад, который вы могли бы предложить. Спасибо!


person Nikhil    schedule 10.06.2020    source источник
comment
Не могли бы вы опубликовать код, который показывает проблему? Вот несколько советов по созданию минимального воспроизводимого примера проблемы: stackoverflow.com/help/minimal-reproducible-example   -  person John Hedengren    schedule 11.06.2020


Ответы (1)


Эта ошибка может быть связана с тем, что вы используете массив Numpy или список Python внутри выражения Gekko.

import numpy as np
x = np.array([0,1,2,3])  # numpy array
y = [2,3,4,5]            # python list

from gekko import GEKKO
m = GEKKO()
m.Minimize(x)            # error, use Gekko Param or Var
m.Equation(m.sum(x)==5)  # error, use Gekko Param or Var

Вы можете избежать этой ошибки, переключившись на параметр или переменную Gekko. Gekko может инициализироваться списком Python или массивом Numpy.

xg = m.Param(x)
yg = m.Var(y)

m.Minimize(xg)           
m.Equation(m.sum(yg)==5)
m.solve()
person John Hedengren    schedule 28.10.2020
comment
Именно в этом и заключалась проблема - я использовал массив Numpy вместо переменной Gekko. Большое спасибо! - person Nikhil; 17.02.2021