Optimizing with Pyomo: A Complete Step-by-Step Guide

Optimalisatie is een fundamentele tool die wordt gebruikt in diverse industrieën en disciplines om de beste beslissingen te nemen binnen de gegeven beperkingen. Of het nu gaat om het minimaliseren van kosten in een supply chain, het maximeren van efficientie in energie systemen, of het vinden van de optimale parameters in machine learning modellen, optimalisatie technieken zijn essentieel.

Python, bekend om zijn eenvoud en zijn veelzijdigheid, biedt krachtige bibliotheken voor optimalisatie problemen. Daarvan uit Pyomo uitstekend als een complete en flexibele bibliotheek die gebruikers toestaat om complexe optimalisatie modellen eenvoudig te definiëren en op te lossen.

In deze handleiding zullen we Pyomo van de grond af aan verkennen. We zullen alles behandelen, van het installeren en opzetten van oplossers tot het formuleren en oplossen van verschillende optimalisatie problemen!

Exploratie van mogelijke oplossingen in lineaire programmering. Afbeelding door de auteur.

Wat is Pyomo?

Pyomo is een opensourcescherm voor het bouwen en oplossen van optimalisatiemodellen met behulp van Python. Het maakt het mogelijk om optimalisatiemodellen in een zowel mathematisch rigoureuze als syntaxisch intuitieve manier voor Python-programmeurs te definiëren. Het ondersteunt een breed scala aan probleemtypen, inclusief:

  1. Lineaire programmering (LP):LP omvat het optimaliseren van een lineaire objectieffunctie onderworpen aan lineaire gelijkheid en ongelijkheidseisen. Het wordt breed gebruikt voor resourceschema’s, planning en financiële planningproblemen.
  2. Niet-lineaire programmering (NLP): NLP gaat over het optimaliseren van een niet-lineaire objectievel functie onder niet-lineaire gelimiterende voorwaarden. Het wordt vaak gebruikt in de techniek en de economie voor complexere systemen waar de relaties niet lineair zijn.
  3. Mixed-integer programming (MIP): MIP betreft optimatieproblemen waarin sommige variabelen zijn ingeperkt om gehele getallen te zijn terwijl andere kunnen zijn continu. Dit is handig in scenario’s als het ontwerpen van een supply chain of het schema van een project, waar beslissingen kunnen zijn discreet (bijv. aan/uit).
  4. Stochastische programmering:Stochastische programmering behandelt optimalisatieproblemen waarin sommige elementen onzeker zijn en worden modelleerd als stochastische variabelen. Het wordt algemeen toegepast in de financiën en supply chain management om beslissingen te optimaliseren onder onzekerheid.
  5. Dynamische optimalisering: Dynamische optimalisering focuses op het optimaliseren van beslissingsvariabelen over tijd, typisch betreffende dynamisch evoluerende systemen. Het wordt gebruikt in vakgebieden zoals procesbesturing, robotica en economie om tijdafhankelijke processen te beheren.

Features van Pyomo

Nu we Pyomo beter begrijpen, laten we een overzicht maken van enkele van zijn belangrijkste functionaliteiten. 

Flexibiliteit en uitbreidbaarheid

De flexibiliteit van Pyomo komt van zijn mogelijkheid om complexe relaties te modelleren met behulp van standaard Python-constructies. Hij integreert met verschillende open-source en commerciële oplossers, waardoor het gemakkelijk is om veel optimeringsproblemen op te lossen.

Pythonaanse syntaxis

Pyomo-modellen zijn gebouwd op Python en geschreven met behulp van standaard Python-syntaxis. Dit maakt de leerlijn gemakkelijker voor mensen die bekend zijn met Python en stelt u in staat om de uitgebreide bibliotheken van Python binnen uw modellen te gebruiken.

Verkrijgbaarheid en documentatie

Pyomo heeft een sterke gebruikersgemeenschap en omvangrijke documentatie, die ook voorbeelden en handleidingen bevat om gebruikers op alle niveaus te helpen.

Toepassingsgebieden voor Pyomo

Pyomo heeft een breed scala aan real-world toepassingen. Hier zijn er enkele van:

1. Optimering van de supply chain

Supply chain optimalisatie omvat het verbeteren van logistiek, het beheren van voorraadniveaus en het creëren van efficiente productieschema’s.

