Pedro Delfino
Pedro Delfino

Reputation: 2711

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

I need to solve this problem in Julia for educational purposes:

enter image description here enter image description here

I am using Julia 1.1.0 and JuMP v0.19.0

I managed to code a solution. However, I am insecure about the final result. That's my code:

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")

My code 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

I saw these numbers and thought a little bit using pencil and paper. They seem to be reasonable. However, I am still insecure about the final result.

Actually, I am uncomfortable with the question itself. I read it multiple times to understand what was the goal.

My greatest concerns are about the variables definitions:

@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)

Does it make sense considering the problem statement? Is it correct?

Thanks in advance.

Upvotes: 0

Views: 504

Answers (1)

Erwin Kalvelagen
Erwin Kalvelagen

Reputation: 16782

This is a transportation problem. I would suggest to use indexed variables and constraints. You use "scalar" variables and constraints. If the data changes and there are more suppliers or demand points, the way you modeled this, you need to change the model. It is better to use an indexed model with variables x[i,j]. Such a model does not need to change when the dimension of the problem changes: the same model can solve small and large data sets. For an example of a transportation model in Julia/JuMP using indexed variables see: link.

Furthermore, a scalar model with many variables and constraints is just very difficult to understand and debug. An indexed model is much more structure-revealing. It is more compact and less work to write.

To emphasize this point: I develop a lot of optimization models, and I never, ever write scalar models.

Upvotes: 4

Related Questions