у меня проблема с ограничениями с циклами в GEKKO

Я хочу изучить python и gekko, но у меня проблема. Я хочу снова написать этот код Matlab с помощью gekko для изучения 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. Возникла проблема с ограничениями, имеющими цикл.

Спасибо за помощь.


person Batuhan MERTAN    schedule 17.05.2020    source источник


Ответы (2)


Вот версия на 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]]]
person John Hedengren    schedule 18.05.2020

спасибо за помощь, начинаю изучать 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)
person Batuhan MERTAN    schedule 18.05.2020
comment
Отличный вопрос! Не могли бы вы опубликовать это как отдельный вопрос? - person John Hedengren; 19.05.2020
comment
Конечно. я спросил. - person Batuhan MERTAN; 19.05.2020
comment
Спасибо, что разместили здесь вопрос: stackoverflow.com/questions/ 61881241 / - person John Hedengren; 19.05.2020
comment
не могли бы вы забыть мой второй вопрос? Спасибо за помощь. - person Batuhan MERTAN; 19.05.2020
comment
Я не могу удалить этот ответ. Вам нужно будет выбрать опцию Удалить внизу, если вы хотите удалить его. - person John Hedengren; 19.05.2020