Lösen Sie auf der Grundlage der Wünsche des Schülers das "Problem der Zuweisung von Klassenmitgliedern" als passendes Problem.
Dieses Mal werden wir es als passendes Problem lösen. Wenn die erforderliche Anzahl von Mitgliedern n beträgt, muss dazu die Anzahl der Knoten für dieses Mitglied auf n erhöht werden. Da es auf Maximales Gewicht, maximales Übereinstimmungsproblem eingestellt ist, wird das Gewicht w in "40 - w" konvertiert.
import networkx as nx
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}
g = nx.Graph()
lst2 = [(s, f'{c}{i}', 40 - w) for s, c, w in lst for i in range(need[c])]
g.add_weighted_edges_from(lst2)
print(nx.max_weight_matching(g, maxcardinality=True))
Ausgabe
{('Kaguya', 'Bibliotheksausschuss 1'),
('Chino', 'Klassenvertreter 0'),
('Bibliotheksausschuss 0', 'Aoba'),
('Disziplinarkommissar 0', 'Spiegel'),
('Disziplinarkommissar 1', 'Taprice')}
Ich habe die gleiche Lösung wie der Originalartikel und der oben genannte.
Matching wird in vielen Teilen der Gesellschaft eingesetzt. Zum Beispiel wird es auf der Website des Lehrers vorgestellt, der das Matching unten studiert (Stable Matching) (https: :) anstelle von Weight Matching. //qiita.com/SaitoTsutomu/items/2ec5f7626054f4b4de63)).
Referenz: https://www.nii.ac.jp/faculty/informatics/yokoi_yu/
Dieses Mal habe ich es mit networkx.max_weight_matching
(Edmonds-Methode) gelöst, aber bei der Lösung eines echten Problems kann das mathematische Optimierungsmodell das Modell flexibler erstellen und [schneller berechnen](https: / /qiita.com/SaitoTsutomu/items/7fd199a95d78a6f3b741).