Dit kan minderening van transportkosten, optimering van de locaties van magazijnen of evenwicht van aanbod en vraag bevatten.

Bijvoorbeeld, een bedrijf moet misschien klantenbelangen over verschillende regio’s aan te spreken terwijl het transportkosten minimaliseert en voorraadniveaus bij elk distributiecentrum behouden houdt.

2. Financiële modellen

In financiële modellen helpt optimalisatie resources zoals kapitaal te allociteren om terugkeer te maximumiseren terwijl risico wordt minimaliseerd.

Dit kan zijn een portefeuille optimalisatie, waarin investeerders risico en baten balanceren door een combinatie van activa te selecteren die onder beperkingen zoals budgetlimieten, regelgevende vereisten of risicotolerantie vallen.

Financiële modellering zorgt ervoor dat financiële strategieën overeenkomen met langetermijndoelstellingen terwijl potentiële risico’s worden verminderd.

3. Energiesystemen

Optimalisatie in energiesystemen focusert op het maximale vermogen aan te leveren, verdelen en verbruiken van energie.

Dit kan betrekking hebben op het bepalen van de optimale mix van energiebronnen (bijvoorbeeld duurzame versus niet-duurzame) terwijl brandstofkosten worden geminimiseerd, emissiegrenzen worden behaald en aanpassing wordt gemaakt aan fluctuerende vraag.

Dit type optimalisatie speelt een centrale rol in netwerkbeheer, energiecentrale-operaties en het verminderen van de milieuimpact.

4. Machine learning en data wetenschap

Optimalisatie is centraal bij veel machine learning– en datawetenschap taken, zoals het afstemmen van hyperparameters en kenmerkkeuze.

In het optimaliseren van hyperparameters helpt de algoritmen de beste modelconfiguratie te vinden om de voorspellende prestaties te verbeteren.

Feature selectie, een andere cruciale taak, omvat het identificeren van de meest belangrijke kenmerken die een bijdrage leveren aan de nauwkeurigheid van een model, wat helpt om complexiteit te verminderen en effecten te verbeteren.

Nu dat het context is ingesteld, laten we de handen aan de slag gaan en beginnen we met het toepassen van Pyomo op enkele voorbeeldmodelproblemen!

Instellen van Pyomo

Voordat we aan het modelleren beginnen, moeten we ons milieu instellen door Pyomo te installeren en een geschikte vergelijker te kiezen.

1. Vereisten

Om Pyomo te gebruiken, moet u Python 3.6 of hoger hebben. Pyomo kan worden geïnstalleerd via pip.

pip install pyomo

Deze handleiding is gemaakt met pyomo versie 6.8.0.

import pyomo print(pyomo.__version__)

Uitvoer:

>>> 6.8.0

2. Kiezen en installeren van het juiste probleemoplosser

Bij de optimalisatie zijn probleemoplossers essentieel want ze zijn de algoritmen die de optimale oplossing voor het gedefinieerde probleem vinden. Verschillende probleemoplossers zijn beter geschikt afhankelijk van het probleemtype (bijvoorbeeld lineair, niet-lineair, integer). Pyomo is een modelingschema dat op externe probleemoplossers vertrouwt om de feitelijke berekeningen uit te voeren.

Laten we enkele van de meest voorkomende probleemoplossers bekijken.

Open-source probleemoplossers

1. GLPK (GNU Linear Programming Kit)

GLPK is een populaire tool voor het oplossen van lineaire programmering (LP) en gemengde integer programmering (MIP) problemen.

Het is een uitstekkeke keuze voor basis lineaire optimalisaties taken en wordt breed gebruikt in academische en industriële toepassingen.

Installatie

brew install glpk
  • Linux: 
sudo apt-get install glpk-utils
2. CBC (Coin-or Branch and Cut)

CBC is een open-source solver voor lineaire programmering (LP) en gemixed-integer programmering (MIP) problemen.

Hij biedt geavanceerde functionaliteiten en betere prestaties in sommige gevallen vergeleken met GLPK, waardoor hij een sterke optie is voor meer complexe optimalisaties taken.

CBC kan worden geïnstalleerd via de conda pakketbeheerder.

conda install -c conda-forge coincbc
3. IPOPT (Interior Point OPTimizer)

