Python 使用MIP库声明目标函数时获取断言错误

Python 使用MIP库声明目标函数时获取断言错误,python,pandas,optimization,mixed-integer-programming,Python,Pandas,Optimization,Mixed Integer Programming,我正在使用MIP优化库来解决一个问题,但是我不能正确地声明目标函数。我在使用Gurobi解决问题之前编写了代码,我只是想把代码翻译过来。我在用正确的语法重写目标函数时遇到困难,非常感谢您的帮助,谢谢 from mip import * from mip import xsum, minimize import pandas as pd import numpy as np import scipy as sp m = Model() m = Model(sense=MINIMIZE, solve

我正在使用MIP优化库来解决一个问题,但是我不能正确地声明目标函数。我在使用Gurobi解决问题之前编写了代码,我只是想把代码翻译过来。我在用正确的语法重写目标函数时遇到困难,非常感谢您的帮助,谢谢

from mip import *
from mip import xsum, minimize
import pandas as pd
import numpy as np
import scipy as sp
m = Model()
m = Model(sense=MINIMIZE, solver_name=GRB)  
n = 80
# #x is charging, discharging variable
x = [m.add_var(name='x', var_type = INTEGER, lb=-1.5, ub = 1.5) for i in range(n)]
# #Y is SOC variable
Y = [m.add_var(name='Y', var_type = CONTINUOUS, lb=0, ub = 100) for i in range(n+1)]
# # Add constraint: SOC[start]=50, initial SOC
m += Y[0] == 50 , 'c1'
# #Final targeted SOC
m += Y[n] >= 65 , 'c2'
# # This is the constrain defines relationship between SOCs and charging steps. 3.75% SOC increase decrease are for 15min steps 
m += (Y[i+1]-Y[i] == 3.75*x[i] for i in range(n)), 'c0'
step=80
f1load=[44,48,53,28,32,36,41,48,38,32,38,34,44,36,41,48,38,32,44,48,53,28,32,36,41,48,38,32,38,34,44,36,41,48,38,32,44,48,53,28,32,36,41,48,38,32,38,34,44,36,41,48,38,32,44,48,53,28,32,36,41,48,38,32,38,34,44,36,41,48,38,32,44,48,53,28,32,36,41,48,38,32,38,34,44,36,41,48]
fload=f1load[0:step+1]
i1load=[40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40]
iload=i1load[0:step+1]
(iload)-np.array(fload)
load1
#This command converts array to list so we can use it as a list in the rest of the code
load2=load1.tolist()
load=load2
# #Objective function. 6 comes from capacity of inverter. The line below is the Gurobi version of the obj function, that works. 
# obj1=sum(((load[i+1]-(6*x[i]))*(load[i+1]-(6*x[i])) for i in range (n)))
m.objective = xsum((load[i+1]-(6*x[i])) * (load[i+1]-(6*x[i])) for i in range (n))
错误的完整堆栈跟踪:

---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-31-ca98b7470c5c> in <module>
      2 # obj1=sum(((load[i+1]-(6*x[i]))*(load[i+1]-(6*x[i])) for i in range (n)))
      3 # m.objective = minimize(xsum(c[i]*x[i] for i in range(n)))
----> 4 m.objective = minimize(xsum((load[i+1]-(6*x[i])) * (load[i+1]-(6*x[i])) for i in range (n)))
      5 # m.objective = minimize(xsum(((load[i+1]-(6*x[i]))*(load[i+1]-(6*x[i])) for i in range (n))))

~/opt/anaconda3/lib/python3.7/site-packages/mip/model.py in xsum(terms)
   1321     """
   1322     result = LinExpr()
-> 1323     for term in terms:
   1324         result.add_term(term)
   1325     return result

<ipython-input-31-ca98b7470c5c> in <genexpr>(.0)
      2 # obj1=sum(((load[i+1]-(6*x[i]))*(load[i+1]-(6*x[i])) for i in range (n)))
      3 # m.objective = minimize(xsum(c[i]*x[i] for i in range(n)))
----> 4 m.objective = minimize(xsum((load[i+1]-(6*x[i])) * (load[i+1]-(6*x[i])) for i in range (n)))
      5 # m.objective = minimize(xsum(((load[i+1]-(6*x[i]))*(load[i+1]-(6*x[i])) for i in range (n))))

~/opt/anaconda3/lib/python3.7/site-packages/mip/entities.py in __mul__(self, other)
    137 
    138     def __mul__(self: "LinExpr", other: Union[int, float]) -> "LinExpr":
--> 139         assert isinstance(other, (int, float))
    140         result = self.copy()
    141         result.__const *= other

AssertionError:
---------------------------------------------------------------------------
AssertionError回溯(上次最近的调用)
在里面
2#obj1=范围(n)内i的总和((加载[i+1]-(6*x[i])*(加载[i+1]-(6*x[i]))
3#m.objective=最小化(范围(n)内i的xsum(c[i]*x[i]))
---->4 m.目标=最小化(范围(n)内i的xsum((加载[i+1]-(6*x[i]))*(加载[i+1]-(6*x[i]))
5#m.目标=最小化(范围(n)内i的xsum((加载[i+1]-(6*x[i])*(加载[i+1]-(6*x[i]))
xsum中的~/opt/anaconda3/lib/python3.7/site-packages/mip/model.py(术语)
1321     """
1322结果=LinExpr()
->1323关于期限:
1324结果。添加术语(术语)
返回结果
英寸(.0)
2#obj1=范围(n)内i的总和((加载[i+1]-(6*x[i])*(加载[i+1]-(6*x[i]))
3#m.objective=最小化(范围(n)内i的xsum(c[i]*x[i]))
---->4 m.目标=最小化(范围(n)内i的xsum((加载[i+1]-(6*x[i]))*(加载[i+1]-(6*x[i]))
5#m.目标=最小化(范围(n)内i的xsum((加载[i+1]-(6*x[i])*(加载[i+1]-(6*x[i]))
~/opt/anaconda3/lib/python3.7/site-packages/mip/entities.py in\uuuuu mul\uuuu(self,other)
137
138 def uuu mul(self:“LinExpr”,其他:联合[int,float])->“LinExpr”:
-->139断言isinstance(其他(整数、浮点))
140结果=self.copy()
141结果.\u常数*=其他
断言者错误:

正如@sascha提到的,MIP库只支持混合整数“线性”问题,但您的目标是非线性的。为了使其运行,您可以使目标函数线性化。此外,您可以尝试Pyomo(免费)、AMPL(商业)、minizing(免费)、GAMS(商业)或Gurobi等的Python接口来建模和解决非线性问题。请告诉我们在您的案例中做了哪些工作。

正如@sascha提到的,MIP库只支持混合整数“线性”问题,但您的目标是非线性的。只需使其运行,您就可以使目标函数线性化。此外,您可以尝试Pyomo(免费)、AMPL(商业版)、Minizing(免费版)、GAMS(商业版)或Gurobi的Python接口等来建模和解决非线性问题。请告诉我们在您的案例中什么起了作用。

从未使用过该库(除了运行一个示例之外),而是
(加载[i+1]-(6*x[i])*(加载[i+1]-(6*x[i])
显然是一些非平凡对象的乘法,其中该库不支持重载运算符。它基本上是
expr*expr
,可以快速深入到计算机代数(尽管这里仅限于仿射表达式)。1)您可能需要手动将其相乘以形成平面表达式。2)这看起来是二次的,我认为这个库不支持非线性问题。Gurobi可能会将其作为MIQP/MISOCP来解决,但这个库可能被称为MIP,因为它从未使用过该库(除了运行示例之外),而是
(load[i+1]-(6*x[i])*(load[i+1]-(6*x[i])
显然是一些非平凡对象的乘法,其中该库不支持重载运算符。它基本上是
expr*expr
,可以快速深入到计算机代数(尽管这里仅限于仿射表达式)。1)您可能需要手动将其相乘以形成平面表达式。2)这看起来是二次的,我认为此库不支持非线性问题。Gurobi可能会将其作为MIQP/MISOCP来解决,但此库可能被称为MIP是有原因的