Calcoli scientifici con Julia/Massimizzazione profitto
La massimizzazione del profitto è un classico esempio di programmazione lineare che nella sua forma standard si esprime in 3 parti:
- Una funzione lineare da massimizzare:
- 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 | modifica sorgente]Un'azienda produce tavoli e mobiletti che intende vendere al prezzo rispettivamente di 400€ e 200€. Per produrli occorrono 6 unità di legno, 2 ore/lavoratore e 100 minuti di tempo-macchina per i tavoli e 10 unità di legno, 4 ore/lavoratore e 40 minuti di tempo-macchina per i mobiletti. A disposizione l'azienda possiede giornalmente 4000 unità di legno, 250 lavoratori per 8 ore al giorno cioè 2000 ore/lavoratore e 50 macchine che funzionano per 16 ore giornaliere cioè 48000 ore/macchina.
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, x >= 0)
@variable(model, y >= 0)
@objective(model, Max, 200y + 400x)
@constraint(model, c1, 10y + 6x <= 4000)
@constraint(model, c2, 4y + 2x <= 2000)
@constraint(model, c3, 40y + 100x <= 48000)
print(model)
optimize!(model)
max Subject to 200𝑦+400𝑥 6𝑥+10𝑦≤4000 2𝑥+4𝑦≤2000 100𝑥+40𝑦≤48000 𝑥≥0 𝑦≥0
Running HiGHS 1.5.3 [date: 1970-01-01, git hash: 45a127b78] Copyright (c) 2023 HiGHS under MIT licence terms Presolving model 3 rows, 2 cols, 6 nonzeros 3 rows, 2 cols, 6 nonzeros Presolve : Reductions: rows 3(-0); columns 2(-0); elements 6(-0) - Not reduced Problem not reduced by presolve: solving the LP Using EKK dual simplex solver - serial Iteration Objective Infeasibilities num(sum) 0 -3.7499962007e+01 Ph1: 3(5.6875); Du: 2(37.5) 0s 2 1.9789473684e+05 Pr: 0(0) 0s Model status : Optimal Simplex iterations: 2 Objective value : 1.9789473684e+05 HiGHS run time : 0.03
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("x = ",value(x))
println("y = ",value(y))
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 = 197894.73684210528 x = 421.05263157894734 y = 147.36842105263167 c1 = 5.2631578947368425 c2 = -0.0 c3 = 3.6842105263157894
cioè l'azienda ottiene un profitto massimo giornaliero di 197.894€ producendo 147 mobiletti e 421 tavoli.