Calcoli scientifici con Julia/Coltivazione terreno

Coltivare un terreno stabilendo la superficie da coltivare nei vari cereali e il quantitativo di fertilizzanti e pesticidi da utilizzare, in modo da massimizzare il profitto è un 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

Supponiamo che un agricoltore abbia un pezzo di terreno agricolo, di 10 km2, da coltivare a grano o orzo o da una combinazione di entrambi. L’agricoltore ha quantità limitate di fertilizzanti (48 chilogrammi), e di pesticidi (32 chilogrammi) . Ogni chilometro quadrato di grano richiede 3 chilogrammi di fertilizzante e 4 chilogrammi di pesticidi, mentre ogni chilometro quadrato di orzo richiede 6 chilogrammi di fertilizzante e 2 chilogrammi di pesticidi. Sia 4€ il prezzo di vendita del grano per chilometro quadrato e 3€ il prezzo di vendita dell'orzo. Se indichiamo l’area di terreno coltivato a grano e orzo rispettivamente con x1 e x2, allora il profitto può essere massimizzato scegliendo valori ottimali per x1 e x2. Questo problema può essere espresso con il seguente problema di programmazione lineare nella forma standard.

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)
@objective(model, Max, 4*x1 +3*x2)
@constraint(model, c1, 3*x1+6*x2<=48)
@constraint(model, c2, 4*x1+2*x2<=32)
@constraint(model, c3, x1+x2<=10)
print(model)
optimize!(model)
max 4𝑥1+3𝑥2
Subject to:
3𝑥1+6𝑥2≤48
4𝑥1+2𝑥2≤32
 𝑥1+𝑥2≤10
 𝑥1≥0
 𝑥2≥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.4999947561e+00 Ph1: 3(7.25); Du: 2(3.49999) 0s
         3     3.6000000000e+01 Pr: 0(0) 0s
Model   status      : Optimal
Simplex   iterations: 3
Objective value     :  3.6000000000e+01
HiGHS run time      :          0.02

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))
termination_status = OPTIMAL
primal_status = FEASIBLE_POINT
dual_status = FEASIBLE_POINT
objective_value = 36.0
x1 = 6.0
x2 = 4.0

Si ottiene quindi un profitto massimo di 36€, coltivando 6 km2 di grano e 4 km2 di orzo.Ogni chilometro quadrato di grano richiede 3 chilogrammi di fertilizzante e 4 chilogrammi di pesticidi, mentre ogni chilometro quadrato di orzo richiede 6 chilogrammi di fertilizzante e 2 chilogrammi di pesticidi.