Gekko Apopt решает, но не оптимизирует - PullRequest
0 голосов
/ 26 апреля 2020

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)

Так что решатель решает проблему, но не максимизирует макси ..

Есть идеи?

1 Ответ

2 голосов
/ 29 апреля 2020

Вам может потребоваться изменить настройки решателя APOPT, чтобы получить лучшее решение. Вот опции для APOPT , которые я рекомендую для вашей задачи.

m.solver_options = ['minlp_gap_tol 0.5',\
                    'minlp_maximum_iterations 10000',\
                    'minlp_max_iter_with_int_sol 10000']

С этими опциями проблема сходится за 952 итерации со следующим результатом:

--Integer Solution:  -3.10E+02 Lowest Leaf:  -4.80E+02 Gap:   4.30E-01
Iter:   952 I:  0 Tm:      0.01 NLPi:    2 Dpth:   40 Lvs:  498 Obj: -3.10E+02 Gap:  4.30E-01
 Successful solution

 ---------------------------------------------------
 Solver         :  APOPT (v1.0)
 Solution time  :    20.8784000000014      sec
 Objective      :   -310.000000000000     
 Successful solution
 ---------------------------------------------------

Truck 1 (size: 40):13(10), 17(20), 
Truck 2 (size: 40):3(40), 
Truck 3 (size: 40):5(10), 
Truck 4 (size: 40):26(40), 
Truck 5 (size: 40):10(10), 19(20), 
Truck 6 (size: 40):25(20), 
Truck 7 (size: 40):14(20), 24(10), 
Truck 8 (size: 40):20(10), 
Truck 9 (size: 40):6(20), 9(10), 
Truck 10 (size: 40):23(20), 
Truck 11 (size: 40):2(20), 
Truck 12 (size: 40):1(10), 7(20),

Даже с уменьшением допуска MINLP разрыв решателя продолжается 10 000 итераций, но не находит лучшего решения. Если это не оптимальное решение, вы можете попытаться дать ему больше итераций, чтобы найти лучшее решение, либо дать более начальное предположение.

...