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
modificaUn'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.