【问题标题】:Is this solution in Julia for a network optimization problem correct?Julia 中针对网络优化问题的这个解决方案是否正确?
【发布时间】:2019-04-06 00:01:51
【问题描述】:

出于教育目的,我需要在 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")

我的代码返回:

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)

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

提前致谢。

【问题讨论】:

    标签: julia mathematical-optimization linear-programming julia-jump


    【解决方案1】:

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

    此外,具有许多变量和约束的标量模型很难理解和调试。索引模型更具结构性。它更紧凑,编写工作更少。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 2013-02-22
      • 2022-10-17
      相关资源
      最近更新 更多