[PYTHON] Können Sie die Sportplanung lösen?

Sportplanungsproblem

Schön euch kennenzulernen! Ich werde den Artikel von heute schreiben. Dieses Mal möchte ich sofort über das Problem der Sportplanung schreiben. Nehmen wir als Beispiel Fußball, aber wie entscheiden Sie sich für einen Fußballplan? Mit Blick auf die j1-Liga haben 18 Teams eine gute Balance zwischen Heim und Auswärts! Das Erstellen eines solchen Zeitplans entspricht dem Optimierungsproblem! Lösen wir dieses Mal dieses Planungsproblem mit Pythons Zellstoff!

Problemstellung

Planen Sie eine Liga mit 6 Teams und 10 Spielen. Heim und Auswärts dürfen nicht dreimal hintereinander sein. Zuhause ist 5 mal für jedes Team! !! Wenn die Eröffnungssaison zu Hause ist, ist die Schlusssaison weg! !! Und umgekehrt! !! Wir werden diesen Zeitplan organisieren, um die vom Team zurückgelegte Strecke zu minimieren.

Zunächst die Vorbereitung

python


from pulp import *
import numpy as np
#Teamtreffen
team = ["A", "Y", "T","K","O","H"]
print("Team Set I.= {:}".format(team))

#Satz von Klauseln
setu = ["1", "2", "3", "4", "5","6","7","8","9","10"]

print("Satz von Sätzen setu= {:}".format(setu))



#Entfernung
cc = [
      [ "H","T","O","Y","K","H","T","O","Y","K"],
      [ "O","H","K","A","T","O","H","K","A","T"],
      [ "K","A","H","O","Y","K","A","H","O","Y"],
      [ "T","O","Y","H","A","T","O","Y","H","A"],
      [ "Y","K","A","T","H","Y","K","A","T","H"],
      [ "A","Y","T","K","O","A","Y","T","K","O"],
     ]

c2 = [
      [ 912,100,528,130,116,912,100,528,130,116],
      [ 488,792,16,130,35,488,792,16,130,35],
      [ 20,100,810,506,35,20,100,810,506,35],
      [ 20,500,16,804,116,20,500,16,804,116],
      [ 488,500,528,506,330,488,500,528,506,330],
      [ 912,792,810,804,330,912,792,810,804,330],
     ]

c={}
for t in team:
    for s in setu:
        c[t,s]=c2[team.index(t)][setu.index(s)]
        
co={}
for t in team:
    for s in setu:
        co[t,s]=cc[team.index(t)][setu.index(s)]
        
print("Match c[t,s]: ")
for t in team:
    for s in setu:
        print("c[{:},{:}] = {:}, ".format(t, s, c[t,s]), end = "")

    print("")
print("")

Das Team brachte mein Lieblings-J1-Ligateam mit! cc ist eine Prozession konkurrierender Teams, beginnend in der obersten Reihe, in der Reihenfolge der Teams A, Y, T, K, O, H. Ich denke, es gibt 10 Spalten in einigen Abschnitten. Tragen Sie die Abstände in das Array von c ein. In co setzen Sie das Kampfteam.

Hauptthema

python



#Problemerklärung
SportsScheduling = pulp.LpProblem("SportsScheduling", pulp.LpMinimize) #Definiert als das kleinste Problem

#Variable Aussage
x = {}
for t in team:
    for s in setu:
        x[t, s] = pulp.LpVariable("x({:},{:})".format(t,s), 0, 1, pulp.LpInteger )

#Zielfunktion
SportsScheduling += pulp.lpSum( c[t,s]*x[t,s]  for t in team for s in setu), "TotalCost"




