[PYTHON] Lassen Sie uns Bücher mit Kombinationsoptimierung flach stapeln

Hintergrund

Ich versuche, ein Online-Meeting auf meinem Laptop zu haben. Die Position des Notebooks ist niedrig, sodass der Winkel der Kamera von unten ist. Ich möchte die Höhe meines Notebooks in Eile erhöhen, kann aber nur wenige Bücher verwenden. Notebooks sind größer als Bücher, daher müssen Sie Bücher in zwei Reihen stapeln. Wenn die Höhen der Bücher in den beiden Reihen unterschiedlich sind, ist die Balance schlecht, daher möchte ich die Höhen der Bücher in den beiden Reihen gleich machen.

Problem

Stapeln Sie einige Bücher in zwei Reihen und machen Sie sie so hoch wie möglich. Zu diesem Zeitpunkt sollte der Höhenunterschied zwischen den beiden Buchreihen bis zu 1 mm betragen.

Denkweise

Lösen Sie mit Kombinationsoptimierung. Das Verfahren besteht darin, das Problem zu formulieren, ein Modell in Python zu erstellen und es mit einem Löser zu lösen. Siehe auch Python in Optimization.

Formulierung

--Eingabeparameter --books: Höhe jedes Buches --limit: Obergrenze des Höhenunterschieds zwischen 2 Spalten --Variable --obj: Die untere der Höhen der beiden Reihen --suml: Höhe in der linken Spalte --sumr: Höhe in der rechten Spalte --vl: Gibt an, ob jedes Buch in der linken Spalte gestapelt werden soll (0: nicht stapeln, 1: stapeln) --vr: Gibt an, ob jedes Buch in der rechten Spalte gestapelt werden soll (0: nicht stapeln, 1: stapeln)

Lösen wir es mit Python

Eingabeparameter werden entsprechend mit Zufallszahlen erstellt.

import random
from ortoolpy import model_max, addvars, addbinvars, lpDot, value

random.seed(1)
books = [random.randint(10, 20) for _ in range(20)]  #Buchdicke (mm)
limit = 1  #Zulässiger Unterschied zwischen linker und rechter Höhe (mm)

n = len(books)
m = model_max()  #Mathematisches Modell
obj, suml, sumr = addvars(3)  #Niedrigere Höhe, linke Höhe, rechte Höhe
vl = addbinvars(n)  #Stellen Sie das Buch links
vr = addbinvars(n)  #Stellen Sie das Buch rechts
m += obj  #Zielfunktion (so hoch wie möglich machen)
m += obj <= suml  # (1)
m += obj <= sumr  # (1)
m += suml == lpDot(books, vl)  # (2)
m += sumr == lpDot(books, vr)  # (3)
m += suml - sumr <= limit  # (4)
m += sumr - suml <= limit  # (4)
for vli, vri in zip(vl, vr):
    m += vli + vri <= 1  # (5)
m.solve()  #Mit Löser lösen
print(f'{m.status = }')
print(f'{value(suml) = }')
print(f'{value(sumr) = }')
print(f'{[int(value(vli) - value(vri)) for vli, vri in zip(vl, vr)]}')

lpDot (X, Y) ist das innere Produkt von X und Y. "LpDot (books, vl)" ist also die Höhe der linken Spalte.

Ausgabe

m.status = 1
value(suml) = 149.0
value(sumr) = 148.0
[-1, -1, -1, 1, -1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, -1, -1, 1, 1, -1]

"m.status = 1" bedeutet, dass die optimale Lösung erhalten wurde. value (X) erhält den Wert der Variablen X. Die Höhe der linken Spalte beträgt 149 mm, die Höhe der rechten Spalte beträgt 148 mm und die Differenz beträgt 1 mm. Die endgültige Liste zeigt, dass 1 in der linken Spalte und -1 in der rechten Spalte steht.

Beiseite

Das Obige kann in 0,1 Sekunden berechnet werden, aber wenn "Limit" auf 0 gesetzt ist, beträgt die Berechnungszeit 24 Sekunden (240 Mal). Wie Sie sehen, kann sich bei der Kombinationsoptimierung die Berechnungszeit erheblich ändern, wenn sich die Parameter geringfügig ändern. Wenn Sie das "Limit" auf verschiedene Arten ändern möchten, müssen Sie möglicherweise etwas wie "So lösen Sie das Problem beim Verpacken von Behältern" entwickeln.

Recommended Posts

Lassen Sie uns Bücher mit Kombinationsoptimierung flach stapeln
Gruppieren von Spielen mit Kombinationsoptimierung
Kombinationsoptimierung mit Quantenglühen
Lösen Sie ein 4-Farben-Problem mit Kombinationsoptimierung
Sehen Sie sich Wale mit Kombinationsoptimierung an
Bereiten Sie die Straße mit Kombinationsoptimierung
Spieltheorie mit Kombinationsoptimierung lösen
Lösen wir das Portfolio mit kontinuierlicher Optimierung
Lösen von Planungsproblemen für Krankenschwestern mit Kombinationsoptimierung
Erstellen Sie ein akademisches Programm mit Kombinationsoptimierung
Lassen Sie uns den Datumsverlauf durch Kombinationsoptimierung festlegen
Lösen von Problemen bei der Organisation von Schulbezirken durch Kombinationsoptimierung
Lösen des N Queen-Problems mit kontinuierlicher / kombinierter Optimierung
Lösen des N Queen-Problems mit Kombinationsoptimierung
Verwenden Sie die Kombinationsoptimierung
Mit OR-Tools erlernte Optimierung [Linearer Plan: Lassen Sie uns Öl raffinieren]
Straßeninstallation durch Optimierung
Gruppierung nach Kombinationsoptimierung
Einführung in die Optimierung
Lassen Sie uns die Vorlesung der PyCon JP 2016 durch Kombinationsoptimierung entscheiden
Lassen Sie uns die Position der Feuerwehr durch Kombinationsoptimierung bestimmen