supponiamo che un certo bene possa essere prodotto tramite l'assemblaggio di un certo numero di componenti A, B e C, in oltre supponiamo che il componente C possa essere barattato con un'azienda esterna per A o B. Chiaramente, questo baratto avviene attraverso un tasso di scambio variabile: "tasso A" (nel caso C venga barattato con A) o "tasso B" (nel caso C venga barattato con B). Supponiamo di aver a disposizione inizialmente certe quantità di A, B e C, che chiameremo startA, startB e startC.
Il quesito del problema, a cui la macro deve rispondere è il seguente:
Dato il costo del bene per la produzione di una singola unità (ad esempio: 500 pezzi di A, 1325 pezzi di B e 650 di C), dati i tassi di scambio (ad esempio: tasso A = 1:3 e tasso B = 1:2) e dati i componenti a disposizione per la produzione (ad esempio: 12500 di A, 8000 di B e 125000 di C), quale è il massimo numero di unità (del bene) che la mia azienda può produrre a seguito di un oculato scambio del componente C con le aziende esterne?
Difatti, è facilmente intuibile che ci sia un massimo nel numero di unità prodotte considerando gli scambi. Il ragionamento è questo:
se baratto troppo C acquisendo A e B, mi troverò nella situazione in cui avrò carenza di C rispetto alla quantità di A e B che posseggo in seguito allo scambio (ricordiamoci che C è anch'esso un componente utilizzato nella produzione del bene).
Se non baratto abbastanza C, mi troverò nella situazione in cui avrò un eccesso di C rispetto alla quantità di A e B che posseggo a seguito dello scambio.
Ne consegue che esiste un'esatta quantità di C da barattare affinché sia massimizzato il numero di unità prodotte.
Ho risolto la questione con questa pessima macro:
- Codice: Seleziona tutto
Sub massimizza()
Dim vValue As Variant
Dim k As Long
m = Range("A2").Value
c = Range("B2").Value
d = Range("C2").Value
md = Range("A4").Value
cd = Range("B4").Value
dd = Range("C4").Value
ms = Range("A6").Value
cs = Range("B6").Value
acomp = 0
bcomp = 0
k = 1 '<--- Definisce la minima quantità di C barattata, chiaramente più è piccola più è accurato il risultato.
Do
cven = cven + k '<--- Tengo conto della quantità di C barattata
d = d - k
rm = m / md'<--- Calcolo i rapporti
rc = c / cd
rd = d / dd
'Determina minimo rapporto
vValue = Application.WorksheetFunction.Min(rm, rc, rd)
'Determina l'acquisto della risorsa con rapporto minore
If vValue = rm Then
m = m + ms * k '<--- Tengo conto della quantità di A acquisita dopo lo scambio
acomp = acomp + ms * k
End If
If vValue = rc Then
c = c + cs * k '<--- Tengo conto della quantità di B acquisita dopo lo scambio
bcomp = bcomp + cs * k
End If
Loop Until vValue = rd '<--- Condizione affinché lo scambio sia interrotto
cven = Application.WorksheetFunction.RoundUp(cven, 0)
acomp = Application.WorksheetFunction.RoundDown(acomp, 0)
bcomp = Application.WorksheetFunction.RoundDown(bcomp, 0)
vValue = Application.WorksheetFunction.RoundDown(vValue, 0)
MsgBox ("Vendi: " & cven & " di C." & Chr(13) & "Ottieni: " & acomp & " di A e " & bcomp & " di B." & Chr(13) & "Produci: " & vValue & " unità.")
End Sub
Allego il file associato alla macro (contiene anche l'esempio sopra scritto):
https://www.dropbox.com/s/4ypukhq54jw4hmu/massimizza_barattando.xlsm?dl=0
Come al solito il problema è la velocità (quando le quantità possedute inizialmente sono grandi, nell'ordine di 10^6/10^7), vorrei sapere se esiste un modo più efficiente per fare questo calcolo.
Grazie a tutti, a disposizione di qualsiasi chiarimento,
Ciao