#Einschränkungen
for t in team:
    SportsScheduling += x[t,"1"]+x[t,"2"]+x[t,"3"]  >= 1 
    SportsScheduling += x[t,"2"]+x[t,"3"]+x[t,"4"]  >= 1 
    SportsScheduling += x[t,"3"]+x[t,"4"]+x[t,"5"]  >= 1 
    SportsScheduling += x[t,"4"]+x[t,"5"]+x[t,"6"]  >= 1 
    SportsScheduling += x[t,"5"]+x[t,"6"]+x[t,"7"]  >= 1 
    SportsScheduling += x[t,"6"]+x[t,"7"]+x[t,"8"]  >= 1 
    SportsScheduling += x[t,"7"]+x[t,"8"]+x[t,"9"]  >= 1 
    SportsScheduling += x[t,"8"]+x[t,"9"]+x[t,"10"]  >= 1 
    
    SportsScheduling += x[t,"1"]+x[t,"2"]+x[t,"3"]  <= 2 
    SportsScheduling += x[t,"2"]+x[t,"3"]+x[t,"4"]  <= 2 
    SportsScheduling += x[t,"3"]+x[t,"4"]+x[t,"5"]  <= 2 
    SportsScheduling += x[t,"4"]+x[t,"5"]+x[t,"6"]  <= 2
    SportsScheduling += x[t,"5"]+x[t,"6"]+x[t,"7"]  <= 2 
    SportsScheduling += x[t,"6"]+x[t,"7"]+x[t,"8"]  <= 2 
    SportsScheduling += x[t,"7"]+x[t,"8"]+x[t,"9"]  <= 2 
    SportsScheduling += x[t,"8"]+x[t,"9"]+x[t,"10"]  <= 2 
    
#Ausrichtung mit Gegnern
for t in team:
    for s in setu:
        SportsScheduling += x[co[t,s],s]+x[t,s]  == 1 

for t in team:
    SportsScheduling += sum(x[t,s] for s in setu) <= 5
    
for t in team:
     SportsScheduling += x[t,"1"]+x[t,"10"] == 1   
    
SportsScheduling.solve()

Ich halte das für das Wichtigste. Es macht mich schläfrig. .. .. .. Definieren Sie die Variable. 0 für zu Hause und 1 für unterwegs. Sie können die Entfernung ermitteln, indem Sie die vorherige Entfernung mit dieser Variablen multiplizieren. Zuhause bewegt sich nicht, also 0. Multiplizieren Sie mit 1, um sich zu entfernen.

Wenn drei aufeinanderfolgende Spiele 1 oder mehr und 2 oder weniger sind, ist das Auswärtsspiel nicht dreimal hintereinander. Außerdem spielt X beispielsweise gegen Y. In diesem Fall muss entweder 1 und 0 sein. aus diesem Grund. Wir haben diese Einschränkung auch festgelegt, um diese Übereinstimmung zu erzielen.

5 von 10 Spielen sind zu Hause, daher sind 5 oder weniger erforderlich. Fügen Sie den Eröffnungs- und Schließungsklauseln 1 hinzu.

Die Bedingungen sind jetzt erfüllt! !! !! !! !!

Mal sehen, das Ergebnis!


for t in team:
    for s in setu:
        print("x[{:},{:}] = {:} ".format(t, s, x[t,s]), end = "")
    print("")
print("")

print("Die fragliche Formel")
print("--------")
print(SportsScheduling)
print("--------")
print("")




print("Berechnungsergebnis")
print("")

print("Lösung x[i,j]: ")
for t in team:
    for s in setu:
        print("{:},  "
              .format( x[t,s].value()), end="")
    print("")
print("")




Lösung x[i,j]: 
0.0,  0.0,  1.0,  1.0,  0.0,  1.0,  1.0,  0.0,  0.0,  1.0,  
1.0,  1.0,  0.0,  0.0,  1.0,  1.0,  0.0,  0.0,  1.0,  0.0,  
0.0,  1.0,  0.0,  1.0,  0.0,  1.0,  0.0,  0.0,  1.0,  1.0,  
1.0,  0.0,  1.0,  0.0,  1.0,  0.0,  0.0,  1.0,  1.0,  0.0,  
0.0,  1.0,  0.0,  0.0,  1.0,  0.0,  1.0,  1.0,  0.0,  1.0,  
1.0,  0.0,  1.0,  1.0,  0.0,  0.0,  1.0,  1.0,  0.0,  0.0,  

............ Ich konnte es vorerst tun w

Ich denke, ich kann es besser bauen. Es scheint interessant zu sein, weil es auch ein Problem der Pausenminimierung sein kann!

Ich möchte dieses Problem in Zukunft intensiv angehen!

Danke fürs Zuschauen.

Wir werden auch in Zukunft weiter wachsen! Dann!

Recommended Posts

Können Sie die Sportplanung lösen?
Können Sie diese Datei löschen?
Kalman Filter, den Sie verstehen können
"Obake" kann von "dir" gesungen werden
Python | Was Sie mit Python machen können
Programmierer 8. Klasse [Gerade oder ungerade (gerade oder ungerade)] Können Sie dieses Programmierproblem lösen? !!