IPOPT is een krachtige vergelijker ontworpen voor grote niet-lineaire programma’s (NLP)

Hij is bijzonder geschikt om complexe, niet-lineaire modellen te behandelen, waardoor het een uitstekende keuze is voor problemen die buiten de scope van lineaire optimalisatie vallen.

IPOPT kan worden geïnstalleerd via de conda pakketbeheerder.

!conda install -c conda-forge ipopt

Commerciële oplossers

1. CPLEX

CPLEX is een moderne optimalisatiesolver die efficiënt lineaire programmeren (LP), gemengde integer programmeren (MIP) en kwadratische programmeren (QP) problemen behandelt.

Hij vereist een licentie van IBM, maar is beschikbaar voor academici gratis, waardoor het een uitstekende keuze is voor onderzoek en onderwijs.

2. Gurobi

Gurobi is een vooraanstaand commerciëel oplosserprogramma dat bekend is om zijn snelheid en efficientie bij het oplossen van LP, MIP, QP en niet-lineaire programmering (NLP) problemen.

Net als CPLEX vereist het een licentie, maar biedt het gratis toegang aan academische gebruikers. Daardoor is het een industriestandaardgereedschap voor geavanceerde optimalisatie.

Open-source versus commerciële oplossers

Open-source oplossers zoals GLPK en CBC zijn gratis en voldoende voor de meeste basisoptimalisatiebehoeften. Ze zijn uitstekende keuzes voor kleinschalige projecten en educatieve doeleinden.

Hieronder, commerciële oplossers zoals CPLEX en Gurobi bieden echter over het algemeen betere prestaties, vooral voor grotere en complexere problemen. Deze oplossers beschikken over geavanceerde functies, inclusief verbeterde ondersteuning voor kwadratische en niet-lineaire programmering, en zijn geoptimaliseerd voor grote-scala industriële toepassingen.

Alhoewel open-source oplossers veel routine-optimalisatietaken kunnen verwerken, zijn commerciële oplossers vaak een betere keuze wanneer men met meer complexe, hoge-rendementvereisten bezig is.

Onthoud echter dat commerciële oplossers een licentie vereisen, hoewel ze gratis beschikbaar zijn voor academische gebruikers.

Nu zal ik u laten zien hoe u een vergelijker configureert in Pyomo. Ik zal GLPK gebruiken in dit geval.

3. Configureren van een vergelijker in Pyomo

Eerst controleer u of het uitvoerbare bestand van de vergelijker aan het eind van de installatie in uw systeem PATH staat.

Maak dan een Python-script en voeg het volgende toe:

from pyomo.environ import SolverFactory solver = SolverFactory('glpk')

Om te bevestigen dat zowel Pyomo als uw vergelijker correct zijn geïnstalleerd, zal ik eenvoudig een testprobleem oplossen.

Testprobleem: eenvoudig lineair programma

Doel: MinimaliseerZ=x+y

Onder voorwaarde:

  • x + 2y ≥ 4
  • x – y ≤ 1
  • x ≥ 0
  • y ≥ 0

Dit probleem gaat over het vinden van de kleinste mogelijke waarde vanZ, die is de som van twee variabelenxeny. Echter,xeny moeten aan bepaalde condities voldoen.

Eerst, wanneer u x optelt y tweemaal, moet het resultaat minstens 4 zijn. Twee, x minder y moet kleiner of gelijk zijn aan 1. Ten slotte moeten zowel x als y nul of postief getallen zijn (ze kunnen geen negatieve getallen zijn). 

Het doel is om waarden van x en y te vinden die deze condities nadoen terwijl Z zo klein mogelijk wordt.

Implementeren met Pyomo:

import pyomo.environ as pyo # Maak een model model = pyo.ConcreteModel() # Definieer variabelen model.x = pyo.Var(within=pyo.NonNegativeReals) model.y = pyo.Var(within=pyo.NonNegativeReals) # Definieer doelstelling model.obj = pyo.Objective(expr=model.x + model.y, sense=pyo.minimize) # Definieer beperkingen model.con1 = pyo.Constraint(expr=model.x + 2 * model.y >= 4) model.con2 = pyo.Constraint(expr=model.x - model.y <= 1) # Selecteer oplosser solver = pyo.SolverFactory('glpk') # Oploss het probleem result = solver.solve(model) # Toon resultaten print('Status:', result.solver.status) print('Termination Condition:', result.solver.termination_condition) print('Optimal x:', pyo.value(model.x)) print('Optimal y:', pyo.value(model.y)) print('Optimal Objective:', pyo.value(model.obj))

Indien alles correct werkt, zal de verwachte uitvoer zijn:

Status: ok Termination Condition: optimal Optimal x: 0.0 Optimal y: 2.0 Optimal Objective: 2.0

Laten we door de code bovenstaand doorgaan: eerst definieert het twee variabelen, x en y, die alleen niet-negatieve waarden kunnen aannemen. Het doel van het model is om de som van x en y (x + y) te minimaliseren. Het code definieert de oplosser als glpk om de optimalen waarden van x en y te vinden die deze beperkingen aanpassen terwijl de doelstelling wordt geminimaliseerd.

Na het uitvoeren van het code, ontdekken we dat de optimale waarden voor de variabelen zijn x = 0.0 en y = 2.0, die de objectieve functie Z = x + y minimaliseren. Daarom is de minimale waarde van de objectieve functie 2.0, die de gegeven restricties bevat.

Basis van het modelleren met Pyomo

Het begrijpen van hoe je de basiscomponenten van een optimalisatiemodel in Pyomo definieert is nodig om effectief optimalisatieproblemen op te zetten en op te lossen.

1. Defineren van variabelen

Variabelen vertegenwoordigen de beslissingen die nodig zijn in een optimalisatieprobleem. In Pyomo zijn variabelen de hoeveelheden die de vergelijker zal aanpassen om de doelfunctie te optimaliseren terwijl alle constraints worden nageleefd.

Scalaire variabelen

Een scalaire variabele is een enkele variabele die niet over elke verzameling wordt geïndexeerd. Om een scalaire variabele te definiëren in Pyomo, gebruik je de Var klasse uit het pyomo.environ module.

from pyomo.environ import Var model.x = Var()

We importeren eerst de Var en maken een variabele x aan met behulp van Var(). Deze variabele heeft geen gespecificeerde grenzen, wat betekent dat het elke reële waarde kan aannemen, tenzij anders in het model beperkt.

Toevoegen van grenzen

U kunt de waarden die een variabele kan aannemen beperken door middel van grenzen op te geven. Grenzen worden gedefinieerd als een tuple (lower_bound, upper_bound):

from pyomo.environ import Var model.x = Var(bounds=(0, None))

Grenzen opgeven

Pyomo biedt voorgedefinieerde domeinen die u kunt gebruiken om het type waarden aan te geven dat een variabele kan aannemen, zoals NonNegativeReals, Integers of Binary

from pyomo.environ import Var, NonNegativeReals model.x = Var(domain=NonNegativeReals)

Gecindexeerde variabelen

Bij het werken met meerdere soortgelijke variabelen, zoals variabelen die verschillende tijdperken of items representeren, is het efficiënt om gecindexeerde variabelen te gebruiken. Gecindexeerde variabelen zijn variabelen die zijn gedefinieerd over een verzameling.

import pyomo.environ as pyo model.I = pyo.Set(initialize=[1, 2, 3]) model.y = pyo.Var(model.I, domain=pyo.NonNegativeReals)

Stel dat u het productieaantal voor drie producten moet modelleren. U kunt definiëren:

model.Products = pyo.Set(initialize=['A', 'B', 'C']) model.production = pyo.Var(model.Products, domain=pyo.NonNegativeReals)

Nu representeren model.production['A'], model.production['B'] en model.production['C'] de productiehoeveelheden voor producten A, B en C respectievelijk.

2. Definiëren van doelstellingen

Het doelstellingenelement is wat we proberen te optimaliseren (minimaliseren of maximaliseren). Het definieert het doel van het model, zoals minimaliseren van kosten of maximaliseren van winsten, en wordt meestal uitgedrukt als een wiskundige vergelijking die de beslissingsvariabelen invoert.

Deze worden gedefinieerd met behulp van de Objective klasse:

from pyomo.environ import ConcreteModel, Var, Objective, minimize, maximize, NonNegativeReals # Maak een model model = ConcreteModel() # Definieer variabelen model.x = Var(within=NonNegativeReals) model.y = Var(within=NonNegativeReals) # Minimalisering (kosten) model.cost = Objective(expr=2 * model.x + 3 * model.y, sense=minimize) # Bij Maximalisering van winst - (kan er maar een doelstelling aan de keizer zijn) # model.profit = Objective(expr=5 * model.x + 4 * model.y, sense=maximize)

3. Toevoegen van constraints

Beperkingen definiëren de beperkingen of vereisten van het probleem:

from pyomo.environ import Constraint model.con1 = Constraint(expr=model.x + model.y >= 10)

Het bovenstaande voorbeeld definieert een beperking in het Pyomo-model door middel van de Constraint klasse. De beperking model.con1 specificeert dat de som van de variabelenx en y groter of gelijk aan10 moet zijn.

4. Parameteriseren van modellen

Parameters zijn vaste waarden die worden gebruikt in het model om bekende hoeveelheden of constanten weer te geven die niet veranderen tijdens het optimisatieproces.

Ze helpen de relaties tussen variabelen en beperkingen te definiëren, waardoor het model structuur krijgt door realistische gegevens of aannames in te voeren:

from pyomo.environ import Param model.p = Param(initialize=5)

Het bovenstaande code definieert een parameter p in het Pyomo model met behulp van de Param klasse en initialiseert deze met een vaste waarde van5. De parameter p kan nu worden gebruikt in het model om een constante waarde weer te geven die tijdens het optimisatieproces niet veranderd.

Nu gaan we aan de slag met een eind-tot-eind optimalisatieprobleem!

Pyomo Eind-tot-eind Voorbeeld

Bekijk ons een eind-tot-eind voorbeeld van het oplossen van een optimalisatieprobleem met behulp van Pyomo. We zullen een realistische situatie modelleren waarin een fabriek twee producten produceert, en het doel is om de winst te maximaliseren terwijl we rekening houden met de tijdsbeperkingen van de machines.

1. Problemestatement

Een fabriek produceert twee producten, P1 en P2. Het profijt per eenheid is:

  • P1: $40
  • P2: €50

Beschikbare machine tijd:

  • Machine A: 100 uren
  • Machine B: 80 uren
  • Machine C: 90 uur

Tijd nodig per eenheid:

Product

Machine A (uren)

Machine B (uren)

Machine C (uren)

P1

1

2

0

P2

2

1

3

Objectief: Maximeer de winst.

Decisievariabelen:

  • x₁: Aantal eenheden van P1 om te produceren.
  • x₂: eenheden van P2 om te produceren.

2. Wiskundige formulering

Objectief functie:

Maximeer Z = 40x₁ + 50x₂

Beschrijving van de beperkingen:

  1. Machine A capaciteit: 1x₁ + 2x₂ ≤ 100
  2. Machine B capaciteit: 2x₁ + 1x₂ ≤ 80
  3. Machine C capaciteit: 3x₂ ≤ 90
  4. Niet-negatieve waarden: x₁, x₂ ≥ 0

3. Implementatie

Gebaseerd op het doel en de beperkingen van het probleem, is hier de Python-code om het te modelleren, opnieuw, met GLPK gebruik makend.

# Stap 1: Importeer bibliotheken import pyomo.environ as pyo # Stap 2: Maak een concreet model model = pyo.ConcreteModel() # Stap 3: Definieer beslissingsvariabelen (eenheden van P1 en P2 om te produceren) model.x1 = pyo.Var(within=pyo.NonNegativeReals) model.x2 = pyo.Var(within=pyo.NonNegativeReals) # Stap 4: Definieer de doel functie (maximeer de winst) model.profit = pyo.Objective(expr=40 * model.x1 + 50 * model.x2, sense=pyo.maximize) # Stap 5: Definieer beperkingen # Machine A capaciteit beperking: 1x1 + 2x2 <= 100 model.machine_a = pyo.Constraint(expr=1 * model.x1 + 2 * model.x2 <= 100) # Machine B capaciteit beperking: 2x1 + 1x2 <= 80 model.machine_b = pyo.Constraint(expr=2 * model.x1 + 1 * model.x2 <= 80) # Machine C capaciteit beperking: 3x2 <= 90 model.machine_c = pyo.Constraint(expr=3 * model.x2 <= 90) # Stap 6: Oplossen van het model met de GLPK solver solver = pyo.SolverFactory('glpk') result = solver.solve(model) # Stap 7: Analyseer resultaten # Toon de status van de solver en de eindconditie print('Solver Status:', result.solver.status) print('Termination Condition:', result.solver.termination_condition) # Haal de optimale waarden voor x1, x2 en de maximale winst op en toon ze x1_opt = pyo.value(model.x1) x2_opt = pyo.value(model.x2) profit_opt = pyo.value(model.profit) print(f'Optimal production of P1 (x1): {x1_opt}') print(f'Optimal production of P2 (x2): {x2_opt}') print(f'Maximum Profit: ${profit_opt}')

Uitvoer:

>>> Solver Status: ok >>> Termination Condition: optimal >>> Optimal production of P1 (x1): 25.0 >>> Optimal production of P2 (x2): 30.0 >>> Maximum Profit: $2500.0

In het bovenstaande codebereik definiëren we een lineaire optimatiesmodel om de winst van de productie van twee producten (P1 en P2) te maximaliseren. Het doel functie is ingesteld op winstmaximalisatie, waarbij elk productieeenheid van P1 $40 bijdragen en elk productieeenheid van P2 $50 bijdragen.

We stellen drie beperkingen in die de machine tijdslimieten voor Machines A, B en C representeren.

Ten slotte gebruiken we de GLPK solver om het probleem op te lossen.

Het uiteindelijke antwoord is om25 eenheden van P1 en 30 eenheden van P2 te produceren waarmee onze maximale winst $2,500 zal zijn.

Geavanceerde functies in Pyomo

In de vorige sectie zagen we hoe gemakkelijk het is om een eind-tot-eind optimisatieprobleem met Pyomo uit te voeren.然而, de meeste echte-leven problemen zijn niet eenvoudig op te lossen.

In deze sectie presenteer ik enkele geavanceerde functies die u kunt gebruiken om meer complexe scenario’s op te lossen.

1. Niet-lineaire optimalisatie

Niet-lineaire optimalisatie minimaliseert of maximeert een niet-lineaire objectief functie onder voorwaarden van niet-lineaire beperkingen. Laten we een voorbeeld bekijken waarin we de som van de kwadraten van de verschillen minimaliseren onder een cirkelachtige beperking.

Probleem statement

Minimaliseer het doel:Z = (x – 1)² + (y – 2)²

Onder de voorwaarde:

  • x² + y² ≤ 4
  • x, y ≥ 0

In Pyomo kunnen we de beslissingsvariabelenx en y definiëren met grenzen van0 om de niet-negatieve eigenschap te waarborgen. Het doel functie is geschreven als de som van kwadraten van verschillen van specifieke punten, en de restrictie zorgt ervoor dat de oplossing binnen een cirkel van straal2.

In dit geval is de IPOPT-solver geschikt voor zijn vermogen om nonlineaire optimatieproblemen op te lossen:

import pyomo.environ as pyo model = pyo.ConcreteModel() # Definieer variabelen met ondergrens model.x = pyo.Var(bounds=(0, None)) model.y = pyo.Var(bounds=(0, None)) # Objectiefunction: minimeringsprobleem (x - 1)² + (y - 2)² model.obj = pyo.Objective(expr=(model.x - 1)**2 + (model.y - 2)**2, sense=pyo.minimize) # Beperking: x² + y² ≤ 4 (cirkel van straal 2) model.circle = pyo.Constraint(expr=model.x**2 + model.y**2 <= 4) solver = pyo.SolverFactory('ipopt') result = solver.solve(model) print('Optimal x:', pyo.value(model.x)) print('Optimal y:', pyo.value(model.y)) print('Minimum Z:', pyo.value(model.obj))

2. Mengelijke integerprogramming (MIP)

Mengelijke integerprogramming wordt gebruikt wanneer sommige beslissingsvariabelen gehele getallen zijn (vaak binair) terwijl andere continue zijn. Het is waardevol voor beslissingsproblemen zoals faciliteitenlocatie en productieplanning.

Probleemstelling

Een bedrijf moet beslissen of het magnieus in locaties A, B en C filiaalsteden aanmaakt. Het doel is het minimaliseren van het totale kosten, dat bestaat uit de vaststellende kosten van magazijnen en de transportkosten.

We beginnen met het initialiseren van de gegevens, inclusief de vaststellende kosten van magazijnen, transportkosten, capaciteitslimieten en de totale vraag:

locations = ['A', 'B', 'C'] FixedCost = {'A': 1000, 'B': 1200, 'C': 1500} TransportCost = {'A': 5, 'B': 4, 'C': 6} Capacity = {'A': 100, 'B': 80, 'C': 90} Demand = 150 model = pyo.ConcreteModel() # Binary variable: 1 indien magazijn open is, 0 anders model.y = pyo.Var(locations, domain=pyo.Binary) # Continuous variable: hoeveelheid goederen vervoerd model.x = pyo.Var(locations, domain=pyo.NonNegativeReals) model.cost = pyo.Objective( expr=sum(FixedCost[i] * model.y[i] + TransportCost[i] * model.x[i] for i in locations), sense=pyo.minimize ) # Vraagbeperking model.demand = pyo.Constraint(expr=sum(model.x[i] for i in locations) >= Demand) # Capaciteitsbeperkingen def capacity_rule(model, i): return model.x[i] <= Capacity[i] * model.y[i] model.capacity = pyo.Constraint(locations, rule=capacity_rule) solver = pyo.SolverFactory('cbc') result = solver.solve(model) for i in locations: print(f"Warehouse {i}: Open={pyo.value(model.y[i])}, Transported={pyo.value(model.x[i])}") print('Minimum Total Cost:', pyo.value(model.cost))

Het model bevat twee typen beslissingsvariabelen: een binary variabele y die aangeeft of een magazijn open is (1 indien open, 0 anders), en een continue variabele x die aangeeft hoeveel goederen vanuit elk magazijn worden vervoerd.

Het doel functie optelt de vastgelegde kosten en de transportkosten van elke distributeur en minimaliseert de totale kosten. De restricties zorgen ervoor dat de totaal aangevoerde goederen de vraag worden gedekt en dat de capaciteit van elke distributeur niet wordt overschreden indien deze open is.

3. Behandelen van meerdere doelstellingen

Soms betreft het zich bij optimisatieproblemen om meerdere doelstellingen die mogelijk in conflict kunnen zijn, zoals het maximum van de winst bij het minimum van de milieuwetenschappelijke impact. Een algemeen aanpak is de gewogen sommethode , waarbij elk doelstelling een gewicht wordt toegekend om zijn belang in evenwicht te brengen.

Probleemstelling

We streven ernaar maximaal rendement te behalen terwijl we de milieuschade minimaliseren:

  • Rendement: Z₁ = 3x + 5y
  • Milieuschade: Z₂ = 2x + y

We kunnen deze doelstellingen combineren door middel van gewichten w1=0.6, w2=0.4, zodat het totaaldoel een gewogen som wordt:

w1 = 0.6 w2 = 0.4 model.obj = pyo.Objective( expr=w1 * (3 * model.x + 5 * model.y) - w2 * (2 * model.x + model.y), sense=pyo.maximize )

In dit ge combineerd doel willen we rendement maximeren terwijl we de milieuschade minimaliseren door de gewichten aan te passen.

4. Gebruik van externe gegevensbronnen

Bij het werken met grote datasetten is het vaak handig om gegevens uit externe bronnen zoals CSV-bestanden te importeren. Pyomo werkt goed samen met Pandas voor het lezen en gebruiken van externe data.

We kunnen een CSV-bestand lezen met behulp van Pandas en de gegevens gebruiken om sets en parameters in ons model in te stellen:

import pandas as pd data = pd.read_csv('parameters.csv') # Definieer set uit CSV-gegevens model.I = pyo.Set(initialize=data['index'].unique()) # Definieer parameter die wordt geïnitialiseerd uit CSV-gegevens param_dict = data.set_index('index')['value'].to_dict() model.param = pyo.Param(model.I, initialize=param_dict)

Tips en Best Practices voor het gebruik van Pyomo

Bij het werken met Pyomo is het belangrijk om uw modellen efficiënt, goed gedocumenteerd en gemakkelijk te troubleshooten.

1. Debuggen en probleemoplossen

Bij het bouwen van optimalisatiemodellen in Pyomo komt het vaak voor om problemen tegen te komen zoals onmogelijke oplossingen, problemen met de solver of onjuiste resultaten. Hier zijn enkele best practices voor het debuggen:

  • Controleer beperkingen: Controleer uw beperkingen als uw model geen bruikbare oplossing genereert. Strenge beperkingen kunnen een probleem onbruikbaar maken. Gebruik Pyomo’s .display() methode om de waarden van variabelen en beperkingen af te drukken om te verifiëren of ze zo verwacht worden gedrag vertonen.
  • Solveruitvoer: Schakel gedetailleerde solverlogbestanden in door tee=True mee te geven bij het aanroepen van de solve() methode. Dit kan inzicht geven waar de solver wellicht moeite moet doen, zoals onbounded variabelen of onmogelijkheid.
  • Test eerst eenvoudige modellen: Bij complexe modellen test u een vereenvoudigde versie. Dit kan helpen potentiële problemen te isoleren zonder de overhead van een volledig gespecificeerde model.

Bij het debuggen is een systematisch aanpak veel gemakkelijker als u erop toe gaat, door analyse van beperkingen, de objectiefunctie en oplosserreacties.

2. Modellen efficiency

Optimisatieproblemen kunnen computationeel duur worden als de grootte van het model toeneemt. Om een efficiënte modellering te verzekeren, overweeg de volgende tips:

  • Gebruik sparsiteit: Vermijd het doorlopen van onnodige indexen bij het definiëren van beperkingen of doelstellingen. Door de sparsiteit in uw probleem te benutten, wordt de rekentijd verminderd.
  • Binair versus continue variabelen: Waar mogelijk, reduceer het aantal binaire of integrerende variabelen. Continue variabelen zijn gemakkelijker voor oplossers te handelen, wat tot sneller oplossingen leidt.
  • Beperkingsvormulering: Behoud beperkingen zo eenvoudig mogelijk, zowel op mathematicologische als op implementatie manier. Vermijd onnodige niet-lineaireiteiten en breek complexe beperkingen af in kleinere, begrijpbaardere eenheden.

Efficiente modellen oplossen sneller en zijn gemakkelijker te debuggen en te onderhouden.

3. Documentatie en onderhoud

Het onderhouden van goed gedocumenteerde Pyomo-modellen is een goede praktijk voor langetermijngebruik en samenwerking. Goede documentatie maakt het ook gemakkelijker om modellen over tijd terug te bezoeken en bij te werken:

  • Gebruik inline commentaren: Voeg altijd commentaren toe om de bedoeling van variabelen, beperkingen en de doel functie te verklaren. Dit is bijzonder belangrijk in optimaal modellen waar de logica wellicht niet direct duidelijk is.
  • Moduleer uw code: Scheid uw model in logische secties of zelfs afzonderlijke functies. Deze modulair benadering kan de leesbaarheid verbeteren en het debuggen en wijzigen van specifieke delen van het model gemakkelijker maken.
  • Volg modelwijzigingen:Houd een versiegeschiedenis van uw model bij, vooral als het voortdurend wordt ontwikkeld. Gebruik versiebeheergereedschappen zoals Git om wijzigingen te volgen en zorg ervoor dat elke updates of verbeteringen teruggevoerd kunnen worden.

Goede documentatie en gestructureerd code zal uw Pyomo-modellen gemakkelijker toegankelijk maken voor toekomstige samenwerkingspartners en gemakkelijker schaalbaar of aan te passen zijn als uw eisen evolueren.

Conclusie

Pyomo is een krachtig en flexibel gereedschap voor het bouwen en oplossen van optimalisatieschema’s in Python. Tijdens deze handleiding hebben we gezien hoe Pyomo gebruikers toestaat om verschillende optimalisatieproblemen te modelleren, van lineaire programmering tot niet-lineaire en gemengde gehele getallen programmering.

Met zijn gebruiksvriendelijke syntaxis en integratie met oplossers maakt Pyomo het formuleren en oplossen van echte-wereld optimalisatieproblemen toegankelijk voor zowel beginners als gevorderde gebruikers.

Als u geïnteresseerd bent in meer informatie over het oplossen van echte-wereld problemen met optimalisatie, kijk dan eens naar de gratis cursus Introductie tot optimalisatie in Python op DataCamp!

Source:
https://www.datacamp.com/tutorial/pyomo