Basierend auf den Wünschen der Schüler werden wir das "Problem der Zuweisung von Klassenmitgliedern" durch Kombinationsoptimierung lösen. Dies ist die Python-Version von Eine Geschichte über die Optimierung des Junior High School-Komitees zu den niedrigsten Kosten.
--Erstelle einen Pandas.DataFrame mit einer Aufzeichnung der Wünsche des Studentenkomitees.
--Variable: Erstellt als Spalte von DataFrame (1 Zeile, 1 Variable).
Erstellen Sie einen DataFrame.
import pandas as pd
from pulp import lpDot, lpSum
from ortoolpy import model_min, addbinvars, addvals
lst = [['Taprice', 'Disziplinarausschuss', 10], ['Aoba', 'Klassensprecher', 10], ['Kaguya', 'Disziplinarausschuss', 10],
['Chino', 'Klassensprecher', 10], ['Spiegel', 'Disziplinarausschuss', 10],
['Taprice', 'Klassensprecher', 30], ['Aoba', 'Bibliothekskommission', 30], ['Kaguya', 'Bibliothekskommission', 30],
['Chino', 'Disziplinarausschuss', 30], ['Spiegel', 'Klassensprecher', 30]]
need = {"Klassensprecher": 1, "Bibliothekskommission": 2, "Disziplinarausschuss": 2}
df = pd.DataFrame(lst, columns=['Name', 'Committee', 'Cost'])
addbinvars(df)
print(df)
Name | Committee | Cost | Var | |
---|---|---|---|---|
0 | Taprice | Disziplinarausschuss | 10 | v000001 |
1 | Aoba | Klassensprecher | 10 | v000002 |
2 | Kaguya | Disziplinarausschuss | 10 | v000003 |
3 | Chino | Klassensprecher | 10 | v000004 |
4 | Spiegel | Disziplinarausschuss | 10 | v000005 |
5 | Taprice | Klassensprecher | 30 | v000006 |
6 | Aoba | Bibliothekskommission | 30 | v000007 |
7 | Kaguya | Bibliothekskommission | 30 | v000008 |
8 | Chino | Disziplinarausschuss | 30 | v000009 |
9 | Spiegel | Klassensprecher | 30 | v000010 |
Die Var-Spalte ist variabel (1: zuweisen, 0: nicht zuweisen)
m = model_min()
m += lpDot(df.Cost, df.Var) #Summe der gewünschten Kosten
for _, gr in df.groupby('Name'):
m += lpSum(gr.Var) <= 1 #Bis zu einem Mitglied kann Student sein
for k, gr in df.groupby('Committee'):
m += lpSum(gr.Var) == need[k] #Die Mitglieder des Ausschusses treffen eine feste Anzahl
m.solve()
addvals(df)
print(df[df.Val > 0])
Name | Committee | Cost | Var | Val | |
---|---|---|---|---|---|
0 | Taprice | Disziplinarausschuss | 10 | v000001 | 1 |
3 | Chino | Klassensprecher | 10 | v000004 | 1 |
4 | Spiegel | Disziplinarausschuss | 10 | v000005 | 1 |
6 | Aoba | Bibliothekskommission | 30 | v000007 | 1 |
7 | Kaguya | Bibliothekskommission | 30 | v000008 | 1 |
Im Originalartikel handelt es sich um das Problem des minimalen Kostenflusses. In diesem Fall können Sie min_cost_flow
von Network X verwenden.
Wenn Sie das Modell jedoch ändern möchten, ist ein mathematisch optimiertes Modell wie dieser Artikel einfacher zu handhaben. Die Berechnungszeit für die mathematische Optimierung ist ebenfalls schnell genug.
Recommended Posts