Commit 2ee0ea48 authored by Jirka Fink's avatar Jirka Fink
Browse files

Add 5th assignment

parent 861eba13
import numpy
import gurobipy as gp
from gurobipy import GRB
# Returns the best possible lower bound for a given GAP instance obtained from applying the Lagrangian relaxation on all uniqueness constraints.
# See task.md for more details.
def lagrange_generalized_assignment_problem(instance):
#TODO: Find the lower bound here
# Try to find a greedy feasible solution for GAP
# If successfull, returns a list which assigns jobs to agents
# Otherwise, throw an exception (ValueError: min() arg is an empty sequence)
# Note that determining whether an instance of GAP has a feasible solution is NP-complete (use 3-partition for reduction)
def get_greedy_solution(instance):
assignment = [-1] * instance.jobs # For a job j, assignment[j] is the assigned agent
process = list(range(instance.jobs)) # Jobs that has not been assigned yet
remains = instance.capacity.copy() # Remaining capacity of each agent
while process:
# From all unassigned jobs j and agents a having sufficient capacity for j, choose (a,j) with minimal weight
w,a,j = min((instance.weight[a][j],a,j) for j in process for a in range(instance.agents) if instance.weight[a][j] <= remains[a])
assignment[j] = a
process.remove(j)
remains[a] -= w
return assignment
# Solve the knapsack problem: Given weight and price of items and capacity, find
# a subset of items with weights at the capacity and maximizing their total cost
# Returns a pair of the total cost and idices of items in an optimal subset
# Note that items of non-positive items are ignored
def solve_knapsack(weight, price, capacity):
assert len(weight) == len(price)
# Lists for dynamic programming
max_cost = [0] * (capacity+1) # Maximal possible cost reaching every total weight
last_index = [-1] * (capacity+1) # Index of the last added item
for j, w, p in zip(range(len(weight)), weight, price): # Index, weight and price of each item
if p > 0: # Ignore items of non-positive items
for i in reversed(range(capacity-w+1)): # Try to insert the item j to all total weights
if max_cost[i+w] < max_cost[i] + p:
# Adding item i increases the cost
max_cost[i+w] = max_cost[i] + p
last_index[i+w] = j
solution = []
m = numpy.argmax(max_cost) # Total weight with maximal cost
objective = max_cost[m]
# Using last_index reconstruct an optimal solution
while last_index[m] >= 0:
solution.append(last_index[m])
m -= weight[last_index[m]]
return (objective, solution)
if __name__ == "__main__":
# Some unit tests for our knapsack problem
assert solve_knapsack([1], [2], 6) == (2, [0])
assert solve_knapsack([1], [-2], 6) == (0, [])
assert solve_knapsack([4,6], [2,5], 100) == (7, [1,0])
assert solve_knapsack([4,6], [2,5], 7) == (5, [1])
assert solve_knapsack([4,6], [2,5], 5) == (2, [0])
assert solve_knapsack([4,6,10], [2,5,9], 12) == (9, [2])
assert solve_knapsack([4,6,10], [2,5,6], 12) == (7, [1,0])
assert solve_knapsack([4,6,10], [2,5,6], 15) == (8, [2,0])
import sys
import copy
from time import time
from prettytable import PrettyTable
from assignment import lagrange_generalized_assignment_problem
# Instance of the General assignment problem (GAP)
class Instance:
def __init__(self, agents, jobs, cost, weight, capacity):
self.agents = agents # The number of agents (e.g. central stores)
self.jobs = jobs # The number of jobs (e.g. consumers)
self.cost = cost # Cost of assigning a job to an agent; the first index is an agent, the second one is a job
self.weight = weight # How much resources a job consume from an agent; the first index is an agent, the second one is a job
self.capacity = capacity # The capacity of each agent
# Returns the instance of GAP stored in a given file
# http://people.brunel.ac.uk/~mastjjb/jeb/orlib/gapinfo.html
def load(filename):
content = [ int(y) for x in open(filename, "r") for y in x.split() ]
content.reverse()
content.pop()
agents = content.pop()
jobs = content.pop()
cost = [ [ content.pop() for j in range(jobs) ] for a in range(agents) ]
weight = [ [ content.pop() for j in range(jobs) ] for a in range(agents) ]
capacity = [ content.pop() for a in range(agents) ]
return Instance(agents, jobs, cost, weight, capacity)
def verify_solution(instance, solution, bound):
if abs(solution - bound) > 0.0001:
return (False, "Incorrect bound")
return (True, "Correct bound")
def run_test(filename, bound):
instance = load(filename)
solution = lagrange_generalized_assignment_problem(copy.deepcopy(instance))
return verify_solution(instance, solution, bound) + (instance,)
def main():
tests = {
"first": ("gap1.txt", 258.5, 1),
"second": ("gap2.txt", 274.3878787878788, 1),
"third": ("gap3.txt", 434.99189237716774, 1),
"fourth": ("gap4.txt", 417.7556653611704, 2),
"fifth": ("gap5.txt", 402.8431003822761, 1),
"sixth": ("gap6.txt", 522.2637096268518, 2),
"seventh": ("gap7.txt", 643.210566967029, 3),
"eigth": ("gap8.txt", 793.0298487147554, 6),
"ninth": ("gap9.txt", 480.81566820276504, 2),
"tenth": ("gap10.txt", 634.1139438624057, 5),
}
if len(sys.argv) == 1:
results = PrettyTable(["Instance name", "Points", "Filename", "Jobs", "Agents", "Time limit [s]", "Your time [s]", "Evaluation"])
for name in tests:
print("Running test", name)
filename, bound, time_limit = tests[name]
start_time = time()
status,msg,instance = run_test(filename, bound)
running_time = time() - start_time
print(msg)
print()
results.add_row([name, 1, filename, instance.jobs, instance.agents, time_limit, running_time, msg])
print(results)
else:
name = sys.argv[1]
if name in tests:
filename, optimal_length, time_limit = tests[name]
status, msg, instance = run_test(filename, optimal_length)
print(msg)
else:
print("Unknown test", name)
"""
To run all tests, run the command
$ python3 assignment_tests.py
To run a test NAME, run the command
$ python3 assignment_tests.py NAME
"""
if __name__ == "__main__":
main()
5
5 15
17 21 22 18 24 15 20 18 19 18 16 22 24 24 16
23 16 21 16 17 16 19 25 18 21 17 15 25 17 24
16 20 16 25 24 16 17 19 19 18 20 16 17 21 24
19 19 22 22 20 16 19 17 21 19 25 23 25 25 25
18 19 15 15 21 25 16 16 23 15 22 17 19 22 24
8 15 14 23 8 16 8 25 9 17 25 15 10 8 24
15 7 23 22 11 11 12 10 17 16 7 16 10 18 22
21 20 6 22 24 10 24 9 21 14 11 14 11 19 16
20 11 8 14 9 5 6 19 19 7 6 6 13 9 18
8 13 13 13 10 20 25 16 16 17 10 10 5 12 23
36 34 38 27 33
5 15
19 23 24 20 20 25 16 21 24 15 17 17 20 20 20
25 24 16 21 19 17 17 19 23 21 21 23 20 15 16
16 21 25 22 24 24 16 17 15 18 15 17 18 24 18
25 24 18 19 15 18 20 22 23 18 16 19 17 15 22
25 19 21 22 20 15 20 19 18 18 17 23 17 25 25
16 12 8 20 18 10 12 8 14 23 19 14 15 15 24
16 18 19 22 13 20 9 7 25 10 20 13 11 15 16
6 20 20 5 14 12 6 15 22 18 13 23 23 18 25
18 23 25 17 25 13 23 23 13 20 20 23 17 19 24
12 17 15 25 22 5 24 19 12 25 23 21 23 19 18
36 37 38 48 44
5 15
22 21 16 17 21 15 17 22 22 25 18 20 24 15 22
23 24 19 15 16 21 15 25 16 21 20 19 16 23 20
21 20 21 25 21 20 21 19 17 16 25 19 15 15 15
17 21 25 25 23 22 20 19 20 25 15 20 21 25 23
15 25 23 19 17 17 25 24 24 17 24 19 18 19 16
23 10 15 13 17 10 13 6 9 21 20 7 9 25 8
17 13 8 23 11 18 7 22 13 5 24 24 15 10 22
22 17 22 23 20 11 17 25 23 9 22 20 15 9 25
5 19 25 16 15 10 18 9 11 20 7 21 15 8 25
22 9 10 23 19 21 17 15 15 17 25 19 10 9 21
32 37 44 35 40
5 15
15 25 20 18 19 21 18 22 24 15 25 17 17 15 22
20 18 25 25 16 24 22 24 17 18 23 25 21 25 24
25 19 18 18 23 18 15 22 23 16 25 22 22 15 16
19 19 23 17 19 19 22 19 23 22 24 22 25 19 16
25 24 17 19 25 19 23 19 25 15 19 21 18 19 22
20 20 18 9 18 5 16 18 13 24 21 23 15 19 9
5 12 18 8 22 19 19 11 7 19 20 17 21 25 5
18 8 8 9 20 20 23 13 15 12 6 12 25 25 23
17 19 24 9 16 22 10 17 12 17 15 21 16 18 6
14 6 20 6 21 5 11 23 20 21 20 18 13 13 21
39 36 37 38 37
5 15
25 25 18 24 20 19 25 24 23 15 18 18 25 15 22
25 18 17 22 21 23 20 23 16 19 15 18 16 23 16
18 16 19 15 15 18 15 20 19 24 22 20 25 16 21
18 21 16 18 17 24 18 23 22 16 17 22 22 18 16
17 18 15 21 23 21 24 23 20 22 19 15 22 22 25
16 20 9 22 17 19 20 22 20 13 6 20 23 19 7
12 22 18 18 6 13 17 17 17 14 20 12 17 14 22
5 19 19 14 24 16 7 8 9 22 13 23 24 15 20
20 8 6 9 5 17 23 18 14 12 14 17 15 23 21
6 6 24 24 8 7 5 25 21 18 12 20 20 7 12
40 38 38 35 34
5
10 40
17 21 25 19 24 22 24 20 23 15 16 17 23 21 20 21 22 19 24 22 16
23 24 16 24 15 17 17 19 19 25 18 21 15 21 23 18 21 19 16
16 16 18 15 16 22 20 24 25 23 20 25 15 16 22 19 22 16 23 18 21
24 22 22 17 25 15 24 16 16 18 20 15 15 16 24 16 20 17 21
25 24 24 18 20 19 25 17 19 19 22 18 19 19 24 22 22 20 16 25 19
25 19 21 20 24 20 20 15 24 23 23 17 15 24 20 23 19 19 22
21 18 19 21 23 15 17 19 25 25 15 20 18 18 15 21 22 16 25 17 17
16 15 17 24 25 24 22 23 24 20 17 20 16 24 18 21 22 20 16
23 22 15 17 25 25 24 20 21 23 17 23 21 18 18 22 18 15 15 21 19
24 16 19 20 16 23 17 15 24 15 24 19 21 17 16 16 22 16 24
19 17 19 24 25 23 19 15 22 23 15 22 19 19 17 16 22 19 20 22 25
15 24 24 24 22 22 19 21 23 24 17 23 17 20 22 20 25 19 20
17 25 23 21 21 16 18 19 20 19 17 21 23 16 19 23 23 18 24 15 19
22 25 21 19 17 25 18 22 21 16 15 20 15 19 24 25 18 15 21
15 23 18 15 24 18 16 24 25 24 17 25 21 22 22 18 20 16 16 23 23
23 15 24 20 20 18 25 16 22 20 23 15 17 19 16 18 16 16 23
18 23 24 21 18 16 18 24 16 21 21 23 25 17 19 20 17 15 23 16 24
21 22 15 19 22 22 17 25 21 16 15 21 20 25 21 16 17 15 21
21 16 17 18 18 23 18 22 24 22 21 17 24 25 24 15 25 17 15 19 20
20 25 25 18 25 17 21 21 15 24 16 24 17 22 15 22 19 24 17
9 14 23 14 12 6 15 16 15 12 14 18 9 22 8 23 6 19 6 8 8
15 7 16 24 5 18 16 13 13 11 7 19 19 15 21 20 18 11 8
21 24 24 19 14 22 9 24 19 24 11 23 18 22 9 9 14 15 21 5 25
5 20 13 7 6 8 16 21 22 5 18 10 20 8 9 14 9 5 22
18 12 6 14 17 7 24 20 19 10 13 25 23 7 6 9 17 9 6 21 24
13 18 5 21 21 15 11 15 15 15 18 21 9 22 8 8 18 13 12
23 7 9 13 7 17 14 10 17 9 11 22 25 19 12 5 20 5 24 22 7
11 24 19 8 15 9 21 11 9 15 12 18 25 8 14 20 21 22 8
7 8 13 10 12 25 7 5 14 17 16 15 10 9 6 16 6 23 23 10 16
5 16 11 23 15 6 13 12 21 10 15 21 12 14 14 24 22 13 5
17 9 22 8 19 8 7 11 14 14 17 23 25 21 12 20 8 20 9 5 8
16 16 23 22 20 17 21 11 12 9 15 21 17 13 18 23 6 8 20
14 12 24 12 14 5 24 11 13 21 15 18 14 18 5 11 21 16 5 17 6
10 21 11 13 24 13 25 10 21 11 22 11 16 15 17 21 11 21 24
22 20 21 12 17 24 21 7 9 23 13 11 19 17 17 20 14 10 11 16 8
7 21 16 24 9 16 15 10 23 10 13 9 6 18 23 19 22 13 18
6 11 16 17 6 8 18 24 19 9 18 18 7 13 11 20 19 22 19 20 14
10 6 6 25 7 8 18 19 17 6 25 13 12 22 23 8 12 5 19
7 14 11 6 11 25 18 10 9 10 13 23 12 17 11 14 12 19 20 8 8
8 20 25 19 21 25 23 23 11 19 13 21 25 20 22 16 8 24 20
44 48 46 47 43 48 49 49 46 51
10 40
17 17 16 22 24 15 19 21 19 25 25 16 18 19 21 17 15 20 20 15 20
17 23 15 16 21 25 18 23 15 22 22 15 24 25 24 21 19 23 18
21 20 19 22 20 18 20 17 15 21 16 17 15 21 25 22 24 20 22 20 16
25 22 24 25 23 15 25 21 15 16 19 18 23 22 19 16 15 19 15
25 21 23 16 16 22 18 25 23 23 23 23 21 18 19 19 19 22 22 20 16
25 19 24 18 18 18 16 23 22 25 25 22 24 16 19 25 20 15 18
18 16 21 19 25 25 24 17 18 25 20 21 22 23 20 22 25 25 19 22 23
19 17 16 16 21 25 21 23 20 20 15 18 21 21 20 17 15 24 22
19 18 21 25 25 21 23 15 16 21 18 23 21 24 23 23 20 20 23 24 15
24 20 20 19 18 17 21 24 19 19 17 24 17 23 18 25 22 17 25
25 17 18 19 25 23 23 17 17 21 24 18 19 15 16 21 24 20 15 25 22
16 17 16 24 15 19 17 25 16 25 21 20 17 25 22 15 16 20 15
22 24 22 17 21 24 15 23 23 17 16 25 16 17 23 19 17 16 25 24 22
16 18 22 17 16 22 15 17 20 25 17 23 23 18 24 15 19 25 23
16 25 22 16 25 19 20 22 16 22 23 25 22 18 23 25 20 15 19 20 20
17 20 17 21 25 16 17 17 24 18 21 15 17 18 20 15 21 19 18
22 16 23 23 17 15 20 23 20 19 22 21 20 16 21 17 19 18 15 25 25
15 17 22 23 20 21 19 20 19 17 22 25 20 18 22 16 23 16 21
25 24 24 20 18 19 16 22 25 24 19 23 23 19 15 22 20 24 17 24 20
23 25 23 18 17 20 18 16 21 21 16 20 15 25 15 25 20 17 15
18 9 22 18 13 10 13 15 7 13 13 13 23 7 13 8 18 10 6 19 13
19 20 17 24 15 16 23 17 13 18 9 17 17 5 5 16 16 9 17
10 10 15 12 15 20 10 8 5 12 13 5 21 18 12 12 16 5 10 13 13
9 15 14 21 19 5 23 11 9 21 20 23 9 8 22 13 17 19 7
25 19 16 18 15 12 5 17 9 18 23 7 22 9 13 7 20 13 25 13 16
25 6 12 10 25 14 23 16 6 22 12 17 7 15 10 25 5 20 25
5 5 19 23 22 18 12 12 16 16 9 19 13 11 21 10 12 19 10 17 18
8 17 5 13 21 24 9 15 11 10 21 5 14 21 8 9 7 13 11
22 24 17 12 14 10 19 11 23 24 12 18 8 18 20 24 18 14 23 24 13
15 5 25 11 9 13 20 5 17 15 12 22 12 8 6 7 17 18 17
5 9 11 10 18 7 25 24 6 15 21 6 9 9 25 20 5 25 21 24 18
21 19 12 21 11 22 10 22 23 7 10 13 5 22 15 17 8 6 19
10 18 23 7 14 16 5 25 5 16 21 17 5 12 24 21 19 23 15 15 8
21 16 17 16 9 17 25 11 20 24 25 6 20 19 12 19 9 25 5
10 13 16 21 17 22 8 23 10 9 21 18 12 6 6 24 13 19 18 9 11
13 8 20 24 8 12 10 24 6 25 11 21 21 10 10 16 15 24 15
21 17 6 12 22 11 12 6 7 14 19 9 7 18 18 9 25 13 20 22 21
5 17 16 12 13 18 18 5 6 24 25 9 17 13 22 23 23 8 15
25 19 10 15 22 17 24 7 12 24 6 18 22 22 10 19 15 9 10 18 5
24 22 17 9 20 7 14 21 5 22 24 7 20 16 17 7 9 7 14
45 43 49 43 49 47 50 47 47 48
10 40
20 16 15 25 15 16 17 20 22 21 22 18 16 21 24 19 23 15 20 22 23
22 16 23 19 17 20 25 21 16 15 17 17 17 19 16 20 16 22 17
16 20 19 23 23 18 21 19 22 17 16 20 25 17 18 18 19 15 20 23 15
24 24 23 22 18 15 21 17 24 18 17 22 23 21 15 17 16 24 15
24 22 15 20 22 20 24 17 16 18 18 22 24 25 20 18 17 15 17 19 23
22 20 23 24 18 20 21 23 23 20 23 22 16 25 15 24 20 16 23
23 23 25 23 19 21 15 25 20 21 18 15 17 21 24 23 21 16 18 24 18
16 23 25 20 16 25 15 19 23 25 22 17 25 24 17 18 17 21 20
25 21 21 20 22 15 16 17 17 20 20 22 22 22 17 18 18 20 22 19 18
17 25 25 21 15 18 22 18 16 15 25 17 23 18 22 17 24 22 25
21 22 18 25 21 15 20 20 21 17 22 15 18 16 18 24 21 18 21 22 23
17 25 21 17 24 21 20 22 15 21 20 24 22 22 21 22 16 24 20
19 18 20 19 20 20 25 19 20 23 17 16 19 24 17 23 24 17 22 23 16
22 21 15 17 19 17 15 19 25 15 22 16 23 21 24 16 24 24 24
21 21 21 25 18 25 23 21 25 17 19 25 20 25 15 17 20 23 21 15 24
20 15 22 24 15 21 21 25 25 19 22 22 16 16 19 18 21 15 25
25 18 22 19 19 18 17 19 21 17 16 24 23 25 17 16 24 19 20 17 23
19 20 23 18 18 25 23 18 19 23 25 23 24 22 16 25 23 19 22
15 25 23 21 21 21 19 24 23 21 20 16 25 19 20 17 23 22 20 19 16
18 19 17 25 17 16 24 24 20 21 25 16 23 16 19 24 17 17 18
5 11 18 13 21 19 25 14 9 22 12 20 21 8 20 11 14 10 10 11 23
5 21 16 22 6 16 24 18 15 13 10 15 20 7 13 13 24 24 22
18 25 6 15 15 17 25 20 9 21 24 18 8 21 23 20 12 10 11 17 17
16 12 8 19 19 24 14 12 23 6 17 19 13 21 24 12 13 22 12
24 20 14 15 18 14 24 12 9 21 19 20 10 23 8 23 22 6 11 23 9
11 12 25 13 21 18 7 16 25 7 24 25 5 21 24 14 10 15 6
22 8 11 22 6 6 20 12 13 13 18 18 13 13 5 9 12 22 5 16 11
19 7 19 16 7 8 8 24 8 18 19 17 21 24 17 9 23 19 12
22 6 21 14 12 20 9 19 15 7 21 25 21 25 11 19 19 25 11 9 5
9 15 12 13 10 6 21 13 9 20 23 19 11 20 7 17 20 16 9
17 22 24 6 13 15 11 16 20 6 21 22 12 25 14 6 15 12 13 5 14
10 5 21 20 23 19 7 5 10 8 13 18 14 16 9 8 9 17 9
5 14 25 20 18 13 24 13 22 7 25 13 9 15 9 19 12 8 11 6 14
16 25 19 24 11 5 25 24 7 19 20 14 24 11 21 12 6 5 18
7 14 5 25 14 20 25 18 14 12 20 18 17 7 15 6 25 5 13 23 24
25 13 18 14 18 5 12 20 6 12 8 25 19 19 9 24 8 21 22
11 10 24 25 20 21 20 21 11 20 10 9 13 17 21 18 16 6 21 18 21
25 11 7 20 21 22 7 15 11 14 15 21 22 10 12 7 14 9 14
19 21 20 16 10 25 22 7 6 17 17 22 23 17 20 18 24 24 15 15 10
14 11 7 9 23 6 13 23 23 23 20 14 8 10 14 10 21 8 7
49 52 51 45 48 44 48 50 50 50
10 40
15 22 22 22 23 25 22 25 21 23 19 24 18 24 19 22 18 23 21 22 22
16 24 16 21 17 25 25 24 21 20 23 21 19 23 19 15 19 18 24
16 19 21 18 18 21 21 16 16 17 21 25 19 24 19 19 24 21 17 24 24
23 18 19 25 15 22 22 24 23 23 19 19 19 22 19 25 16 24 25
19 20 16 21 15 17 22 17 21 20 18 21 21 25 24 16 23 19 19 24 21
19 19 24 15 25 16 15 23 22 25 17 15 21 18 17 17 16 16 25
18 23 24 17 17 25 24 15 16 22 24 17 22 19 18 18 25 20 18 22 23
15 19 15 24 22 19 15 24 15 25 21 22 17 23 25 17 20 19 21
19 19 16 22 24 15 20 19 22 20 23 20 18 24 20 16 16 19 18 25 20
16 24 22 15 23 18 20 19 18 19 18 23 19 20 23 20 19 21 17
23 16 19 15 19 20 21 24 18 22 21 25 25 23 22 23 15 19 18 20 15
22 21 25 25 16 17 16 24 22 15 17 20 24 24 18 22 21 18 17
22 21 15 25 23 16 24 22 23 15 20 22 15 15 24 21 16 20 20 22 15
23 21 23 21 24 24 24 21 16 19 23 18 24 25 21 18 18 20 21
21 19 15 20 23 24 16 19 18 20 17 15 21 18 15 16 17 19 18 17 20
22 24 15 18 19 18 25 20 21 18 18 15 20 16 17 19 16 21 22
21 18 25 15 20 18 15 15 16 25 21 24 16 25 20 21 18 18 25 20 25
20 16 20 19 25 15 22 20 19 15 23 17 19 18 23 24 18 19 17
19 17 21 19 17 15 23 15 16 20 20 21 23 23 15 18 18 19 24 20 24
20 18 15 15 21 16 24 22 16 15 15 19 20 22 23 19 21 24 21
25 14 15 6 23 24 7 10 9 11 8 8 11 22 6 14 25 20 20 25 10
6 19 13 18 22 17 21 9 15 7 18 20 19 5 19 12 9 17 6
7 8 6 23 5 19 18 14 23 10 15 8 7 19 12 25 15 22 6 9 11
12 18 21 25 20 8 16 10 13 18 8 24 14 24 6 24 6 7 6
13 5 24 5 9 9 22 12 12 20 25 14 9 17 16 18 19 10 15 5 16
8 10 12 22 21 11 14 24 20 11 21 18 15 9 19 18 8 10 14
9 22 9 21 22 25 17 20 20 25 8 19 24 7 18 5 19 6 18 20 20
18 13 5 10 25 20 6 9 17 7 9 13 21 13 9 21 17 11 20
7 23 21 13 19 22 25 22 18 5 5 8 8 17 22 14 10 12 11 22 15
23 9 15 18 10 15 6 9 8 21 7 16 23 16 12 9 8 5 14
12 25 18 22 13 25 22 23 23 11 21 8 20 10 25 18 12 18 5 19 9
5 20 16 23 14 13 16 14 25 7 14 23 17 14 9 13 17 15 11
5 10 24 22 23 10 15 11 15 8 9 25 15 5 15 10 10 22 17 5 15
13 21 23 15 20 11 5 14 11 8 23 8 9 21 18 6 7 15 19
22 25 13 14 11 11 24 23 9 12 7 14 20 22 13 16 25 21 13 19 25
18 8 5 10 6 5 18 23 25 24 16 6 23 11 21 16 17 20 17
7 24 6 7 22 19 9 19 20 23 8 16 25 22 11 12 10 12 9 24 7
21 16 7 23 7 6 9 5 13 9 16 10 19 12 15 13 5 15 18
5 16 23 12 25 8 10 17 5 11 16 14 23 17 14 19 14 20 22 10 21
15 25 17 10 12 16 8 24 8 9 9 17 10 14 8 13 7 14 18
46 44 46 49 45 51 44 51 44 46
10 40
24 18 17 19 19 24 20 23 15 25 21 18 18 18 19 20 25 15 23 21 25
21 17 21 22 19 20 17 18 19 16 22 20 21 21 16 24 16 20 24
16 16 23 21 25 20 16 25 20 19 24 17 25 24 15 18 25 20 23 15 16
19 17 16 15 16 18 19 20 18 21 21 17 22 23 25 22 17 16 19
25 19 20 25 20 20 24 20 24 20 23 21 18 20 18 20 22 22 20 15 21
17 22 20 24 24 15 21 15 25 18 21 24 17 20 19 20 18 22 20
21 24 18 18 17 17 20 17 21 20 18 18 22 23 19 25 19 21 23 20 17
21 22 22 18 22 16 16 19 23 15 21 17 18 22 17 16 21 18 19
24 16 19 15 23 22 17 23 25 16 22 17 21 22 22 16 20 23 21 25 18
16 25 22 18 21 22 24 19 19 21 20 22 25 25 20 25 22 15 22
19 25 18 18 24 22 16 22 21 19 15 18 16 22 25 25 23 16 20 18 15
23 19 16 19 20 21 17 23 21 18 16 21 18 20 16 16 21 16 16
18 16 24 18 17 20 19 24 17 18 24 18 24 22 16 19 23 22 18 21 15
15 17 24 18 20 23 21 23 16 19 24 19 15 22 20 25 20 22 17
25 24 21 15 20 22 17 17 16 20 24 15 15 16 22 17 22 22 17 20 22
20 16 24 17 15 18 23 24 22 21 21 18 21 15 20 18 18 16 20
15 18 18 17 21 23 24 24 18 24 18 19 16 25 19 17 19 24 15 19 19
19 22 24 15 21 18 19 21 16 20 25 24 24 21 16 23 25 24 22
20 24 18 21 20 23 25 17 20 15 21 25 23 16 24 17 17 23 25 20 21
23 22 21 17 19 18 23 20 17 17 20 23 23 16 25 21 19 22 18
19 8 16 19 11 25 20 5 23 11 20 8 18 5 12 13 12 6 11 8 8
23 17 9 18 5 6 23 9 24 24 19 23 13 10 5 11 24 10 22
9 22 15 17 7 24 19 19 11 6 17 18 9 23 14 20 7 17 23 7 15
8 16 16 9 25 6 5 5 25 7 18 5 18 6 10 8 10 16 18
20 22 15 23 25 25 6 5 14 23 11 5 20 6 5 7 8 9 17 6 8
13 22 19 5 18 13 20 16 12 23 25 11 19 8 21 9 22 8 22
6 7 15 8 11 16 17 14 7 8 20 14 23 13 11 25 5 25 18 5 8
20 9 9 25 23 6 15 20 24 7 19 7 6 7 12 5 10 17 12
25 12 10 20 12 24 20 14 21 5 20 9 12 13 22 23 14 14 14 25 21
5 8 11 19 14 17 15 25 13 14 16 21 8 6 19 7 6 22 20
10 16 19 14 9 18 15 10 19 6 10 11 7 23 24 14 12 5 25 16 13
8 13 25 9 24 15 6 11 24 14 9 24 6 18 21 20 21 10 10
6 8 20 24 9 24 24 10 21 20 12 11 8 24 5 8 10 25 5 6 9
8 20 16 14 7 25 11 10 24 17 23 13 16 9 8 5 15 21 23
12 5 20 13 21 15 11 15 22 20 13 8 18 20 5 20 14 12 22 15 19
7 22 16 15 15 23 19 20 16 10 20 20 11 14 15 12 22 20 22
22 24 10 12 19 20 14 16 10 11 9 15 17 25 5 14 21 24 24 19 15
10 24 9 14 24 15 16 19 14 14 22 13 17 10 11 6 16 12 9
7 8 12 24 12 14 7 11 19 15 20 21 7 5 11 11 6 16 25 14 23
13 9 11 15 9 25 14 25 24 25 10 19 14 25 18 21 21 9 21
45 44 46 42 49 46 45 51 49 49
5
5 20
15 12 16 15 20 18 11 14 23 14 18 13
11 15 17 18 20 11 20 24
22 14 10 15 12 21 24 16 17 22 11 15
18 15 18 23 22 23 21 13
25 11 22 10 22 17 22 12 21 21 16 14
23 21 14 17 25 18 15 15
23 13 14 25 21 18 23 19 17 18 20 20
22 24 23 13 17 22 20 21
15 25 22 14 17 21 16 21 20 12 15 18
17 21 20 20 13 14 23 14
11 11 5 25 10 17 16 20 5 20 14 10
15 6 11 14 13 8 15 11
17 17 12 23 16 25 13 16 19 16 24 17
24 6 6 16 25 21 5 18
13 13 20 17 8 7 16 9 23 18 21 24
11 15 12 24 19 23 13 12
6 10 18 16 12 25 17 7 10 6 20 20
9 20 11 21 6 9 20 23
7 14 18 24 7 24 18 19 18 23 15 16
14 9 16 25 15 20 23 17
42 54 52 47 55
5 20
22 19 13 18 24 21 24 22 11 19 15 15
18 11 14 11 21 14 25 22
13 16 12 18 13 13 16 12 19 21 18 25
20 22 25 22 16 19 18 18
21 20 20 19 10 22 22 22 23 23 17 13
13 20 14 14 24 10 25 13
22 14 18 24 11 14 10 21 15 19 23 23
13 23 20 19 19 18 18 15
22 12 25 20 16 16 19 11 15 21 11 19
21 24 20 16 11 12 15 10
18 9 14 10 18 18 12 22 19 15 21 20
7 14 15 6 13 15 18 15
10 23 23 23 24 6 14 7 16 13 23 6
7 7 21 11 24 17 16 23
15 6 13 13 18 7 22 19 18 6 23 9
10 13 21 23 24 17 16 15
25 7 13 9 23 14 20 9 16 18 22 8
12 13 9 7 11 7 9 19
15 12 10 8 22 17 13 21 11 10 6 20
17 11 10 24 21 18 12 7
49 51 49 43 46
5 20
11 19 24 11 11 23 15 25 17 20 15 16
10 19 23 17 14 20 18 14
13 16 20 13 24 23 24 23 12 21 17 20
22 11 25 12 10 14 17 15
16 14 13 21 19 22 13 10 16 15 22 16
24 19 23 19 24 10 23 10
17 12 20 13 21 24 14 14 14 16 12 15
24 18 13 17 18 18 12 11
19 22 23 14 11 14 18 13 25 18 11 10
21 21 25 20 11 11 13 13
18 6 5 16 21 16 19 23 16 20 14 18
11 20 5 13 7 10 5 13
12 16 21 10 17 7 19 8 24 19 6 18
24 12 8 18 22 25 12 18
7 22 23 12 23 18 6 23 14 8 16 10
20 12 14 13 13 11 19 15
6 23 7 10 13 14 11 17 10 14 22 9
18 7 19 15 19 5 24 13
16 10 19 14 7 18 25 14 8 8 7 8
22 24 16 18 16 11 8 9
45 51 48 45 46
5 20
12 24 13 11 20 12 19 17 19 22 19 22
13 12 10 12 13 13 25 16
25 24 22 10 21 17 21 17 13 15 15 15
20 20 19 14 17 14 12 20
21 11 15 16 11 14 22 22 12 17 15 15
11 18 13 19 20 25 13 13
24 15 19 17 24 20 21 18 25 15 14 23
10 11 23 22 18 19 24 22
14 18 20 14 15 25 13 19 17 10 18 13
21 17 22 18 17 10 20 12
13 6 12 16 23 15 20 9 6 18 21 21
13 9 23 19 16 9 25 11
16 9 9 16 11 17 21 21 23 12 6 20
20 19 12 20 21 24 13 6
21 7 6 7 6 15 18 7 24 12 24 8
14 25 21 21 22 23 16 19
10 23 16 8 11 14 5 25 23 11 25 18
11 14 17 22 15 23 7 18
16 14 17 15 8 24 16 23 6 20 7 12
19 7 19 15 16 20 25 18
49 51 51 52 52
5 20
21 23 20 11 11 17 14 15 16 22 18 17
10 12 14 11 18 13 11 25
23 17 16 18 13 21 14 13 20 14 25 10
17 14 20 20 21 22 22 20
22 20 12 22 13 13 16 22 22 10 18 13
13 11 19 13 20 10 16 19
11 10 23 19 18 21 17 11 10 21 19 22
18 22 17 21 15 10 24 24
18 22 23 19 15 12 14 13 12 22 21 15
12 11 21 20 22 13 11 21
14 12 6 18 9 12 19 7 22 19 7 6
25 10 13 7 24 17 12 6
15 19 25 17 16 7 8 21 21 5 8 13
16 24 15 14 8 7 18 18
17 15 23 14 24 10 15 17 8 23 16 23
25 13 24 17 6 14 7 21
24 23 19 15 15 13 6 12 21 21 16 5
8 11 9 9 23 11 8 11
25 11 15 11 9 18 10 23 9 7 19 14
7 6 22 17 7 7 5 13
43 47 54 45 42
5
5 25
18 19 19 17 24 25 24 25 25 23 20 21 25 17 25 21 25 19 23 19 20
15 25 23 17
25 17 18 16 18 15 23 20 19 22 23 18 17 16 16 24 16 23 23 24 19
17 15 17 17
17 25 15 23 21 20 24 17 21 22 22 15 18 23 17 22 20 24 19 18 15
15 18 19 19
21 16 25 23 18 21 18 16 21 21 15 21 24 23 24 23 20 25 24 18 19
23 22 22 16
24 16 24 19 16 25 23 25 17 21 21 22 17 25 19 21 23 19 17 24 19
15 20 15 20
25 23 5 13 6 15 24 9 17 11 5 6 8 14 9 9 21 23 13 8 22
20 24 15 20
18 8 5 20 8 7 13 17 9 16 19 11 6 12 25 23 9 21 11 15 24
23 15 21 12
7 25 13 9 16 16 8 17 5 17 10 18 21 25 17 24 20 16 9 18 18
18 16 6 24
25 11 8 7 25 20 24 16 9 15 22 10 17 6 22 11 19 20 14 14 8
18 22 18 22
7 16 20 18 13 10 15 20 5 19 11 6 11 23 15 21 15 20 21 11 9
25 17 18 12
58 58 62 64 60
5 25
22 20 18 19 18 24 22 17 23 20 24 15 21 24 24 24 24 25 19 15 22
19 20 16 20
15 25 18 18 21 15 20 16 21 17 15 22 18 20 18 18 19 15 15 17 19
19 17 22 22
23 18 24 15 20 24 18 18 20 16 23 16 23 16 15 17 17 20 24 22 23
17 15 25 17
17 19 18 20 20 19 17 25 19 20 16 17 17 16 21 21 25 18 15 15 24
24 15 15 24
17 22 19 19 19 24 15 16 16 25 25 24 20 17 15 17 17 19 16 18 23
20 15 21 18
14 11 25 16 17 18 22 16 20 6 6 14 14 25 9 7 6 11 25 19 22
11 20 8 19
18 16 5 17 8 21 9 5 12 9 8 20 6 18 16 11 14 11 6 21 6
5 14 18 12
11 5 6 8 20 12 14 9 15 17 23 11 11 12 20 16 10 10 12 18 24
6 20 9 18
6 16 8 6 5 9 12 7 24 8 10 14 23 12 9 5 22 8 11 5 16
6 20 14 17
16 23 5 6 8 24 25 5 25 19 23 8 16 7 16 8 16 14 17 25 18
23 12 5 20
60 48 53 46 61
5 25
15 19 20 22 21 24 20 22 18 24 20 22 18 24 21 16 21 17 17 18 25
21 22 25 22
21 24 24 17 24 20 19 23 16 23 23 22 17 16 23 16 24 18 15 17 24
22 24 15 16
18 25 16 22 18 23 21 21 19 25 15 19 23 19 19 15 22 17 16 21 18
22 17 25 18
22 22 15 19 18 19 19 22 17 17 24 20 21 21 24 19 25 19 15 20 22
18 20 17 15
23 18 21 23 15 19 19 19 20 19 17 20 20 21 23 25 24 23 23 19 19
20 17 15 24
19 14 6 10 6 20 16 12 17 23 7 23 20 15 7 17 7 25 10 17 10
6 10 23 12
18 8 17 19 19 24 20 10 11 14 17 19 23 24 7 25 24 24 8 17 9
22 8 11 11
14 15 18 22 9 8 10 21 17 18 9 19 6 25 17 6 12 6 12 15 21
12 14 19 7
6 5 5 23 12 6 11 16 13 20 12 9 24 16 22 12 8 24 21 13 8
18 13 17 21
18 25 20 18 20 8 18 24 11 9 14 23 18 19 11 5 12 11 17 16 22
17 6 16 24
56 65 56 56 64
5 25
16 18 22 17 21 18 15 20 16 17 17 20 23 18 24 25 22 20 20 23 25
16 17 24 18
23 15 16 16 15 21 20 25 18 16 25 15 20 18 16 16 20 17 17 22 23
22 20 17 18
21 20 22 20 24 24 24 23 18 15 18 17 19 17 21 25 21 16 22 16 17
25 20 18 19
21 18 22 24 24 24 22 21 20 15 20 18 25 24 25 15 19 15 21 23 23
24 20 17 15
18 19 24 16 17 16 17 22 23 24 15 20 23 17 21 24 23 22 17 16 25
15 20 23 16
21 18 18 5 12 23 21 12 16 20 21 23 12 9 24 6 22 22 12 20 5
11 8 6 14
9 18 18 16 22 8 10 17 15 13 22 20 19 7 10 25 15 10 21 10 23
8 6 20 11
23 8 16 25 5 14 18 12 17 21 25 12 16 24 5 18 16 21 23 9 21
25 8 5 16
14 5 18 11 15 10 10 11 6 16 7 17 20 7 24 12 6 18 8 12 17
6 25 16 23
18 18 7 21 23 13 5 15 20 24 19 21 23 10 22 23 11 22 25 7 21
11 23 13 22
60 59 64 53 69
5 25
24 21 17 22 19 18 20 21 15 21 17 25 18 18 15 20 16 19 16 24 16
22 18 17 22
20 23 23 21 24 22 21 24 15 17 22 17 20 16 24 18 19 21 22 18 23
18 23 16 24
22 18 24 22 17 17 16 15 25 23 16 16 19 21 24 20 24 15 15 23