异常:@error:方程定义 壁虎优化中没有相等 (=) 或不等式 (>,<) 的方程



我正在研究一个成本最小化问题。我试了一次又一次,但我总是有这个错误:

";异常:@error:公式定义没有等式(=(或不等式(>,<(的等式(150555-x1(((1.5((((0.014428((正在停止"错误

这可能是方程式错误吗?我不太擅长盖科。我听说它给出了最优解。我该怎么修?谢谢

from gekko import GEKKO
import numpy as np
a1=np.array([ 93542, 128957, 150555, 162915, 138111, 167849,
101090, 169190, 127892, 162915, 138111, 167849,
101090, 169190, 127892 ])
a2=np.array([1394312, 1268702, 122504, 123269, 101303,  90893,
99909,  96047,  97409, 122504, 123269, 101303,  90893,
99909,  96047,  97409 ])
a3=np.array([133712, 121702, 126504, 22669, 10803,  90893,
99009,  91047,  97409,  122504, 123269, 101303,  90893,
99909,  96047,  97409])
a4=np.array([57428, 16631, 1567, 1264, 1462, 1434,
107626, 106313,  90475, 100726, 442378, 407667,
95518, 128901, 124170, 122504, 123269, 101303,  90893,
99909,  96047,  97409 ])
a5=np.array([148428, 166371, 132867, 510264, 145462, 648634,
107626, 195313,  90475, 105726, 122504, 123269, 101303,  90893,
99909,  96047,  97409])
#definition variable
sa1=-np.sort(-a1)
sa2=-np.sort(-a2)
sa3=-np.sort(-a3)
#max8.
a1max8=sa1[7]
a2max8=sa2[7]
a3max8=sa3[7]
#max and min definition
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)
a5max=np.min(a5)
# Initialize Model
m = GEKKO(remote=False)
#initialize variables
x,x1,x2,x3,x4 = [m.Var() for i in range(5)]
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.Equation(x1>=a1max8)
m.Equation(x2>=a2max8)
m.Equation(x3>=a3max8)
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)))))
m.options.IMODE = 3 
m.solve() 
print('Results')
print('x: ' + str(x.value))
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))
print('x5: ' + str(x5.value))

编辑并解决错误

我很感激你的帮助先生。。。我更新了模型,所以我的模型有点复杂。我再也不犯那个错误了。尽管我选择了最小化模型,但解决方案是上限值。我想知道我该如何解决这个问题。

from gekko import GEKKO
import numpy as np
a1=np.array([ 93542, 128957, 150555, 162915, 138111, 167849,
101090, 169190, 127892, 162915, 138111, 167849,
101090, 169190, 127892 ])
a2=np.array([1394312, 1268702, 122504, 123269, 101303,  90893,
99909,  96047,  97409, 122504, 123269, 101303,  90893,
99909,  96047,  97409 ])
a3=np.array([133712, 121702, 126504, 22669, 10803,  90893,
99009,  91047,  97409,  122504, 123269, 101303,  90893,
99909,  96047,  97409])
a4=np.array([57428, 16631, 1567, 1264, 1462, 1434,
107626, 106313,  90475, 100726, 442378, 407667,
95518, 128901, 124170, 122504, 123269, 101303,  90893,
99909,  96047,  97409 ])
a5=np.array([148428, 166371, 132867, 510264, 145462, 648634,
107626, 195313,  90475, 105726, 122504, 123269, 101303,  90893,
99909,  96047,  97409,50000])
#definition variable
sa1=-np.sort(-a1)
sa2=-np.sort(-a2)
sa3=-np.sort(-a3)
#max8.
a1max8=sa1[7]
a2max8=sa2[7]
a3max8=sa3[7]
#max and min definition
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)
a5max=np.min(a5)
# Initialize Model
m = GEKKO(remote=False)
#initialize variables
x,x1,x2,x3,x4,x5 = [m.Var() for i in range(6)]
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.Equation(x1>=a1max8)
m.Equation(x2>=a2max8)
m.Equation(x3>=a3max8)
m.Minimize((((((((x1-x)*1.3+x)*0.014428)+(sum(a1-x1))*1.5*0.014428)+
(((x2-x)*1.3+x)*0.014428)+((sum(a2-x2))*1.5*0.014428)+
(((x3-x)*1.3+x)*0.014428)+((sum(a3-x3))*1.5*0.014428)+
(((x4-x)*1.3+x)*0.014428)+((sum(a4-x4))*1.25*0.014428)+
(((x5-x)*1.3+x)*0.014428)+((sum(a5-x5))*1.1*0.014428)))))
m.solve() 
print('Results')
print('x: ' + str(x.value))
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))
print('x5: ' + str(x5.value))

这是的结果

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

问题出在目标函数中

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)))))

其中作为gekko变量的x1-x5的单个值与作为numpy数组的a1-a5的多个值之间存在大小不匹配。您可以通过切换到单个值a1[0]-a5[0]来修复此问题。

# for the first values of a1-a5 with a1[0]-a5[0]
m.Minimize((((((((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]的差值作为单独的值。

# for all values of a1-a5
y = [x1,x2,x3,x4,x5]
a = [a1,a2,a3,a4,a5]
for i in range(5):
for j in range(len(a1)):
m.Minimize((a[i][j]-y[i])*1.5*0.014428)

以下是包含两个选项的完整脚本:

from gekko import GEKKO
import numpy as np
a1=np.array([ 93542, 128957, 150555, 162915, 138111, 167849,
101090, 169190, 127892, 162915, 138111, 167849,
101090, 169190, 127892 ])
a2=np.array([1394312, 1268702, 122504, 123269, 101303,  90893,
99909,  96047,  97409, 122504, 123269, 101303,  90893,
99909,  96047,  97409 ])
a3=np.array([133712, 121702, 126504, 22669, 10803,  90893,
99009,  91047,  97409,  122504, 123269, 101303,  90893,
99909,  96047,  97409])
a4=np.array([57428, 16631, 1567, 1264, 1462, 1434,
107626, 106313,  90475, 100726, 442378, 407667,
95518, 128901, 124170, 122504, 123269, 101303,  90893,
99909,  96047,  97409 ])
a5=np.array([148428, 166371, 132867, 510264, 145462, 648634,
107626, 195313,  90475, 105726, 122504, 123269, 101303,  90893,
99909,  96047,  97409])
#definition variable
sa1=-np.sort(-a1)
sa2=-np.sort(-a2)
sa3=-np.sort(-a3)
#max8.
a1max8=sa1[7]
a2max8=sa2[7]
a3max8=sa3[7]
#max and min definition
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)
a5max=np.min(a5)
# Initialize Model
m = GEKKO(remote=False)
#initialize variables
x,x1,x2,x3,x4 = [m.Var() for i in range(5)]
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.Equation(x1>=a1max8)
m.Equation(x2>=a2max8)
m.Equation(x3>=a3max8)
# for the first values of a1-a5 with a1[0]-a5[0]
m.Minimize((((((((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)))))
# for all values of a1-a5
y = [x1,x2,x3,x4,x5]
a = [a1,a2,a3,a4,a5]
for i in range(5):
for j in range(len(a1)):
m.Minimize((a[i][j]-y[i])*1.5*0.014428)
m.options.IMODE = 3 
m.solve() 
print('Results')
print('x: ' + str(x.value))
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))
print('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)

CCD_ 13在多个数据集上使用相同的方程进行运算。我现在推荐其他选项,但如果您希望代码在大规模问题中更高效地运行,这是一个选项。

对编辑的响应

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

最新更新