Правильно ли это решение в Юлии для проблемы оптимизации сети? - PullRequest
0 голосов
/ 06 апреля 2019

Мне нужно решить эту проблему в Юлии в образовательных целях:

enter image description here enter image description here

Я использую Julia 1.1.0 и JuMP v0.19.0

Мне удалось написать решение.Тем не менее, я не уверен в конечном результате.Это мой код:

using JuMP
using GLPK
using Cbc # Open source solver. Must support integer programming.

nm = Model(with_optimizer(GLPK.Optimizer))

@variable(nm, A_b1>=0,Int)
@variable(nm, A_b2>=0, Int)
@variable(nm, A_b3>=0, Int)
@variable(nm, B_b1>=0, Int)
@variable(nm, B_b2>=0, Int)
@variable(nm, B_b3>=0, Int)
@variable(nm, C_b1>=0, Int)
@variable(nm, C_b2>=0, Int)
@variable(nm, C_b3>=0, Int)
@variable(nm, D_b1>=0, Int)
@variable(nm, D_b2>=0, Int)
@variable(nm, D_b3>=0, Int)


@objective(nm, Min, (A_b1*7) + (A_b2*1) + (A_b3*9) +
                     (B_b1*11) + (B_b2*6) + (B_b3*15) +
                     (C_b1*3) + (C_b2*0) + (C_b3*8) +
                     (D_b1*2) + (D_b2*1) + (D_b3*5))

# Max vol capacity 3.6 cubic meters
@constraint(nm, A_b1 + B_b1 + C_b1 + D_b1 <=6)
@constraint(nm, A_b2 + B_b2 + C_b2+ D_b2 <=1)
@constraint(nm, A_b3 + B_b3 + C_b3+ D_b3 <=10)

@constraint(nm, A_b1 + A_b2 + A_b3==2)
@constraint(nm, B_b1 + B_b2 + B_b3==3)
@constraint(nm, C_b1 + C_b2 + C_b3==5)
@constraint(nm, D_b1 + D_b2 + D_b3==7)

# Solve
optimize!(nm)

println("A_b1 n. of cars going to A via branch 1 -> ",value(A_b1))
println("B_b1 -- -> ",value(B_b1))
println("C_b1 -- -> ",value(C_b1))
println("D_b1 -- -> ",value(D_b1))
println("A_b2 -- -> ",value(A_b2))
println("B_b2 -- -> ",value(B_b2))
println("C_b2 -- -> ",value(C_b2))
println("D_b2 -- -> ",value(D_b2))
println("A_b3 -- -> ",value(A_b3))
println("B_b3 -- -> ",value(B_b3))
println("C_b3 -- -> ",value(C_b3))
println("D_b3 -- -> ",value(D_b3))

println(" ")

println("Total cars going to A: ",value(A_b3)+value(A_b1)+value(A_b2))
println("Total cars going to B: ",value(B_b3)+value(B_b1)+value(B_b2))
println("Total cars going to C: ",value(C_b3)+value(C_b1)+value(C_b2))
println("Total cars going to D: ",value(D_b3)+value(D_b1)+value(D_b2))

println(" ")

println("Total cars using branch 1: ",value(A_b1)+value(B_b1)+value(C_b1) + value(D_b1))
println("Total cars using branch 2: ",value(A_b2)+value(B_b2)+value(C_b2) + value(D_b2))
println("Total cars using branch 3: ",value(A_b3)+value(B_b3)+value(C_b3) + value(D_b3))

println(" ")

println("Total cost: ", objective_value(nm), " american dollars")

Мой код возвращает:

Total cars going to A: 2.0
Total cars going to B: 3.0
Total cars going to C: 5.0
Total cars going to D: 7.0

Total cars using branch 1: 6.0
Total cars using branch 2: 1.0
Total cars using branch 3: 10.0

Total cost: 100.0 american dollars

Я видел эти цифры и немного подумал, используя карандаш и бумагу.Они кажутся разумными.Тем не менее, я все еще не уверен насчет окончательного результата.

На самом деле, мне не нравится сам вопрос.Я прочитал его несколько раз, чтобы понять, в чем заключалась цель.

Мои самые большие опасения связаны с определениями переменных:

@variable(nm, A_b1>=0,Int)
@variable(nm, A_b2>=0, Int)
@variable(nm, A_b3>=0, Int)
@variable(nm, B_b1>=0, Int)
@variable(nm, B_b2>=0, Int)
@variable(nm, B_b3>=0, Int)
@variable(nm, C_b1>=0, Int)
@variable(nm, C_b2>=0, Int)
@variable(nm, C_b3>=0, Int)
@variable(nm, D_b1>=0, Int)
@variable(nm, D_b2>=0, Int)
@variable(nm, D_b3>=0, Int)

Имеет ли смысл рассмотрение проблемы?Это правильно?

Заранее спасибо.

1 Ответ

3 голосов
/ 06 апреля 2019

Это проблема транспортировки. Я бы предложил использовать индексированные переменные и ограничения. Вы используете «скалярные» переменные и ограничения. Если данные изменяются и появляется больше поставщиков или точек спроса, то, как вы смоделировали это, вам нужно изменить модель. Лучше использовать индексированную модель с переменными x [i, j]. Такая модель не нуждается в изменении, когда меняется размер проблемы: та же модель может решать небольшие и большие наборы данных. Пример транспортной модели в Julia / JuMP с использованием индексированных переменных см .: ссылка .

Кроме того, скалярная модель с множеством переменных и ограничений просто очень сложна для понимания и отладки. Индексированная модель намного более структурирована. Он более компактен и менее труден для написания.

Чтобы подчеркнуть этот момент: я разрабатываю много моделей оптимизации и никогда не пишу скалярные модели.

...