Calcoli scientifici con Julia/Minimizzazione costi

La minimizzazione dei costi è un classico esempio di programmazione lineare che nella sua forma standard si esprime in 3 parti:

  • Una funzione lineare da minimizzare:
  • Problema dei vincoli della seguente forma:
  • Variabili non negative

Il problema è di solito espresso in forma matriciale nel seguente modo:

Esempio di calcolo con Julia

modifica

Un'azienda per produrre sedie ha bisogno di 3 tipi di unità di legno x1, x2, x3 che costano rispettivamente 10€ ,20€ e 5€ . Le unità di tipo 1 e 2 devono essere più di 300, le unità di tipo 2 più di 100 e le unità di tipo 1 e 3 più di 300. Pertanto il modello da analizzare è il seguente : Innanzitutto occorre installare i pacchetti JuMP ed HiGHS.

Da REPL digitare:

using Pkg
Pkg.add("HiGHS")
using Pkg
Pkg.add("JuMP")

Da Jupyter in due celle di codice digitare :

] add HiGHS
] add JuMP

e poi cliccare su Run. Poi eseguire il codice per creare il modello di programmazione lineare:

using JuMP
using HiGHS
model = Model(HiGHS.Optimizer)
@variable(model, x1 >= 0)
@variable(model, x2 >= 0)
@variable(model, x3 >= 0)
@objective(model, Min, 10*x1 +20*x2+ 5*x3)
@constraint(model, c1, x1+x2>=300)
@constraint(model, c2, x2>=100)
@constraint(model, c3, x1+x3>=300)
print(model)
optimize!(model)
min 10𝑥1+20𝑥2+5𝑥3
Subject to
 𝑥1+𝑥2≥300
 𝑥2≥100
 𝑥1+𝑥3≥300
 𝑥1≥0
 𝑥2≥0
 𝑥3≥0
Running HiGHS 1.5.3 [date: 1970-01-01, git hash: 45a127b78]
Copyright (c) 2023 HiGHS under MIT licence terms
Presolving model
2 rows, 2 cols, 3 nonzeros
0 rows, 0 cols, 0 nonzeros
Presolve : Reductions: rows 0(-3); columns 0(-3); elements 0(-5) - Reduced to empty
Solving the original LP from the solution after postsolve
Model   status      : Optimal
Objective value     :  4.5000000000e+03
HiGHS run time      :          0.00


println("termination_status = ",termination_status(model))
println("primal_status = ",primal_status(model))
println("dual_status = ",dual_status(model))
println("objective_value = ",objective_value(model))
println("x1 = ",value(x1))
println("x2 = ",value(x2))
println("x3 = ",value(x3))
println("c1 = ",shadow_price(c1))
println("c2 = ",shadow_price(c2))
println("c3 = ",shadow_price(c3))
termination_status = OPTIMAL
primal_status = FEASIBLE_POINT
dual_status = FEASIBLE_POINT
objective_value = 4500.0
x1 = 200.0
x2 = 100.0
x3 = 100.0
c1 = -5.0
c2 = -15.0
c3 = -5.0

cioè l'azienda ha un costo minimo di 4500€, acquistando 200 unità di legno di tipo 1, 100 unità di legno di tipo 2 e 100 unità di legno di tipo 3 per produrre le sedie, soddisfacendo i vincoli indicati.