103 lines
2.7 KiB
Python
103 lines
2.7 KiB
Python
# %%
|
|
import json
|
|
from datetime import datetime, time, date
|
|
from serializers import ProblemSerializer
|
|
|
|
|
|
from competitions import get_teams_from_staffel
|
|
from schluesselzahlen import get_schluesselzahlen
|
|
from rahmentermine import get_rahmentermine
|
|
|
|
|
|
PROJECT_PATH = '/home/md/Work/ligalytics/leagues_stable/'
|
|
import os, sys
|
|
sys.path.insert(0, PROJECT_PATH)
|
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "leagues.settings")
|
|
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
|
|
|
|
""" read json """
|
|
with open("data/competitions.json", "r", encoding="utf-8") as f:
|
|
competitions = json.load(f)
|
|
|
|
prob = ProblemSerializer(data=competitions)
|
|
prob.is_valid()
|
|
|
|
# %%
|
|
""" Create pulp model for solving a schedule for a given set of teams and rahmentermine """
|
|
|
|
|
|
rounds1 = list(range(1, len(rahmentermine)//2+1))
|
|
rounds2 = list(range(len(rahmentermine)//2+1, len(rahmentermine)+1))
|
|
rounds = rounds1 + rounds2
|
|
|
|
|
|
|
|
|
|
|
|
# %%
|
|
|
|
from pulp import LpVariable, LpProblem, LpMinimize, lpSum, LpStatus, value, LpInteger, XPRESS
|
|
|
|
model = LpProblem("Spielplan", LpMinimize)
|
|
|
|
# Create a variable for each team and each rahmentermin
|
|
x = {}
|
|
for team, attr in teams.items():
|
|
for round in rounds:
|
|
x[(team, round)] = LpVariable(
|
|
f"team_{attr['MANNSCHAFT']}_{round}",
|
|
lowBound=0,
|
|
upBound=1,
|
|
cat=LpInteger,
|
|
)
|
|
|
|
# Create home variables """
|
|
home = {}
|
|
for team, attr in teams.items():
|
|
for round in rounds:
|
|
home[(team, round)] = LpVariable(
|
|
f"home_{attr['MANNSCHAFT']}_{round}",
|
|
lowBound=0,
|
|
upBound=1,
|
|
cat=LpInteger,
|
|
)
|
|
|
|
# Create pattern variables
|
|
assignPattern = {}
|
|
for team, attr in teams.items():
|
|
for p in pattern:
|
|
assignPattern[(team, p)] = LpVariable(
|
|
f"pattern_{attr['MANNSCHAFT']}_{p}",
|
|
lowBound=0,
|
|
upBound=1,
|
|
cat=LpInteger,
|
|
)
|
|
|
|
""" Each team exactly one pattern """
|
|
for team in teams:
|
|
model += (lpSum(assignPattern[(team, p)] for p in pattern) == 1, f"team_{team}_one_pattern")
|
|
|
|
""" Patterns cannot be used more than once """
|
|
for p in pattern:
|
|
model += (lpSum(assignPattern[(team, p)] for team in teams) <= 1, f"pattern_{p}_used_once")
|
|
|
|
""" Couple patterns with home variables """
|
|
for round in rounds1:
|
|
for team, attr in teams.items():
|
|
model += (lpSum(assignPattern[(team, p)] for p in pattern if pattern[p][round-1] == "H") == home[(team, round)], f"coupling_pattern_home_{attr['MANNSCHAFT']}_{round}")
|
|
|
|
# %%
|
|
model.solve(XPRESS(msg=1))
|
|
|
|
|
|
""" print patterns """
|
|
for team, attr in teams.items():
|
|
for p in pattern:
|
|
if value(assignPattern[(team, p)]) == 1:
|
|
print(f"{attr['MANNSCHAFT']} is assigned pattern {p}")
|
|
|
|
|
|
|
|
|
|
|