research/uefa/cycle24/draw24/archive/drawsimulation_randommatrix.py
2024-01-31 17:12:11 +01:00

310 lines
6.7 KiB
Python
Executable File

# %%
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"
import random
import time
# XPRESS ENVIRONMENT
os.environ['XPRESSDIR'] = "/opt/xpressmp_8.4"
os.environ['XPRESS'] = "/opt/xpressmp_8.4/bin"
os.environ['LD_LIBRARY_PATH'] = os.environ['XPRESSDIR']+"/lib:"+os.environ['LD_LIBRARY_PATH']
os.environ['DYLD_LIBRARY_PATH'] = os.environ['XPRESSDIR']+"/lib:"
os.environ['SHLIB_PATH'] = os.environ['XPRESSDIR']+"/lib:"
os.environ['LIBPATH'] = os.environ['XPRESSDIR']+"/lib:"
# os.environ['PYTHONPATH'] =os.environ['XPRESSDIR']+"/lib:"+os.environ['PYTHONPATH']
os.environ['PYTHONPATH'] =os.environ['XPRESSDIR']+"/lib:"
os.environ['CLASSPATH'] =os.environ['XPRESSDIR']+"/lib/xprs.jar:"
os.environ['CLASSPATH'] =os.environ['XPRESSDIR']+"/lib/xprb.jar:"+os.environ['CLASSPATH']
os.environ['CLASSPATH'] =os.environ['XPRESSDIR']+"/lib/xprm.jar:"+os.environ['CLASSPATH']
os.environ['PATH'] =os.environ['XPRESSDIR']+"/bin:"+os.environ['PATH']
from leagues import settings
settings.DATABASES['default']['NAME'] = PROJECT_PATH+'/db.sqlite3'
import django
django.setup()
from scheduler.models import *
from pulp import *
import csv
import xpress as xp
xp.controls.outputlog = 1
scenario = Scenario.objects.get(id=32)
# %%
teams = Team.objects.filter(season=scenario.season,active=True)
getTeamByID = {
t.id:t for t in teams
}
countries = teams.values_list('country', flat=True).distinct()
teams_from_country = {
c:[t for t in teams if t.country==c] for c in countries
}
pot = {}
for i in teams.values_list('pot',flat=True).distinct():
pot[i] = teams.filter(pot=i)
# directed version
# requirement = {
# 1:[1,-1,2,-2,3,-3,4,-4],
# 2:[1,-1,2,-2,3,-3,4,-4],
# 3:[1,-1,2,-2,3,-3,4,-4],
# 4:[1,-1,2,-2,3,-3,4,-4],
# }
# undirected version
requirement = {
1:{
1:2,
2:2,
3:2,
4:2,
},
2:{
1:2,
2:2,
3:2,
4:2,
},
3:{
1:2,
2:2,
3:2,
4:2,
},
4:{
1:2,
2:2,
3:2,
4:2,
},
}
def check_feasible(fixed_games):
model = xp.problem(name='Draws', sense=xp.minimize)
x = {}
for t1 in teams:
for t2 in teams:
if t1.country != t2.country:
x[t1.id, t2.id] = xp.var(ub=1, vartype=xp.integer)
model.addVariable(x)
# REQUIREMENTS
for t in teams:
for r,val in requirement[t.pot].items():
model.addConstraint(xp.Sum(x[t.id,t2.id] for t2 in pot[r] if (t.id,t2.id) in x.keys()) == val)
for c in countries:
if c != t.country:
model.addConstraint(xp.Sum(x[t.id,t2.id] for t2 in teams_from_country[c]) <= 3)
# FIXATIONS
for (t1,t2) in fixed_games:
# print("FIXING",t1,t2)
model.addConstraint(x[t1,t2] == 1)
for (t1,t2) in x.keys():
model.addConstraint(x[t1,t2] == x[t2,t1])
start_time = time()
model.solve()
comp_time = time()-start_time
if model.getProbStatus() != 6:
# print("INFEASIBLE FOUND")
return False
else:
return True
def random_matrix():
model = xp.problem(name='Draws', sense=xp.minimize)
x = {}
for t1 in teams:
for t2 in teams:
if t1.country != t2.country:
x[t1.id, t2.id] = xp.var(ub=1, vartype=xp.integer)
model.addVariable(x)
# REQUIREMENTS
for t in teams:
for r,val in requirement[t.pot].items():
model.addConstraint(xp.Sum(x[t.id,t2.id] for t2 in pot[r] if (t.id,t2.id) in x.keys()) == val)
for c in countries:
if c != t.country:
model.addConstraint(xp.Sum(x[t.id,t2.id] for t2 in teams_from_country[c]) <= 3)
for (t1,t2) in x.keys():
model.addConstraint(x[t1,t2] == x[t2,t1])
model.setObjective(xp.Sum(random.uniform(0,1)*x[key] for key in x.keys()))
start_time = time()
model.solve()
comp_time = time()-start_time
if model.getProbStatus() != 6:
# print("INFEASIBLE FOUND")
return False
else:
solution = []
for key in x.keys():
if model.getSolution(x[key]) > 0:
solution.append((key[0],key[1]))
return solution
# %%
for k in range(1,1001):
print("SIMULATION",k)
teams = Team.objects.filter(season=scenario.season,active=True)
countries = teams.values_list('country', flat=True).distinct()
teams_from_country = {
c:[t for t in teams if t.country==c] for c in countries
}
pot = {}
for i in teams.values_list('pot',flat=True).distinct():
pot[i] = teams.filter(pot=i)
# directed version
# requirement = {
# 1:[1,-1,2,-2,3,-3,4,-4],
# 2:[1,-1,2,-2,3,-3,4,-4],
# 3:[1,-1,2,-2,3,-3,4,-4],
# 4:[1,-1,2,-2,3,-3,4,-4],
# }
# undirected version
requirement = {
1:{
1:2,
2:2,
3:2,
4:2,
},
2:{
1:2,
2:2,
3:2,
4:2,
},
3:{
1:2,
2:2,
3:2,
4:2,
},
4:{
1:2,
2:2,
3:2,
4:2,
},
}
solution = random_matrix()
if not check_feasible(solution):
print("INFEASIBLE")
exit()
opps = {
t:{
p:[] for p in range(1,5)
}
for t in teams
}
for (s1,s2) in solution:
t1 = getTeamByID[s1]
t2 = getTeamByID[s2]
opps[t1][t2.pot].append(t2.id)
with open('verteilung_random.csv', "a") as f:
for t in teams.order_by('pot'):
f.write(f"{k},{t.id},{';'.join([str(a) for a in opps[t][1]])},{';'.join([str(a) for a in opps[t][2]])},{';'.join([str(a) for a in opps[t][3]])},{';'.join([str(a) for a in opps[t][4]])}\n")
# # %%
# %%
teams = list(range(1,19))
days = list(range(1,18))
model = xp.problem(name='Draws', sense=xp.minimize)
x = {}
for t1 in teams:
for t2 in teams:
if t1 != t2:
for d in days:
x[t1,t2,d] = xp.var(ub=1, vartype=xp.integer)
model.addVariable(x)
# REQUIREMENTS
for t1 in teams:
for t2 in teams:
if t1 != t2:
model.addConstraint(xp.Sum(x[t1,t2,d] for d in days) == 1)
for d in days:
model.addConstraint(xp.Sum(x[t1,t2,d] for t2 in teams if t2 != t1) == 1)
model.setObjective(xp.Sum(random.uniform(0,1)*x[key] for key in x.keys()))
start_time = time()
model.solve()
comp_time = time()-start_time
if model.getProbStatus() != 6:
print("INFEASIBLE FOUND")
else:
for key in x.keys():
if model.getSolution(x[key]) > 0:
print(key)
# %%