Optimization 异常:@错误:方程定义方程在gekko优化中没有等式(=)或不等式(>;,<;)

Optimization 异常:@错误:方程定义方程在gekko优化中没有等式(=)或不等式(>;,<;),optimization,nonlinear-optimization,gekko,Optimization,Nonlinear Optimization,Gekko,我正在研究一个成本最小化问题。我尝试了一次又一次,但总是出现以下错误: “异常:@错误:方程定义 没有等式(=)或不等式(>,的方程问题在目标函数中 m.Obj(((((()(((()x1-x)*1.3+x)*0.014428)+(a1-x1)*1.5*0.014428)+\ (((x2-x)*1.3+x)*0.014428)+((a2-x2)*1.5*0.014428)+\ ((x3-x)*1.3+x)*0.014428)+(a3-x3)*1.5*0.014428)+\ ((x4-x)*1.3

我正在研究一个成本最小化问题。我尝试了一次又一次,但总是出现以下错误:

“异常:@错误:方程定义
没有等式(=)或不等式(>,的方程问题在目标函数中

m.Obj(((((()(((()x1-x)*1.3+x)*0.014428)+(a1-x1)*1.5*0.014428)+\
(((x2-x)*1.3+x)*0.014428)+((a2-x2)*1.5*0.014428)+\
((x3-x)*1.3+x)*0.014428)+(a3-x3)*1.5*0.014428)+\
((x4-x)*1.3+x)*0.014428)+(a4-x4)*1.5*0.014428)+\
(((x5-x)*1.3+x)*0.014428)+((a5-x5)*1.5*0.014428()())))
x1
-
x5
作为gekko变量的单个值与
a1
-
a5
作为numpy数组的多个值之间存在大小不匹配时。您可以通过切换到
a1[0]
-
a5[0]
的单个值来解决此问题

#对于a1-a5和a1[0]-a5[0]的第一个值
m、 最小化(((x1-x)*1.3+x)*0.014428)+(a1[0]-x1)*1.5*0.014428)+\
((x2-x)*1.3+x)*0.014428)+(a2[0]-x2)*1.5*0.014428)+\
(((x3-x)*1.3+x)*0.014428)+((a3[0]-x3)*1.5*0.014428)+\
((x4-x)*1.3+x)*0.014428)+(a4[0]-x4)*1.5*0.014428)+\
(((x5-x)*1.3+x)*0.014428)+((a5[0]-x5)*1.5*0.014428(‘))))
您还可以在循环中使用多个最小化函数,这些函数与作为单个值的
a1[i]
-
a5[i]
不同

#适用于a1-a5的所有值
y=[x1,x2,x3,x4,x5]
a=[a1、a2、a3、a4、a5]
对于范围(5)中的i:
对于范围内的j(len(a1)):
m、 最小化((a[i][j]-y[i])*1.5*0.014428)
以下是包含两个选项的完整脚本:

从gekko导入gekko
将numpy作为np导入
a1=np.数组([9354212895715055162915138111167849,
101090, 169190, 127892, 162915, 138111, 167849,
101090, 169190, 127892 ])
a2=np.数组([139431126870212250412326910130390893,
99909,  96047,  97409, 122504, 123269, 101303,  90893,
99909,  96047,  97409 ])
a3=np.数组([13371121702126504226691080390893,
99009,  91047,  97409,  122504, 123269, 101303,  90893,
99909,  96047,  97409])
a4=np.阵列([57428、16631、1567、1264、1462、1434、,
107626, 106313,  90475, 100726, 442378, 407667,
95518, 128901, 124170, 122504, 123269, 101303,  90893,
99909,  96047,  97409 ])
a5=np.阵列([148428、166371、132867、510264、145462、648634、,
107626, 195313,  90475, 105726, 122504, 123269, 101303,  90893,
99909,  96047,  97409])
#定义变量
sa1=-np.sort(-a1)
sa2=-np.sort(-a2)
sa3=-np.sort(-a3)
#马克斯8。
a1max8=sa1[7]
a2max8=sa2[7]
a3max8=sa3[7]
#最大和最小定义
a1min=np.min(a1)
a1max=np.max(a1)
a2min=np.min(a2)
a2max=np.max(a2)
a3min=np.min(a3)
a3max=np.max(a3)
a4min=np.min(a4)
a4max=np.max(a4)
a5min=np.min(a5)
a5最大值=np最小值(a5)
#初始化模型
m=GEKKO(远程=False)
#初始化变量
x、 x1,x2,x3,x4=[m.Var()表示范围(5)中的i]
x=m.Var(lb=2000,ub=7000,name='x')
x1=m.Var(lb=a1min,ub=a1max,name='x1')
x2=m.Var(lb=a2min,ub=a2max,name='x2')
x3=m.Var(lb=a3min,ub=a3max,name='x3')
x4=m.Var(lb=a4min,ub=a4max,name='x4')
x5=m.Var(lb=a5min,ub=a5max,name='x5')
m、 方程(x1>=a1max8)
m、 方程(x2>=a2max8)
m、 方程(x3>=a3max8)
#对于a1-a5和a1[0]-a5[0]的第一个值
m、 最小化(((x1-x)*1.3+x)*0.014428)+(a1[0]-x1)*1.5*0.014428)+\
((x2-x)*1.3+x)*0.014428)+(a2[0]-x2)*1.5*0.014428)+\
(((x3-x)*1.3+x)*0.014428)+((a3[0]-x3)*1.5*0.014428)+\
((x4-x)*1.3+x)*0.014428)+(a4[0]-x4)*1.5*0.014428)+\
(((x5-x)*1.3+x)*0.014428)+((a5[0]-x5)*1.5*0.014428(‘))))
#对于a1-a5的所有值
y=[x1,x2,x3,x4,x5]
a=[a1、a2、a3、a4、a5]
对于范围(5)中的i:
对于范围内的j(len(a1)):
m、 最小化((a[i][j]-y[i])*1.5*0.014428)
m、 options.IMODE=3
m、 解决()
打印('结果')
打印('x:'+str(x.value))
打印('x1:'+str(x1.value))
打印('x2:'+str(x2.值))
打印('x3:'+str(x3.value))
打印('x4:'+str(x4.value))
打印('x5:'+str(x5.value))
另一个选项是切换到
IMODE=2
并将
a1
-
a5
声明为
m.Param()
声明为:

m.options.IMODE=2
a1p=m.Param(a1)
a2p=m.Param(a2)
a3p=m.Param(a3)
a4p=m.Param(a4)
a5p=m.Param(a5)
IMODE=2
在多个数据集上使用相同的方程式进行操作。我现在推荐其他选项,但如果您希望您的代码能够更高效地处理大规模问题,这是一个选项

对编辑的响应

结果是正确的。您提出的问题是一个线性规划问题,因此解决方案保证是最优的。当满足时,解算器会报告一个成功的解决方案。变量达到其上限的原因是您有22个
-x1
(以及其他变量)。如果您试图执行回归以适应
a1
值,则可能需要修改目标函数,例如
sum((a1-x1)**2)

Results
x: [7000.0]
x1: [169190.0]
x2: [1394312.0]
x3: [133712.0]
x4: [1264.0000155]
x5: [50000.0]