Почему ошибка индексации возвращается в Python GEKKO

Я хочу преобразовать код LINGO в код Python GEKKO. Вот Lingo-код, результаты lingo и коды gekko. Я не могу написать второе и третье ограничения. Он возвращает ошибку индексации, но я не понимаю почему? Кто-нибудь может помочь? (Это проблема раскраски графа)

from gekko import GEKKO    
import numpy as np
m = GEKKO(remote=False)
# x = m.Array(m.Var,(7,5),lb=0,ub=1,integer=True)
x = m.Array(m.Var,(6,6),lb=0,ub=1,integer=True)
y= np.array([1, 2, 3, 4, 5, 6])
country=6
arcs=np.array([[1,3],
[5,4],
[3,6],
[2,4],
[2,5],
[2,6],
[4,5],
[4,6]])

for i in range(6):
    m.Minimize(y)


for i in range(6):
    # for j in range(2):
        # m.Equation(m.sum(x[i,j])==1)
        m.Equation(m.sum(x[i,:])==1) 


for k in range (6):
     for i in range(8):
            m.Equation(x[arcs[i,1],k]+x[arcs[i,2],k]<=1)        
             # m.Equation(x[arcs[i,1],k]+x[arcs[i,2],k])<=1)      
             # m.Equation(m.sum(x[arcs[i,1],k],x[arcs[i,2],k]))<=1) 

Исправленная версия =

from gekko import GEKKO    
import numpy as np

m = GEKKO(remote=False)

x = m.Array(m.Var,(6,6),lb=0,ub=1,integer=True)
y = m.Array(m.Var,6,lb=0,ub=1,integer=True)
y= np.array([1, 2, 3, 4, 5, 6])
country=6
arcs=np.array([[1,3],
[1,4],
[3,4],
[3,4],
[4,5],
[2,6],
[4,5],
[4,6]])

for i in range(6):
    m.Minimize(y[i])

for i in range(6):
    m.Equation(m.sum(x[i,:])==1) 

for k in range (6):
     for i in range(8):
            m.Equation(x[arcs[i,0]-1,k-1]+x[arcs[i,1]-1,k-1]<=1)


for i in range(6): 
           m.Equation(m.sum(x[i,:]<=y[i])

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

теперь он дает недопустимую синтаксическую ошибку для параметров m.solve и m?


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


Ответы (1)


Пара вещей, которые вам нужно учитывать при использовании Python:

  • Списки и массивы имеют нулевой индекс, поэтому вам нужно сдвинуть их на -1 относительно языка LINDO / LINGO.
  • Целевая функция y - это список констант. Gekko выдает предупреждения о том, что в этом выражении нет переменных.

Вот исправленная версия вашего скрипта Python, которую вам, вероятно, нужно дополнить правильным объективным заявлением и любыми дополнительными уравнениями, которые необходимы.

from gekko import GEKKO    
import numpy as np
m = GEKKO(remote=False)
x = m.Array(m.Var,(6,6),lb=0,ub=1,integer=True)
y= np.array([1, 2, 3, 4, 5, 6])
country=6
arcs=np.array([[1,3],
[1,4],
[3,4],
[2,4],
[2,5],
[2,6],
[4,5],
[4,6]])

for i in range(6):
    m.Minimize(y[i])

for i in range(6):
    m.Equation(m.sum(x[i,:])==1) 

for k in range (6):
     for i in range(8):
            m.Equation(x[arcs[i,0]-1,k]\
                      +x[arcs[i,1]-1,k]<=1)

m.solve()

Ответ на изменение

В измененной версии отсутствует закрывающая скобка на m.sum(). Вот исправленная версия.

from gekko import GEKKO    
import numpy as np

m = GEKKO(remote=False)

x = m.Array(m.Var,(6,6),lb=0,ub=1,integer=True)
y = m.Array(m.Var,6,lb=0,ub=1,integer=True)
y= np.array([1, 2, 3, 4, 5, 6])
country=6
arcs=np.array([[1,3],[1,4],[3,4],[3,4],[4,5],[2,6],[4,5],[4,6]])

for i in range(6):
    m.Minimize(y[i])
for i in range(6):
    m.Equation(m.sum(x[i,:])==1) 
for k in range (6):
     for i in range(8):
            m.Equation(x[arcs[i,0]-1,k-1]+x[arcs[i,1]-1,k-1]<=1)

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

Дополнительные советы можно найти в устранении неполадок приложений gekko с помощью учебника 18.

person John Hedengren    schedule 21.05.2020
comment
но мы не использовали индекс 0 и -1 в предыдущих вопросах? - person Batuhan MERTAN; 21.05.2020
comment
также я пересмотрел код, но теперь он дает синтаксическую ошибку даже для m.solve () = - person Batuhan MERTAN; 21.05.2020
comment
В вашем исправленном коде отсутствует скобка: m.sum(x[i,:]. Это должно быть m.sum(x[i,:]). Появляется ли сообщение об ошибке, указывающее на синтаксическую ошибку? - person John Hedengren; 21.05.2020
comment
Я до сих пор не понимаю, почему мы не использовали -1 в моих предыдущих вопросах? - person Batuhan MERTAN; 21.05.2020
comment
Хороший вопрос. Это только -1 для arcs, потому что эта матрица записана с 1 индексом. Я написал x[arcs[i,0]-1,k-1], но должно было быть x[arcs[i,0]-1,k]. Я исправил это в своем ответе. - person John Hedengren; 22.05.2020