Apopt Gekko решает, но не оптимизирует двоичный список с ограничениями.
Кто-нибудь когда-нибудь в него попадал?
Я получил код, который принимает 2 таблицы из Excel и пытается оптимизировать контейнеры поверх грузовики с несколькими ограничениями. Кажется, что он прекрасно работает с ограничениями, но я очень легко вижу, что он не оптимизирует загрузку контейнеров в грузовиках ...
есть идеи?
import numpy as np
from gekko import GEKKO
containers = [[1, 10, 0, 0, 0, 0, 1], [2, 20, 1, 0, 0, 0, 1], [3, 40, 0, 1,
0, 0, 2], [4, 40, 0, 0, 0, 0, 3], [5, 10, 1, 0, 0, 0, 4], [6, 20, 0, 0, 0, 0,
1], [7, 20, 0, 0, 0, 0, 1], [8, 40, 0, 0, 0, 0, 1], [9, 10, 1, 0, 0, 0, 1],
[10, 10, 0, 0, 0, 0, 1], [11, 40, 0, 0, 0, 0, 1], [12, 40, 1, 0, 0, 0, 1],
[13, 10, 0, 0, 0, 0, 1], [14, 20, 1, 0, 0, 0, 1], [15, 40, 1, 0, 0, 0, 1],
[16, 40, 0, 0, 0, 0, 1], [17, 20, 0, 1, 0, 0, 1], [18, 10, 0, 0, 0, 0, 1],
[19, 20, 0, 0, 0, 0, 1], [20, 10, 0, 0, 0, 0, 1], [21, 40, 0, 0, 0, 0, 1],
[22, 40, 0, 0, 0, 0, 1], [23, 20, 0, 0, 0, 0, 1], [24, 10, 0, 0, 0, 0, 1],
[25, 20, 0, 0, 0, 0, 1], [26, 40, 0, 0, 0, 0, 1], [27, 40, 0, 0, 0, 0, 1]]
trucks = [[11, 'D2', 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [22, 'D3',
40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [33, 'E1', 40, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0], [44, 'D4', 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[45, 'D5', 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [46, 'D6', 40, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [47, 'D7', 40, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0], [48, 'D8', 40, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [49,
'D9', 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [50, 'D10', 40, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0], [51, 'D11', 40, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0], [52, 'D12', 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
m=GEKKO()
m.options.SOLVER = 1
match_matrix = []
#Creating the match matrix vars
for i in range(len(trucks)):
match_matrix.append([])
for j in range(len(containers)):
match_matrix[i].append(m.Var(integer=True,lb=0,ub=1))
#Constraint - total loading size not larger than truck size
for i in range(len(trucks)):
load_size = 0
truck_size = trucks[i][2]
for j in range(len(containers)):
container_size = containers[j][1]
load_size = load_size + match_matrix[i][j] * container_size
m.Equation(load_size<=truck_size)
#Constraint - each container will be loaded once (maximum)
for j in range(len(containers)):
number_of_loads = 0
for i in range(len(trucks)):
number_of_loads += match_matrix[i][j]
m.Equation(number_of_loads<=1)
#Creating the objective
total_containers_size_on_truck = 0
for i in range(len(trucks)):
for j in range(len(containers)):
container_size = containers[j][1]
total_containers_size_on_truck += match_matrix[i][j] *
container_size
#solving
m.Obj(-total_containers_size_on_truck)
m.options.SOLVER = 1
m.solve()
#Printing
for i in range(len(trucks)):
output = "Truck %d (size: %d):" % (i+1, trucks[i][2])
for j in range(len(containers)):
if match_matrix[i][j].value[0] == 1:
output += "%d(%d), " % (j+1, containers[j][1])
print (output)
Так что решатель решает проблему, но не максимизирует макси ..
Есть идеи?