python - 我在 GEKKO 中遇到循环约束问题

标签 python gekko

我想学习 python 和 gekko,但我有一个问题。我想用gekko再次编写这个matlab代码,以学习gekko。这是运行良好的 matlab 代码:

%transpporatation vizeden sonra slaytı sf7.
clear
clc
adilprob = optimproblem;
xdeg = optimvar('xdeg',3,3,'LowerBound',0);
%alloys = optimvar('alloys',3,'LowerBound',0);
cost=[7 9 11;
    7 11 11;
    4 5 12;];

spp=[300 350 400];
dmx=[100 100 200];

%cosst= xdeg*cost;
expr=optimexpr;% optimexpr yerine = optimexpr yapsakta calısıyor.

for i=1:3
    for j= 1:3
        expr=expr+cost(i,j)*xdeg(i,j);
    end
end

for i=1:3
    const1(i)=sum(xdeg(i,:)) ;
end

for j=1:3
    const2(j)=sum(xdeg(:,j)) ==dmx(j);
end

adilprob.Constraints.con1= const1(i)<=spp(i);
adilprob.Constraints.con2= const2;
%diqqat
adilprob.Objective = expr;
[sol,fval] = solve(adilprob)

这是我的 gekko 代码,它不起作用

from gekko import GEKKO    
import numpy as np

m = GEKKO()
x = m.Array(m.Var,(4,4),lb=0)
const1=np.empty([2,0])
const2=np.empty([2,0])
expr=np.empty([3,3])
cost=([[7 ,9, 11],
    [7 ,11, 11],
    [4 ,5 ,12]])
spp=[300 ,350 ,400]
dmx=[100 ,100 ,200]
expr=[]
for i in range(2):
     for j in range(2):
           m.Obj(expr+cost[i][j]*x[i][j])

for k in range(2):
    const1[k]=(sum(x[k][:])) 
for m in range(2):    
    m.Equation(const1[m]<=spp[m])
for h in range(2):
    const2[h]=(sum(x[h][:]))

for y in range(2):    
    m.Equation(const2[y]==dmx[y]) 
m.solve()
print(x)

我正在使用 spyder 运行代码。具有循环的约束存在问题。

感谢您的帮助。

最佳答案

这是 Python gekko 中的一个版本,它简化了问题陈述和解决方案。

from gekko import GEKKO    
import numpy as np

m = GEKKO(remote=False)
x = m.Array(m.Var,(3,3),lb=0)
cost=np.array([[7 ,9, 11],
               [7 ,11, 11],
               [4 ,5 ,12]])
spp=[300 ,350 ,400]
dmx=[100 ,100 ,200]

for i in range(3):
     for j in range(3):
           m.Minimize(cost[i,j]*x[i,j])

for i in range(3):
    m.Equation(m.sum(x[i,:])<=spp[i])
for j in range(3):
    m.Equation(m.sum(x[:,j])==dmx[j]) 
m.options.solver = 1
m.solve()
print('Objective Function: ' + str(m.options.objfcnval))
print(x)

一些提示:

  • 无需将所有客观术语添加到一个列表中。您可以多次定义 m.Obj()m.Minimize(),gekko 将它们相加以给出最终的目标值。
  • 约束不需要在列表中。如果列表中有方程式,请使用 m.Equations()

这是 Python 中的解决方案,其目标函数值与 MATLAB 相同,但将 200 拆分为第一行和第二行(1 和 2)以及第三列。这是因为这两者的成本 (11) 相同,因此它是一个具有许多可能最优答案的退化解。

Objective Function: 3100.0
[[[0.0] [0.0] [54.833333333]]
 [[0.0] [0.0] [145.16666667]]
 [[100.0] [100.0] [0.0]]]

关于python - 我在 GEKKO 中遇到循环约束问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61858279/

相关文章:

python - 如何计算 tensorflow 中张量 A 沿张量 B 指定的权重的轴的加权平均值?

python - 使用顺序求解器时,如何在 Python Gekko 中定义 Intermediate 的最大值和另一个值?

python - 用python求解线性规划

python - GEKKO 优化问题中的二元变量

python - 使用 python GEKKO 模拟向量 ODE

python - 编写不使用 100% CPU 的 tail -f python 脚本

Python:嵌套 for 循环中仅执行 1 个循环

python - AWS Glue ETL 作业缺少爬网程序可见的字段

python - 将整数列表拆分为 bin,保留索引

python - 使用 GEKKO 模拟具有巨大阵列的状态空间方程