stundenplan-asp/generate.py

121 lines
3.1 KiB
Python
Raw Normal View History

2020-08-13 14:31:41 +02:00
#!/usr/bin/env python3
import random
import math
import sys
import subprocess
import json
from pprint import pprint as pprint
if sys.argv[1] == "help":
print(f"{sys.argv[0]} [input_json_file] [size file] [maximum_number of students per group]\n {sys.argv[0]} sorting.json size.json 12")
2020-08-13 14:31:41 +02:00
sys.exit(0)
def generate_random_set(f, s, g):
for i in range(1,s):
f.write(f"schedule('sched{i}').\n")
for j in range(1,g):
r = math.floor(random.gauss(4, 2))
f.write(f"group('group{j}', {r}).\n")
for group in range(1,g):
for sched in range(1,s):
rank = random.randrange(s)
if rank == 0:
break
f.write(f"rank('group{group}', 'sched{sched}', {rank}).\n")
def parse_counts(counts):
ret = {}
for count in counts:
c = count[6:-2]
g, s = c.split(',\'')
ret[g] = s
return ret
def parse_matchings(matchings):
ret = {}
for match in matchings:
c = match[10:-2]
g, s = c.split('\',\'')
ret[g] = s
return ret
class Rules():
def __init__(self, json_sortings, json_sizes):
2020-08-13 14:31:41 +02:00
self.timetables = []
self.groups = {}
self.rankings = []
with open(json_sizes, 'r') as f:
sizes = json.loads(f.read())
2020-08-13 14:31:41 +02:00
for s in sizes:
self.groups[s["group_id"]] = s["group_size"]
with open(json_sortings, 'r') as f:
2020-08-13 14:31:41 +02:00
data = json.loads(f.read())
for d in data:
self.rankings.append((d["group_id"], d["timetable_id"], d["sorting"]))
def addTimetable(self, timtableName):
self.timetables.append(timtableName)
def generateRules(self):
r = ""
for t in self.timetables:
r += f"schedule('sched{t}').\n"
for name in self.groups:
m = self.groups[name]
r +=f"group('group{name}', {m}).\n"
for g in self.rankings:
r+= f"rank('group{g[0]}', 'sched{g[1]}', {g[2]}).\n"
return r
rules = Rules(sys.argv[1], sys.argv[2])
2020-08-13 14:31:41 +02:00
for i in range(1,13):
rules.addTimetable(i)
#print(rules.generateRules())
max = sys.argv[3]
2020-08-13 14:31:41 +02:00
f = open('.rules.pl', 'w')
base = open('rules.pl', 'r').read()
f.write(base.replace("{max}", max))
f.write(rules.generateRules())
f.close()
# create subprocess definition
process = ['clingo', ".rules.pl", '--outf=2', '-n 3', '-t 3', '--configuration=tweety'] # output json, n number of schedules, t threads
# run subprocess, not sure, if busy-waiting..
completed_process = subprocess.run(process, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
output = completed_process.stdout
open('solver_output_simple.json', 'w').write(output)
results = json.loads(output)
matchings = []
counts = []
for r in results["Call"]:
w = r["Witnesses"][-1]
for m in w["Value"]:
if 'count' in m:
counts.append(m)
if 'matching' in m:
matchings.append(m)
matchings = parse_matchings(matchings)
counts = parse_counts(counts)
output = []
for m in matchings:
output.append({"group_id": int(m.replace("group", "")), "timetable_id": int(matchings[m].replace("sched", ""))})
pprint(output)