280 lines
7.3 KiB
Python
Executable File
280 lines
7.3 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"
|
|
|
|
from leagues import settings
|
|
# settings.DATABASES['default']['NAME'] = PROJECT_PATH+'/db.sqlite3'
|
|
settings.DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql_psycopg2'
|
|
settings.DATABASES['default']['HOST'] = '0.0.0.0'
|
|
settings.DATABASES['default']['PORT'] = '5432'
|
|
settings.DATABASES['default']['USER'] = 'postgres'
|
|
settings.DATABASES['default']['PASSWORD'] = 'secret123'
|
|
settings.DATABASES['default']['NAME'] = 'mypgsqldb'
|
|
settings.DATABASES['default']['ATOMIC_REQUESTS'] = False
|
|
settings.DATABASES['default']['AUTOCOMMIT'] = True
|
|
settings.DATABASES['default']['CONN_MAX_AGE'] = 0
|
|
settings.DATABASES['default']['CONN_HEALTH_CHECKS'] = False
|
|
settings.DATABASES['default']['OPTIONS'] = {}
|
|
|
|
os.environ["XPRESSDIR"] = "/opt/xpressmp"
|
|
os.environ["XPRESS"] = "/opt/xpressmp/bin"
|
|
os.environ["LD_LIBRARY_PATH"] = os.environ["XPRESSDIR"] + "/lib"
|
|
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["CLASSPATH"] = os.environ["XPRESSDIR"] + "/lib/xprs.jar"
|
|
os.environ["CLASSPATH"] = os.environ["XPRESSDIR"] + "/lib/xprb.jar" + os.pathsep + os.environ["CLASSPATH"]
|
|
os.environ["CLASSPATH"] = os.environ["XPRESSDIR"] + "/lib/xprm.jar" + os.pathsep + os.environ["CLASSPATH"]
|
|
os.environ["PATH"] = os.environ["XPRESSDIR"] + "/bin" + os.pathsep + os.environ["PATH"]
|
|
|
|
|
|
import django
|
|
django.setup()
|
|
|
|
from scheduler.models import *
|
|
from pulp import *
|
|
from django.db.models import Q
|
|
from django.template.loader import render_to_string
|
|
|
|
from qualifiers.models import *
|
|
from common.models import GlobalTeam, GlobalCountry
|
|
from scheduler.models import Season, Scenario, Team, DayObj, CountryClash, Country
|
|
|
|
from qualifiers.draws import groupTeams, optimize_inversions4
|
|
|
|
import random
|
|
import time
|
|
import json
|
|
import csv
|
|
import networkx as nx
|
|
import matplotlib.pyplot as plt
|
|
|
|
from django.contrib.sessions.models import Session
|
|
|
|
|
|
scenario = Scenario.objects.get(id=9360)
|
|
|
|
|
|
|
|
|
|
from scheduler.solver.tasks.optimize import optimize
|
|
|
|
s2 = scenario.id
|
|
user_name = 'md'
|
|
user_is_staff = True
|
|
runMode = 'Improve'
|
|
localsearch_time = 60
|
|
RUN_ENV = 'local'
|
|
SOLVER = 'xpress'
|
|
|
|
teams = Team.objects.filter(season=scenario.season,active=True,conference__name="UECL").distinct()
|
|
|
|
|
|
gamereqs = GameRequirement.objects.filter(scenario=scenario)
|
|
|
|
|
|
# sol = optimize(task=None, s2=s2, user_name=user_name, user_is_staff=user_is_staff,
|
|
# runMode=runMode, localsearch_time=localsearch_time, RUN_ENV=RUN_ENV, solver=SOLVER)
|
|
|
|
|
|
def create_graph(pot=None):
|
|
def hex_to_rgb(value):
|
|
value = value.lstrip('#')
|
|
lv = len(value)
|
|
return tuple(int(value[i:i + lv // 3], 16) for i in range(0, lv, lv // 3))
|
|
|
|
|
|
hex_colors = {
|
|
1: "#ffff99",
|
|
2: "#99ccff",
|
|
3: "#FFcc99",
|
|
4: "#CCFFCC",
|
|
5: "#CCCCFF",
|
|
6: "#9999FF",
|
|
}
|
|
|
|
rgb_colors = {}
|
|
for c in hex_colors:
|
|
rgb_colors[c] = hex_to_rgb(hex_colors[c])
|
|
|
|
G = nx.Graph()
|
|
node_colors = {}
|
|
node_label = {}
|
|
for t in teams:
|
|
node_label[t] = f"{t.shortname}"
|
|
if pot is None:
|
|
node_color = rgb_colors[t.pot]
|
|
node_colors[node_label[t]] = hex_colors[t.pot]
|
|
else:
|
|
node_color = rgb_colors[pot[t]]
|
|
node_colors[node_label[t]] = hex_colors[pot[t]]
|
|
G.add_node(node_label[t],
|
|
viz = {"color": {"a":0, "r": node_color[0], "g": node_color[1], "b": node_color[2]}, 'size':20})
|
|
|
|
# for n in nx.nodes(G):
|
|
# G.nodes[n]["viz"] = {}
|
|
# G.nodes[n]["viz"]["color"] = colors[]
|
|
|
|
for gq in gamereqs:
|
|
if gq.team1 in teams and gq.team2 in teams:
|
|
G.add_edge(node_label[gq.team1],node_label[gq.team2], capacity = 1.0)
|
|
|
|
SubG = [G.subgraph(c).copy() for c in nx.connected_components(G)]
|
|
|
|
# nx.draw(SubG[0], with_labels=True, font_weight='bold')
|
|
sub = SubG[0]
|
|
|
|
nx.draw(sub, with_labels=True,
|
|
node_size=400, font_size=6, node_color=[node_colors[g] for g in list(sub.nodes())])
|
|
pos = nx.nx_agraph.graphviz_layout(sub)
|
|
nx.draw_networkx_edge_labels(
|
|
sub, pos=pos, edge_labels={e: "" for e in list(sub.edges())}, font_color='black', font_size=6
|
|
)
|
|
nx.write_gexf(sub, "test.gexf")
|
|
|
|
|
|
distance = {}
|
|
|
|
max_path = 0
|
|
for t in teams:
|
|
path = nx.shortest_path(G, source=t.shortname)
|
|
for p in path:
|
|
|
|
|
|
if len(path[p]) <= 2:
|
|
length = 0
|
|
elif len(path[p]) == 3:
|
|
length = 1
|
|
else:
|
|
length = 2
|
|
|
|
distance[(teams.get(shortname=t.shortname),teams.get(shortname=p))] = length
|
|
|
|
|
|
|
|
|
|
|
|
# cut_value, partition = nx.minimum_cut(G, "Manch", "y")
|
|
|
|
return distance
|
|
|
|
# %%
|
|
|
|
|
|
distance = create_graph()
|
|
|
|
# %%
|
|
|
|
# import xpress as xp
|
|
|
|
# xp.controls.outputlog = 1
|
|
# model = xp.problem(name='Draws', sense=xp.minimize)
|
|
# model.setControl('maxtime' , 600)
|
|
|
|
|
|
# distance = {(t1,t2): 1 for t1 in teams for t2 in teams}
|
|
# for g in gamereqs:
|
|
# if (g.team1,g.team2) in distance.keys():
|
|
# distance[(g.team1,g.team2)] = 0
|
|
|
|
# groups = range(1,3)
|
|
|
|
# x = {}
|
|
# y = {}
|
|
# for g in groups:
|
|
# for t in teams:
|
|
# x[t,g] = xp.var(vartype=xp.binary)
|
|
# for t1,t2 in distance.keys():
|
|
# y[t1,t2] = xp.var(vartype=xp.binary)
|
|
|
|
|
|
# model.addVariable(x)
|
|
# model.addVariable(y)
|
|
|
|
# for t1,t2 in y.keys():
|
|
# for g in groups:
|
|
# model.addConstraint(y[t1,t2] >= x[t1,g] + x[t2,g] - 1)
|
|
|
|
# for t in teams:
|
|
# model.addConstraint(xp.Sum(x[t,g] for g in groups) == 1)
|
|
|
|
# for g in groups:
|
|
# model.addConstraint(xp.Sum(x[t,g] for t in teams) == len(teams)/len(groups))
|
|
|
|
# model.setObjective(xp.Sum(y[t1,t2]*distance[(t1,t2)] for (t1,t2) in y.keys()))
|
|
|
|
# start_time = time.time()
|
|
# model.solve()
|
|
# comp_time = time.time()-start_time
|
|
|
|
|
|
teams = Team.objects.filter(season=scenario.season,active=True).distinct()
|
|
|
|
import xpress as xp
|
|
|
|
xp.controls.outputlog = 1
|
|
model = xp.problem(name='Draws', sense=xp.minimize)
|
|
model.setControl('maxtime' , 600)
|
|
|
|
|
|
groups = range(1,5)
|
|
|
|
x = {}
|
|
y = {}
|
|
for g in groups:
|
|
for t in teams:
|
|
x[t,g] = xp.var(vartype=xp.binary)
|
|
for gr in gamereqs:
|
|
y[gr.team1,gr.team2,g] = xp.var(vartype=xp.binary)
|
|
|
|
model.addVariable(x)
|
|
model.addVariable(y)
|
|
|
|
for t1,t2,g in y.keys():
|
|
model.addConstraint(y[t1,t2,g] >= (x[t1,g] - x[t2,g]))
|
|
model.addConstraint(y[t1,t2,g] >= (x[t2,g] - x[t1,g]))
|
|
|
|
for t in teams:
|
|
model.addConstraint(xp.Sum(x[t,g] for g in groups) == 1)
|
|
|
|
for g in groups:
|
|
model.addConstraint(xp.Sum(x[t,g] for t in teams) == len(teams)/len(groups))
|
|
|
|
model.setObjective(xp.Sum(y[key] for key in y.keys()))
|
|
|
|
start_time = time.time()
|
|
model.solve()
|
|
comp_time = time.time()-start_time
|
|
|
|
|
|
|
|
# %%
|
|
pot = {}
|
|
group_list = {g:[] for g in groups}
|
|
for g in groups:
|
|
print("GROUP",g)
|
|
for t in teams:
|
|
if model.getSolution(x[t,g]) > 0:
|
|
print("\t",t.id)
|
|
group_list[g].append(t.id)
|
|
pot[t] = g
|
|
print("")
|
|
|
|
|
|
|
|
# %%
|
|
|
|
|
|
|
|
# %%
|
|
|
|
print(group_list)
|
|
|
|
|
|
# %%
|
|
|
|
create_graph(pot) |