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.
Anhand eines einfachen Beispiels ・ Was ist das Optimierungsproblem? ・ Wie benutzt man OR-Tools? Ich werde studieren
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? **
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 |
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
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])
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