Ravi de vous rencontrer, tout le monde! J'écrirai l'article d'aujourd'hui. Immédiatement, cette fois, je voudrais écrire sur le problème d'horaire sportif. Prenons le football comme exemple, mais comment décidez-vous d'un programme de football? En regardant la ligue J1, 18 équipes ont un bon équilibre entre domicile et extérieur! Créer un tel planning est en fait le même que le problème d'optimisation! Cette fois, résolvons ce problème de planification en utilisant la pulpe de Python!
Planifiez une ligue de 6 équipes et 10 matchs. Par condition, la maison et l'extérieur ne sont pas autorisés trois fois de suite. La maison est 5 fois pour chaque équipe! !! Si la saison d'ouverture est à la maison, la saison de fermeture est loin! !! Et vice versa! !! Nous organiserons cet horaire pour minimiser la distance parcourue par l'équipe.
python
from pulp import *
import numpy as np
#Réunion d'équipe
team = ["A", "Y", "T","K","O","H"]
print("Ensemble d'équipe I= {:}".format(team))
#Ensemble de clauses
setu = ["1", "2", "3", "4", "5","6","7","8","9","10"]
print("Ensemble de clauses setu= {:}".format(setu))
#distance
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("")
L'équipe a amené mon équipe préférée de la ligue J1! cc est un cortège d'équipes en compétition, partant de la rangée du haut, dans l'ordre des équipes A, Y, T, K, O, H. Je suppose qu'il y a 10 colonnes dans certaines sections. Mettez les distances dans le tableau de c. En co, mettez l'équipe de combat.
python
#Déclaration du problème
SportsScheduling = pulp.LpProblem("SportsScheduling", pulp.LpMinimize) #Défini comme le plus petit problème
#Déclaration de variable
x = {}
for t in team:
for s in setu:
x[t, s] = pulp.LpVariable("x({:},{:})".format(t,s), 0, 1, pulp.LpInteger )
#Fonction objective
SportsScheduling += pulp.lpSum( c[t,s]*x[t,s] for t in team for s in setu), "TotalCost"
#Contraintes
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
#Alignement avec les adversaires
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()
Je pense que c'est le plus important. Cela me rend somnolent. .. .. .. Définissez la variable. 0 pour la maison et 1 pour l'extérieur. Vous pouvez obtenir la distance en multipliant la distance précédente par cette variable. La maison ne bouge pas, donc 0. Multipliez par 1 pour vous éloigner.
Par contrainte, si trois matchs consécutifs valent 1 ou plus et 2 ou moins, la maison à l'extérieur ne sera pas trois fois de suite. De plus, par exemple, X jouera contre Y. Dans ce cas, l'un ou l'autre doit être égal à 1 et l'un ou l'autre doit être égal à 0. pour cette raison. Nous avons également mis cette contrainte afin de faire cette correspondance.
5 matchs sur 10 sont à domicile, donc 5 ou moins sont requis. Ajoutez 1 aux clauses d'ouverture et de clôture.
Les conditions sont maintenant réunies! !! !! !! !!
for t in team:
for s in setu:
print("x[{:},{:}] = {:} ".format(t, s, x[t,s]), end = "")
print("")
print("")
print("La formule en question")
print("--------")
print(SportsScheduling)
print("--------")
print("")
print("Résultat du calcul")
print("")
print("Solution x[i,j]: ")
for t in team:
for s in setu:
print("{:}, "
.format( x[t,s].value()), end="")
print("")
print("")
Solution 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,
............ J'ai pu le faire pour le moment w
Je pense que je peux mieux le construire. Cela semble intéressant car il semble que cela puisse aussi être un problème de minimisation de rupture!
Je voudrais m'attaquer profondément à ce problème à l'avenir!
Merci d'avoir regardé.
Nous continuerons à grandir dans le futur! Puis!
Recommended Posts