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, regularund diesel. Jede Art von Benzin wird durch Mischen von drei Arten von Rohöl hergestellt: crude1, crude2und 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.

Tabelle 1. Preise für das Mischproblem
  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.

Tabelle 2. Octan-und Bleidaten für das Mischproblem
  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 regularund 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.datangezeigt.

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 gausgegeben 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];