Julia 中针对网络优化问题的这个解决方案是否正确?

Is this solution in Julia for a network optimization problem correct?

出于教育目的,我需要在 Julia 中解决这个问题:

我正在使用 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")

我的代码returns:

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)

考虑问题陈述是否有意义? 正确吗?

提前致谢。

这是交通问题。我建议使用索引变量和约束。您使用 "scalar" 变量和约束。如果数据发生变化并且有更多的供应商或需求点,那么您建模的方式就需要更改模型。最好使用带有变量 x[i,j] 的索引模型。这样的模型不需要随着问题维度的变化而变化:同一个模型可以解决小数据集和大数据集。有关 Julia/JuMP 中使用索引变量的交通模型示例,请参阅:link

此外,具有许多变量和约束的标量模型非常难以理解和调试。索引模型更能揭示结构。写起来更紧凑,工作量更少。

强调这一点:我开发了很多优化模型,但我从来没有写过标量模型。