簡體   English   中英

我對 GEKKO 中的循環有問題限制

[英]i have problem constraints with loops in GEKKO

我想學習 python 和壁虎,但我有一個問題。 我想用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 的目標 function 值相同,但在第一行和第二行(1 和 2 列)之間拆分了 200。 這是因為這兩個的成本 (11) 是相同的,所以它是一個退化的解決方案,有許多可能的最佳答案。

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

感謝您的幫助,我開始學習 GEKKO。 現在,我正在解決一個要學習的背包問題,但這次我收到錯誤“int 'object is not subscriptable”。 你能看看這段代碼嗎? 問題的根源是什么 我應該如何定義 1.10 矩陣?

from gekko import GEKKO    
import numpy as np

m = GEKKO(remote=False)
x = m.Var((10),lb=0,ub=1,integer=True)
#x = m.Array(m.Var,(1,10),lb=0,ub=1,integer=True)
v=np.array([2, 2, 7, 8, 2, 1, 7, 9, 4, 10])
w=np.array([2, 2, 2, 2, 2, 1, 6, 7, 3, 3])
capacity=16

for j in range(10):
           m.Maximize(v[j]*x[j])

for i in range(10):
        m.Equation(m.sum(x[i]*w[i])<=capacity)

m.options.solver = 1
m.solve()
#print('Objective Function: ' + str(m.options.objfcnval))
print(x)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM