[PYTHON] Mit OR-Tools Part0 erlernte Optimierung [Einführung]

Dieser Blog ist was

Wir lernen die mathematische Optimierung mit von Google entwickelten OR-Tools. Der größte Teil des Inhalts basiert auf diesem Buch. Practical Python AI Projects: Mathematical Models of Optimization Problems with Google OR-Tools (English Edition)

Klicken Sie hier, um eine Liste der Codes nach Autor anzuzeigen Der in diesem Blog beschriebene Code entspricht fast dem Originalcode des Autors und ist nur teilweise auf Japanisch korrigiert.

Mathematische Genauigkeit und theoretischer Kommentar haben eine niedrige Priorität. Bitte verzeih mir.

Diesmal: Eingeführt

Anhand eines einfachen Beispiels ・ Was ist das Optimierungsproblem? ・ Wie benutzt man OR-Tools? Ich werde studieren

Szeneneinstellung

Sie sind für Amphibien in der Tierhandlung verantwortlich. Es scheint, dass sie Hikigaeru, Sanshou und Molch im selben Panzer halten. Ich möchte so viele wie möglich behalten, aber das Essen ist begrenzt. Übrigens, ** Essen ist Wasser, Kricket, Fliege ** (warum ist das ein Beispiel?) Je nach Art ist die Anzahl der Lebensmittel, die Sie an einem Tag essen, unterschiedlich. ** Wie können Sie die meisten Lebensmittel insgesamt aufbewahren? **


Menge an Nahrung pro Tag für jede Amphibie

Köder Hiki Frosch Sanshou Newt Nummer, die vorbereitet werden kann
Mizu 2 1 1 1500
Kricket 1 3 2 3000
Fliegen 1 2 3 5000

Formulierung

Legen Sie zunächst die Entscheidungsvariable fest. Dieses Mal werden wir nach "der Anzahl der Frösche, Sardinen und Molche fragen, die die Gesamtzahl maximieren".

\begin{align}
&x_0 :Hiki Frosch\\
&x_1 :Sanshou\\
&x_2 :Newt\\
\end{align}\\
Jedoch 0\leq x_i \leq 1000

Die Funktion, die ich diese Zeit maximieren möchte, ist

x_0 + x_1 + x_2

Dach. Es ist in Ordnung, wenn Sie jeweils 1000 Tiere halten! Es gibt jedoch Einschränkungen für Lebensmittel. Ich habe 1500 Mizus, ich esse 2 Frösche pro Tag, 1 Sardine und 1 Molch.

2x_0 + x_1 + x_2 \leq 1500

Ähnliches gilt für Grillen und Fliegen.

x_0 + 3x_1 + 2x_2 \leq 3000\\
x_0 + 2x_1 + 3x_2 \leq 5000

Nun zur Implementierung

Es besteht aus der Definition eines oder mehrerer Löser und dem Hinzufügen von Variablen, Zielfunktionen und Einschränkungen (Hinzufügen). Bei der Definition werden der Titel des Lösers (diesmal "Koexistenz von Amphibien") und der zu verwendende Löser (diesmal GLOP) als Argumente angegeben. GLOP ist ein linearer Planungslöser.

coexistence.py


from ortools.linear_solver import pywraplp

def solve_coexistence():
    t = 'Koexistenz von Amphibien'
    s = pywraplp.Solver(t, pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)
    
    x = [s.NumVar(0, 1000, 'x[%i]' % i) for i in range(3)]  # 0 <= x <=1000. Determinante Variable
    pop = s.NumVar(0, 3000, 'pop')                          # 0 <= pop <=3000. Objektive Variable
    
    s.Add(2*x[0] + x[1] + x[2] <= 1500)       #Mizu-Einschränkung
    s.Add(x[0] + 3*x[1] + 2*x[2] <= 3000)     #Cricket-Einschränkung
    s.Add(x[0] + 2*x[1] + 3*x[2] <= 4000)     #Fliegen Einschränkung
    s.Add(pop == x[0] + x[1] + x[2])          #Zielfunktion
    s.Maximize(pop)                           #Geben Sie an, dass Sie den Pop maximieren möchten
    s.Solve()                                 #lösen


    ##Gibt den Wert der Zielfunktion und den Wert der Determinante zurück
    return pop.SolutionValue(), [e.SolutionValue() for e in x]

