[PYTHON] Junior High School Komitee

Was ist das

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.

Politik

--Erstelle einen Pandas.DataFrame mit einer Aufzeichnung der Wünsche des Studentenkomitees.

Mathematisches Optimierungsmodell

--Variable: Erstellt als Spalte von DataFrame (1 Zeile, 1 Variable).

Eingang

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)

Modellieren und Lösen

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)

Ergebnis

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

Ergänzung

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

Junior High School Komitee
Junior High School Committee (Network X Version)
SIR-Modell, das auch Schüler der Mittelstufe verstehen können
Lassen Sie uns ein automatisches Faktorisierungsgerät / Junior High School Mathematics Vol.1 erstellen
[High School Mathematik + Python] Logistikproblem
Skript von "Programmierbuch ab Grund- und Mittelschülern"
Einführung in die mathematische Optimierung von Python Lösen von Mathematikproblemen der Mittelstufe mit Zellstoff
[Python] Ein Schüler der Mittelstufe implementierte Perceptron und versuchte, Iris zu klassifizieren.
Ich habe versucht, den Code des Python-Anfängers (Schüler der Mittelstufe) zu überarbeiten.