Un'industria produce due prodotti A e B e utilizza due macchinari P e Q.
Per ogni kg di A sono necessarie 1 ora e mezza di P e 3 ore di Q,
per ogni kg di B sono necessarie 2 ore di P e 2 ore e mezza di Q.
Inoltre A non può essere prodotto in più di 17 kg alla settimana,
la macchina P non può lavorare per più di 38 ore alla settimana,
mentre Q per non più di 55.
Sia m l'unità di misura monetaria in vigore.
Determinare qual è la combinazione produttiva più conveniente, sapendo che ogni kg
di A viene venduto a
Schema risolutivo
A | B | Ore disponibili |
x = quantità di A y = quantità di B z = funzione obiettivo = ricavo | |
P | 1.5 | 2 | 38 | |
Q | 3 | 2.5 | 55 |
Risolviamo il problema con R usando ( "a scatola nera") la funzione simplex. |
|
library(boot) # Carico la libreria contenente "simplex":
# I vincoli:
A11 <- c(1.5,2); b11 <- 38 # quelli ≤
A12 <- c(3,2.5); b12 <- 55
A13 <- c(1,0); b13 <- 17
A21 <- c(1,0); b21 <- 0 # quelli ≥
A22 <- c(0,1); b22 <- 0
# Il probl. da massimizzare:
a1 <- c(10e3, 11e3)
simplex(A1=rbind(A11,A12,A13), A2=rbind(A21,A22), a=a1,
b1=c(b11,b12,b13), b2=c(b21,b22), maxi=TRUE)
Optimal solution has the following values
x1 x2
6.666667 14.000000
The optimal value of the objective function is 220666.67
Conviene produrre 6.667 kg di A e 14.000 kg di B.
Ecco la rappresentazione (e la soluzione) grafica del problema:
source("http://macosa.dima.unige.it/r.R") P <- function(x,y) (1.5*x+2*y<= 38) & (3*x+2.5*y<= 55) & (0<= x) & (x<= 17) & (0<= y) HF <- 3; BF <- 3 # La scelta della porzione di piano (eventualmente poi # ritraccio dopo la rappresentazione delle rette) boxS(-0.5,22, -0.5,22) diseq2(P,0, "grey") # Dove P > 0 ovvero P = 1 diseq2(P,0, "grey") f1 <- function(x,y) 1.5*x+2*y - 38; f2 <- function(x,y) 3*x+2.5*y - 55 f3 <- function(x,y) x; f4 <- function(x,y) y; f5 <- function(x,y) x-17 curva(f1,"red"); curva(f2,"green"); curva(f3,"orange") curva(f4,"blue"); curva(f5,"violet") F <- function(x,y) 10000*x + 11000*y - M M <- 0; cur(F,"black") M <- 1e5; cur(F,"black") # intersezione tra rossa (f1) e verde (f2) frazio(sistema(c(1.5,2,38, 3,2.5, 55))) # 6.666667 14.000000 # 20/3 14 punto(20/3, 14, "blue") M <- 0; F(20/3,14) # 220666.7 M <-ultimo(); cur(F,"black")
Avrei ottenuto la stessa risposta con WolframAlpha mettendo
maximize[10000x+11000y, {1.5x+2y<=38 && 3x+2.5y<=55 && x<=17 && y>=0 && x>=0} ]
Approfondimenti in: Programmazione lineare neGli Oggetti Matematici.