Klicken Sie hier, um den auszuführenden Code anzuzeigen

test_coexistence.py


from __future__ import print_function
from coexistence import solve_coexistence

pop, x = solve_coexistence()  #Rufen Sie die definierte Funktion auf und speichern Sie das Ergebnis
T = [['Art', 'Nummer']]          #Spaltenname bei der Anzeige von Ergebnissen
for i in range(3):
    T.append([['Hiki Frosch','Sanshou','Newt'][i], x[i]])   #Fügen Sie der Zeile i den Namen und die Anzahl der Personen hinzu
T.append(['gesamt', pop])

for e in T:
    print(e[0], e[1])

Ausführungsergebnis

Art Nummer
Hiki Frosch 100.0
Sanshou 300.0
Newt 1000.0
gesamt 1400.0

Ja, das ist die optimale Lösung. Es gibt zu viele Molche und man kann lachen Ich weiß nicht, dass Molche viel Mizu und Grillen essen (ein paar) und viele Fliegen essen (viel), also habe ich viele davon bekommen. In Wirklichkeit würde ich gerne viel investieren, weil Sanshou sich am besten verkauft, oder ich möchte nicht so viel neue Kartoffeln verkaufen, aber diesmal wird es eingeführt, also hier.

Ich habe gerade festgestellt, dass ich das nächste Mal mehr über die Verwendung von OR-Tools sprechen werde. Was hast du dann dieses Mal gemacht?

Recommended Posts

Mit OR-Tools Part0 erlernte Optimierung [Einführung]
Mit OR-Tools erlernte Optimierung [Lineare Planung: Mehrstufiges Modell]
Mit OR-Tools erlernte Optimierung [Lineare Planung: Projektmanagement]
Mit OR-Tools erlernte Optimierung [Linearer Plan: Lassen Sie uns Öl raffinieren]
Straßeninstallation durch Optimierung
Sandkasten mit neo4j Teil 10
Einführung in PyQt4 Teil 1
Einführung in die Optimierung
Einführung in das maschinelle Lernen mit scikit-learn-Von der Datenerfassung bis zur Parameteroptimierung
Lösen mathematischer Optimierungsmodellübungen mit den OR-Tools von Google (3) Probleme bei der Produktionsoptimierung
Lösen Sie mathematische Optimierungsmodellübungen mit den OR-Tools von Google (4) Lösen Sie Zahlenstellen
Einführung in die Socket-API in C Language 2nd Client Edition
Bildverarbeitung mit Python (Teil 2)
Maschinelles Lernen mit Pokemon gelernt
Versuchen Sie die Funktionsoptimierung mit Optuna
Python mit freeCodeCamp Teil1 studieren
Angrenzende Bilder mit Python Teil 1
Schaben mit Selen + Python Teil 1
Gruppieren von Spielen mit Kombinationsoptimierung
Stellen Sie unzusammenhängende Fotos mit Optimierung wieder her!
Einführung in RDB mit sqlalchemy Ⅰ
Python studieren mit freeCodeCamp part2
Einführung in die nichtlineare Optimierung (I)
Mit Pyradiomics erlernte Texturanalyse
Bildverarbeitung mit Python (Teil 1)
Kombinationsoptimierung mit Quantenglühen
Nampre mit Python lösen (Teil 2)
Globale Allzweckoptimierung mit Z3
Bildverarbeitung mit Python (3)
Schaben mit Selen + Python Teil 2
Einführung in die Bayes'sche Optimierung
Einführung in Ansible Teil In'Inventory '
Passen Sie die Hyperparameter mit der Bayes'schen Optimierung an
Einführung in Ansible Teil ④'Variable '
Einführung in die Socket-API in C-Sprache 3. TCP-Server / Client Nr. 1
Einführung in die in C Language Part 1 Server Edition erlernte Socket-API
Einführung in die in C-Sprache gelernte Socket-API 4. UDP Server / Client Edition Nr. 1