Ein Mischungsproblem
Stellt das Problem der Berechnung der verschiedenen Mischungen von Benzin nach spezifischen Qualitätskriterien.
Mischprobleme sind eine weitere typische Anwendung der linearen Programmierung.
Betrachten Sie das folgende Problem. Ein Ölunternehmen stellt drei Arten von Benzin her: super
, regular
und diesel
. Jede Art von Benzin wird durch Mischen von drei Arten von Rohöl hergestellt: crude1
, crude2
und crude3
. In der folgenden Tabelle 1 sind der Verkaufspreis und der Kaufpreis je Barrel der verschiedenen Produkte dargestellt. Das Benzin muss einige Qualitätskriterien in Bezug auf ihren Bleigehalt und ihre Oktanzahl erfüllen und so die möglichen Unschärfen einschränkt.
Verkaufspreis | Kaufpreis | ||
---|---|---|---|
Super | 70 USD | Crude1 | 45 USD |
Regulär | 60 USD | Crude2 | 35 USD |
Diesel | 50 USD | Crude3 | 25 USD |
In Tabelle 2 werden die relevanten Instanzdaten beschrieben.
Oktanbewertung | Lead-Inhalt | Oktanbewertung | Bleiinhalt | ||
---|---|---|---|---|---|
Super | größer oder gleich 10 | kleiner oder gleich 1 | Crude1 | 12 | 0,5 |
Regulär | größer oder gleich 8 | kleiner oder gleich 2 | Crude2 | 6 | 2,0 |
Diesel | größer oder gleich 6 | kleiner oder gleich 1 | Crude3 | 8 | 3,0 |
Das Unternehmen muss auch seine Kundennachfrage befriedigen, das sind 3.000 Barrel am Tag von super
, 2.000 von regular
und 1.000 von diesel
. Das Unternehmen kann pro Tag 5.000 Fässer jeder Art Rohöl erwerben und kann maximal 14.000 Barrel pro Tag verarbeiten. Darüber hinaus hat das Unternehmen die Möglichkeit, ein Benzin zu werben, in diesem Fall steigt die Nachfrage nach dieser Benzinart um zehn Barrel für jeden ausgegebenen Dollar. Schließlich kostet es vier Dollar, um ein Barrel Öl in ein Fass Benzin zu verwandeln. Das Modell wird im Beispiel oil.mod
dargestellt, und die Instanzdaten werden in oil.dat
angezeigt.
Ein Problem mit Ölmischungsplanung (oil.mod
)
{string} Gasolines =...;
{string} Oils =...;
Tupelgastyp {
Schwimmerbedarf
Float-Preis
Schwimmeroctan;
Schwimmerleitung
}
Tupeloiltyp {
Schwimmkapazität;
Float-Preis
Schwimmeroctan;
Schwimmerleitung
}
gasType Gas [Gasolinen] =...;
oilType Oil [Oils] =...;
float MaxProduction =...;
float ProdCost =...;
dvar float + a [Gasolinen];
dvar float + Blend [Oils] [Gasolinen];
Maximieren
Summe (g in Gasolinen, o in Oils)
(Gas [g] .price-Oil [o] .price-ProdCost) * Blend [o] [g]
-Summe (g in Gasolinen) a [g];
Gegenstand: {
forall (g in Gasolinen)
ctDemand:
Summe (o in Oils)
Blend [o] [g] = = Gas [g] .demand + 10 *a [g];
forall (o in Oils)
ctCapacity:
Summe (g in Gasolinen)
Blend [o] [g] < = Oil [o] .capacity;
ctMaxProd:
Summe (o in Oils, g in Gasolinen)
Blend [o] [g] < = MaxProduction;
forall (g in Gasolinen)
ctOctane:
Summe (o in Oils)
(Oil [o] .octane-Gas [g] .octan) * Blend [o] [g] > = 0;
forall (g in Gasolinen)
ctLead:
Summe (o in Oils)
(Oil [o] .lead-Gas [g] .lead) * Blend [o] [g] < = 0;
}
execute DISPLAY_REDUCED_COSTS {
für (var g in Gasolines) {
writeln ("a [", g, "] .reducedCost =", a [g] .reducedCost);
}
}
Daten für das Problem der Ölmischplanung (oil.dat
)
Gasolinen = {"Super", "Regulär", "Diesel"};
Öle = {"Crude1", "Crude2", "Crude3"};
Gas = [ < 3000, 70, 10, 1 >,
< 2000, 60, 8, 2 >,
< 1000, 50, 6, 1 >];
Öl = [ < 5000, 45, 12, 0.5 >,
< 5000, 35, 6, 2 >,
< 5000, 25, 8, 3 >];
MaxProduction = 14000;
ProdCost = 4;
Das Modell verwendet zwei Gruppen von Variablen. Die Variable a[Gasolines]
stellt die Menge dar, die in der Werbebenziner g
ausgegeben wird. Variable Blend[Oils][Gasolines]
steht für die Anzahl der Barrel Rohöl o
, die für die Herstellung von Benzin verwendet werden g
.
Die Nachfrageeinschränkung:
forall (g in Gasolinen)
ctDemand:
Summe (o in Oils)
Blend [o] [g] = = Gas [g] .demand + 10 *a [g];
verwendet beide Arten von Variablen, da sum(o in Oils) Blend[o][g]
die Menge an Benzin g
darstellt, die täglich erzeugt wird.
Die Kapazitätseinschränkung:
forall (o in Oils)
ctCapacity:
Summe (g in Gasolinen)
Blend [o] [g] < = Oil [o] .capacity;
die Kapazitätsbegrenzung für jede Art von Öl.
Die Bedingungen ctOctane
und ctLead
forall (g in Gasolinen)
ctOctane:
Summe (o in Oils)
(Oil [o] .octane-Gas [g] .octan) * Blend [o] [g] > = 0;
forall (g in Gasolinen)
ctLead:
Summe (o in Oils)
(Oil [o] .lead-Gas [g] .lead) * Blend [o] [g] < = 0;
Durchsetzung der Qualitätskriterien für das Benzin.
Die objektive Funktion hat vier Teile: den Verkaufspreis des Benzins, die Anschaffungskosten der Rohöle, die Produktionskosten und die Werbekosten.
Maximieren
Summe (g in Gasolinen, o in Oils)
(Gas [g] .price-Oil [o] .price-ProdCost) * Blend [o] [g]
-Summe (g in Gasolinen) a [g];
Eine Lösung für oil.mod
Für die in Daten für das Problem der Ölmischplanung (oil.dat)angegebenen Instanzdaten ist die optimale Lösung für dieses Problem
Endlösung mit Ziel 287750.0000:
Blend = [ [2088.8889 2111.1111 800.0000]
[777.7778 4222.2222 0.0000]
[133.3333 3166.6667 200.0000]];
a = [0.0000 750.0000 0.0000];