Skip to content
Snippets Groups Projects
Commit 2d0abb66 authored by Robin VAN DE MERGHEL's avatar Robin VAN DE MERGHEL :computer:
Browse files

Adding MRP

parent 1b101a67
Branches
No related tags found
No related merge requests found
...@@ -83,55 +83,190 @@ def generate_random_instance(n, version_number=1): ...@@ -83,55 +83,190 @@ def generate_random_instance(n, version_number=1):
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
def generate_random_assignment(agencies_choices, candidates_choices):
"""Returns a random assignment as a 2 tuple of dictionaries."""
agenciesAssign = {agency: random.choice(
agencies_choices[agency]) for agency in agencies_choices}
candidatesAssign = {candidate: random.choice(
candidates_choices[candidate]) for candidate in candidates_choices}
return agenciesAssign, candidatesAssign
# ------------------------------------------------------------------------------
def generate_straight_assignment(agencies_choices, candidates_choices):
"""Returns a straight assignment as a 2 tuple of dictionaries."""
agencies = list(agencies_choices.keys())
candidates = list(candidates_choices.keys())
agenciesAssign = {agency: candidates[i]
for i, agency in enumerate(agencies)}
candidatesAssign = {candidate: agencies[i]
for i, candidate in enumerate(candidates)}
return agenciesAssign, candidatesAssign
def number_of_non_stable_couples(agencies_assign, candidates_assign, def number_of_non_stable_couples(agencies_assign, candidates_assign,
agencies_choices, candidates_choices): agencies_choices, candidates_choices):
"""Returns the number of non stable couples in the assignment.""" """Returns the number of non stable couples in the assignment."""
n = len(agencies_assign) # A non stable couple is as situation where there are two couples : (A,B) and (C,D), and where A prefers C to B and C prefers A to D.
number = 0
nonStable = 0
for i in range(1, n+1): for agencyName in agencies_assign:
# We get both the agency and the candidate agencyAssignement = agencies_assign[agencyName]
agency = f"A{i}" agencyAssignementIndex = agencies_choices[agencyName].index(
candidate = agencies_assign[agency] agencyAssignement)
# Check if the agency choice is the first one, if yes, you can continue if agencyAssignementIndex == 0:
if agencies_choices[agency][0] == candidate:
continue continue
# We get the index of the agency in the candidate choices selectedCandidate = agencies_assign[agencyName]
index = candidates_choices[candidate].index(agency)
# We check if the agency is in the first index of the candidate choices
if index == 0:
continue
for i in range(agencyAssignementIndex):
candidate = agencies_choices[agencyName][i]
candidateAgency = candidates_assign[candidate]
candidateAgencyIndex = candidates_choices[candidate].index(
candidateAgency)
candidateAgencyRank = candidates_choices[candidate].index(
agencyName)
if candidateAgencyRank < candidateAgencyIndex:
print(
f"Agency {agencyName} prefers {candidate} to {selectedCandidate} and {candidate} prefers {agencyName} to {candidateAgency}.")
number += 1
return number
return nonStable
n, agencies, candidates = extract_instance_from_file("./couple.txt") n, agencies, candidates = extract_instance_from_file("./couple.txt")
print(number_of_non_stable_couples(agencies, candidates, agencies, candidates)) # agenciesAssign, candidatesAssign = generate_random_assignment(
# agencies, candidates)
agenciesAssign, candidatesAssign = generate_straight_assignment(
agencies, candidates)
# ------------------------------------------------------------------------------ print(number_of_non_stable_couples(agenciesAssign,
def generate_random_assignment(agencies_choices, candidates_choices): candidatesAssign, agencies, candidates))
"""Returns a random assignment as a 2 tuple of dictionaries."""
pass
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
def gale_shapley_algorithm(agencies_choices, candidates_choices): def gale_shapley_algorithm(Oagencies_choices, Ocandidates_choices):
"""Run the Gale-Shapley algorithm and returns an assignment.""" """Run the Gale-Shapley algorithm and returns an assignment."""
pass # While not all agencies are assigned
agencies_choices = dict(Oagencies_choices)
candidates_choices = dict(Ocandidates_choices)
agenciesAssign = {}
candidatesAssign = {}
n = len(agencies_choices)
while not len(agenciesAssign) == n:
for agency in agencies_choices:
if agency in agenciesAssign:
continue
candidate = agencies_choices[agency][0]
if candidate not in candidatesAssign:
agenciesAssign[agency] = candidate
candidatesAssign[candidate] = agency
else:
candidateAgency = candidatesAssign[candidate]
candidateAgencyRank = candidates_choices[candidate].index(
agency)
candidateAgencyIndex = candidates_choices[candidate].index(
candidateAgency)
if candidateAgencyRank < candidateAgencyIndex:
agenciesAssign[agency] = candidate
candidatesAssign[candidate] = agency
del agenciesAssign[candidateAgency]
else:
agencies_choices[agency].remove(candidate)
return agenciesAssign, candidatesAssign
def gale_shapley_algorithm2(agencies_choices, candidates_choices):
"""Run the Gale-Shapley algorithm and returns an assignment."""
# While not all agencies are assigned
agenciesAssign = {}
candidatesAssign = {}
agenciesIndexes = {agency:0 for agency in agencies_choices}
n = len(agencies_choices)
while not len(agenciesAssign) == n:
for agency in agencies_choices:
if agency in agenciesAssign:
continue
candidate = agencies_choices[agency][agenciesIndexes[agency]]
if candidate not in candidatesAssign:
agenciesAssign[agency] = candidate
candidatesAssign[candidate] = agency
else:
candidateAgency = candidatesAssign[candidate]
candidateAgencyRank = candidates_choices[candidate].index(
agency)
candidateAgencyIndex = candidates_choices[candidate].index(
candidateAgency)
if candidateAgencyRank < candidateAgencyIndex:
agenciesAssign[agency] = candidate
candidatesAssign[candidate] = agency
del agenciesAssign[candidateAgency]
else:
agenciesIndexes[agency]+=1
return agenciesAssign, candidatesAssign
agenciesAssign, candidatesAssign = gale_shapley_algorithm2(agencies, candidates)
for agency in agenciesAssign:
print(f"{agency} -> {agenciesAssign[agency]}")
# After the algorithm, we can check if the result is stable or not
print("\n---------------------\n")
print(number_of_non_stable_couples(agenciesAssign,
candidatesAssign, agencies, candidates))
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
def all_assignments(agencies_choices, candidates_choices): def all_assignments(agencies_choices, candidates_choices):
"""Returns an iterator on all the possible (stable or not stable) """Returns an iterator on all the possible (stable or not stable)
assigments. Uses the itertools library. """ assigments. Uses the itertools library. """
import itertools # You can use tools from this library import itertools # You can use tools from this library
pass # Question plus difficile.
agencies = list(agencies_choices.keys())
candidates = list(candidates_choices.keys())
def h(i):
if i == n:
yield resultat
else:
resultat[agencies[i]] = candidates[0]
yield from h(i+1)
resultat[agencies[i]] = candidates[1]
yield from h(i+1)
resultat[agencies[i]] = candidates[2]
yield from h(i+1)
resultat[agencies[i]] = candidates[3]
yield from h(i+1)
resultat = {agency: 0 for agency in agencies}
yield from h(0)
# for assignment in all_assignments(agencies, candidates):
# print(assignment)
4 4
A1:C4:C2:C1:C3 A:4:2:1:3
A2:C4:C1:C3:C2 B:4:1:3:2
A3:C1:C2:C3:C4 C:1:2:3:4
A4:C3:C1:C4:C2 D:3:1:4:2
C1:A3:A2:A1:A4 1:C:B:A:D
C2:A2:A1:A4:A3 2:B:A:D:C
C3:A1:A4:A2:A3 3:A:D:B:C
C4:A4:A1:A3:A2 4:D:A:C:B
\ No newline at end of file \ No newline at end of file
42
A1:C41:C18:C28:C42:C3:C9:C20:C23:C31:C34:C5:C38:C10:C13:C33:C19:C30:C39:C15:C8:C1:C14:C2:C12:C21:C27:C11:C6:C22:C37:C35:C40:C17:C29:C26:C24:C16:C7:C4:C36:C32:C25
A2:C14:C31:C10:C21:C18:C34:C5:C17:C28:C41:C35:C3:C16:C42:C32:C11:C13:C20:C27:C30:C6:C29:C4:C24:C1:C37:C38:C7:C15:C9:C25:C22:C12:C40:C8:C33:C23:C26:C19:C2:C39:C36
A3:C15:C35:C26:C18:C12:C32:C4:C28:C34:C38:C22:C1:C23:C25:C2:C11:C39:C20:C7:C29:C3:C8:C6:C31:C27:C19:C37:C17:C16:C30:C42:C5:C21:C33:C24:C13:C41:C10:C14:C36:C9:C40
A4:C5:C41:C24:C37:C21:C38:C7:C33:C31:C42:C36:C26:C17:C30:C10:C40:C32:C9:C23:C6:C15:C1:C27:C19:C3:C2:C8:C4:C25:C20:C18:C11:C13:C12:C14:C35:C39:C22:C16:C29:C28:C34
A5:C17:C15:C1:C27:C38:C10:C19:C2:C22:C39:C7:C37:C41:C3:C5:C28:C36:C30:C40:C42:C35:C13:C33:C8:C25:C24:C11:C4:C23:C6:C18:C9:C32:C29:C26:C14:C21:C34:C20:C12:C16:C31
A6:C17:C3:C26:C25:C37:C31:C40:C12:C14:C18:C28:C23:C10:C30:C38:C22:C11:C35:C16:C29:C20:C36:C15:C2:C13:C9:C32:C6:C27:C42:C24:C7:C41:C39:C21:C1:C19:C34:C4:C5:C8:C33
A7:C27:C7:C30:C17:C4:C1:C10:C24:C20:C39:C8:C14:C15:C13:C11:C3:C6:C35:C28:C33:C19:C37:C26:C21:C16:C42:C5:C38:C32:C40:C18:C22:C34:C2:C12:C9:C29:C23:C36:C31:C25:C41
A8:C16:C18:C27:C36:C30:C5:C41:C15:C20:C7:C28:C13:C34:C24:C8:C6:C37:C22:C23:C10:C31:C42:C32:C3:C39:C26:C11:C4:C12:C38:C33:C9:C14:C29:C25:C21:C35:C1:C40:C17:C19:C2
A9:C40:C14:C25:C4:C36:C17:C32:C39:C26:C9:C23:C34:C13:C38:C18:C2:C16:C37:C6:C33:C42:C11:C22:C19:C27:C41:C15:C24:C30:C28:C12:C5:C21:C3:C29:C8:C35:C20:C7:C1:C10:C31
A10:C26:C10:C18:C2:C8:C17:C32:C31:C15:C29:C1:C4:C16:C27:C23:C12:C28:C25:C34:C3:C20:C37:C35:C14:C40:C39:C13:C38:C24:C21:C7:C33:C41:C42:C22:C5:C9:C36:C6:C11:C30:C19
A11:C11:C4:C17:C22:C2:C34:C19:C18:C40:C28:C13:C5:C30:C33:C26:C3:C12:C20:C21:C14:C35:C39:C24:C9:C7:C16:C29:C23:C38:C27:C41:C36:C15:C25:C31:C42:C1:C32:C6:C37:C10:C8
A12:C15:C10:C24:C35:C1:C21:C42:C27:C41:C30:C29:C18:C36:C23:C22:C25:C2:C38:C12:C17:C19:C3:C33:C6:C5:C34:C8:C31:C37:C11:C39:C16:C7:C26:C28:C32:C40:C4:C9:C14:C13:C20
A13:C37:C36:C30:C39:C1:C12:C7:C21:C35:C33:C11:C38:C2:C28:C25:C34:C22:C3:C31:C19:C16:C24:C10:C6:C13:C40:C20:C29:C14:C15:C18:C4:C23:C9:C42:C17:C8:C26:C27:C32:C41:C5
A14:C41:C29:C6:C37:C24:C38:C12:C36:C16:C26:C3:C28:C35:C8:C30:C34:C39:C25:C40:C11:C7:C42:C23:C19:C22:C13:C2:C15:C18:C4:C32:C21:C1:C20:C10:C27:C9:C33:C31:C5:C17:C14
A15:C12:C7:C10:C11:C14:C20:C6:C15:C28:C41:C5:C26:C21:C13:C38:C32:C23:C16:C18:C27:C40:C8:C33:C1:C36:C19:C39:C37:C2:C31:C3:C4:C24:C29:C25:C30:C9:C42:C22:C34:C35:C17
A16:C38:C17:C39:C26:C34:C36:C19:C29:C23:C6:C41:C7:C32:C1:C24:C11:C15:C28:C4:C14:C12:C20:C31:C16:C8:C40:C21:C2:C3:C25:C9:C18:C5:C10:C22:C13:C33:C37:C30:C27:C42:C35
A17:C9:C33:C25:C10:C42:C5:C32:C24:C2:C29:C17:C39:C16:C41:C11:C7:C26:C23:C13:C35:C8:C36:C28:C18:C38:C3:C15:C22:C20:C21:C6:C27:C30:C1:C31:C14:C4:C12:C37:C34:C40:C19
A18:C35:C5:C27:C7:C31:C17:C23:C9:C29:C38:C4:C24:C34:C33:C1:C37:C40:C10:C28:C8:C15:C41:C30:C36:C21:C11:C39:C42:C20:C14:C18:C3:C19:C26:C25:C2:C16:C6:C13:C32:C12:C22
A19:C19:C28:C42:C8:C25:C33:C12:C18:C17:C26:C10:C39:C41:C16:C7:C34:C11:C5:C27:C37:C13:C9:C20:C36:C21:C22:C24:C2:C6:C14:C4:C3:C38:C40:C15:C31:C35:C32:C29:C30:C23:C1
A20:C6:C1:C7:C40:C37:C26:C16:C24:C41:C21:C27:C33:C4:C36:C10:C18:C9:C2:C13:C38:C14:C31:C42:C12:C39:C11:C29:C17:C28:C19:C30:C23:C35:C34:C20:C3:C25:C15:C22:C32:C5:C8
A21:C40:C25:C23:C36:C6:C37:C32:C12:C34:C7:C21:C4:C29:C39:C15:C8:C10:C24:C1:C30:C5:C26:C31:C11:C2:C28:C35:C18:C20:C38:C22:C13:C3:C9:C41:C33:C27:C19:C14:C42:C16:C17
A22:C5:C31:C42:C26:C6:C41:C16:C14:C29:C12:C21:C38:C33:C19:C30:C24:C25:C18:C7:C3:C34:C2:C20:C22:C17:C8:C4:C11:C39:C27:C10:C32:C35:C1:C36:C13:C15:C23:C37:C9:C40:C28
A23:C18:C30:C36:C16:C11:C42:C4:C1:C33:C17:C37:C19:C39:C38:C7:C32:C15:C41:C8:C5:C14:C13:C6:C40:C12:C29:C34:C26:C22:C25:C28:C23:C31:C24:C9:C3:C35:C10:C21:C27:C20:C2
A24:C33:C2:C24:C12:C13:C7:C34:C16:C40:C28:C9:C22:C11:C4:C30:C18:C26:C5:C8:C6:C38:C42:C27:C32:C29:C20:C10:C15:C37:C36:C3:C23:C19:C39:C41:C21:C35:C17:C14:C1:C25:C31
A25:C7:C35:C24:C22:C26:C8:C31:C29:C15:C41:C39:C19:C33:C30:C28:C12:C17:C34:C36:C6:C3:C37:C10:C13:C18:C27:C2:C42:C21:C5:C23:C40:C9:C16:C25:C38:C11:C20:C4:C1:C32:C14
A26:C25:C28:C6:C8:C15:C3:C36:C34:C10:C40:C20:C11:C9:C4:C39:C17:C16:C26:C18:C38:C12:C35:C5:C2:C33:C21:C32:C22:C30:C29:C41:C27:C42:C24:C31:C7:C23:C13:C37:C14:C1:C19
A27:C23:C41:C25:C36:C31:C2:C6:C16:C10:C30:C33:C21:C39:C8:C19:C27:C35:C1:C29:C4:C7:C28:C37:C40:C34:C12:C18:C17:C42:C38:C15:C5:C3:C13:C24:C9:C14:C11:C20:C22:C32:C26
A28:C20:C14:C36:C5:C13:C8:C35:C40:C38:C10:C25:C15:C27:C24:C1:C3:C6:C12:C11:C30:C39:C16:C19:C7:C41:C31:C32:C29:C42:C2:C21:C9:C18:C4:C28:C33:C17:C23:C34:C26:C37:C22
A29:C8:C18:C25:C15:C9:C31:C19:C26:C28:C30:C14:C17:C13:C38:C33:C10:C41:C32:C20:C24:C22:C34:C4:C7:C6:C1:C12:C21:C42:C3:C35:C5:C2:C27:C40:C16:C36:C29:C39:C23:C37:C11
A30:C7:C42:C1:C40:C41:C25:C32:C5:C6:C13:C27:C34:C31:C37:C19:C38:C10:C2:C28:C30:C23:C17:C22:C9:C36:C33:C18:C39:C3:C20:C35:C14:C12:C29:C8:C24:C15:C26:C21:C11:C16:C4
A31:C14:C36:C15:C10:C28:C21:C30:C33:C26:C9:C22:C38:C3:C31:C27:C13:C4:C17:C18:C34:C29:C6:C11:C32:C25:C42:C39:C40:C23:C35:C1:C24:C12:C20:C7:C19:C37:C16:C2:C41:C5:C8
A32:C10:C4:C39:C41:C33:C42:C26:C21:C31:C6:C1:C15:C14:C27:C34:C38:C5:C13:C12:C36:C28:C16:C11:C35:C22:C23:C40:C18:C3:C37:C8:C29:C2:C7:C20:C25:C17:C32:C9:C19:C24:C30
A33:C39:C3:C2:C11:C14:C18:C40:C7:C23:C13:C5:C37:C10:C4:C25:C41:C22:C8:C27:C29:C16:C32:C26:C36:C24:C38:C12:C34:C1:C30:C9:C6:C35:C15:C28:C20:C42:C31:C17:C33:C19:C21
A34:C8:C39:C5:C30:C19:C1:C26:C6:C36:C32:C31:C40:C14:C24:C7:C33:C23:C11:C28:C3:C42:C34:C22:C21:C16:C38:C2:C35:C18:C9:C27:C41:C29:C25:C15:C12:C4:C17:C13:C37:C20:C10
A35:C31:C14:C1:C29:C26:C33:C19:C5:C28:C35:C36:C42:C6:C23:C12:C7:C9:C18:C24:C27:C21:C8:C11:C4:C20:C38:C30:C39:C15:C10:C41:C3:C34:C2:C22:C13:C37:C17:C16:C40:C25:C32
A36:C37:C15:C36:C5:C12:C24:C25:C28:C23:C10:C14:C27:C19:C38:C21:C32:C18:C41:C34:C13:C31:C35:C16:C22:C2:C26:C42:C17:C6:C39:C9:C11:C1:C4:C40:C7:C20:C29:C30:C8:C3:C33
A37:C16:C22:C3:C5:C34:C32:C15:C23:C38:C4:C42:C24:C14:C10:C21:C41:C26:C17:C18:C25:C1:C11:C29:C35:C33:C40:C28:C6:C27:C8:C19:C7:C31:C9:C39:C36:C30:C37:C20:C12:C13:C2
A38:C16:C3:C27:C13:C7:C34:C9:C15:C38:C20:C41:C36:C39:C2:C23:C10:C22:C33:C26:C37:C42:C18:C1:C17:C31:C24:C21:C14:C19:C40:C11:C28:C30:C8:C6:C12:C25:C35:C29:C5:C32:C4
A39:C13:C6:C1:C4:C5:C16:C12:C10:C8:C41:C14:C18:C25:C38:C23:C36:C2:C30:C19:C21:C33:C17:C39:C3:C34:C26:C27:C9:C42:C28:C35:C40:C7:C29:C20:C24:C31:C37:C15:C32:C11:C22
A40:C6:C19:C27:C34:C35:C7:C36:C26:C29:C31:C15:C30:C37:C25:C32:C20:C21:C5:C28:C4:C38:C18:C10:C17:C42:C9:C16:C23:C1:C2:C24:C41:C13:C33:C22:C12:C3:C14:C8:C39:C40:C11
A41:C9:C32:C19:C5:C12:C38:C42:C36:C20:C39:C34:C17:C8:C10:C25:C33:C4:C26:C6:C37:C23:C16:C2:C24:C30:C31:C22:C41:C15:C1:C28:C13:C11:C7:C14:C27:C40:C3:C35:C18:C29:C21
A42:C13:C39:C28:C21:C16:C9:C4:C6:C24:C20:C31:C3:C29:C26:C12:C41:C40:C17:C10:C30:C38:C25:C2:C22:C36:C1:C35:C33:C14:C32:C18:C42:C37:C27:C19:C11:C8:C7:C23:C5:C34:C15
C1:A7:A39:A38:A6:A25:A2:A36:A35:A9:A37:A10:A15:A20:A8:A17:A11:A28:A1:A13:A31:A22:A12:A26:A42:A24:A18:A3:A29:A40:A30:A19:A4:A14:A5:A21:A41:A23:A32:A33:A16:A34:A27
C2:A15:A7:A33:A14:A22:A30:A28:A39:A13:A10:A40:A6:A42:A18:A4:A16:A26:A17:A3:A31:A1:A27:A34:A25:A29:A37:A35:A9:A23:A24:A11:A12:A21:A19:A20:A38:A2:A32:A36:A8:A5:A41
C3:A8:A35:A7:A41:A25:A30:A23:A17:A20:A36:A16:A11:A14:A24:A37:A42:A21:A12:A5:A18:A28:A19:A2:A3:A29:A1:A10:A33:A32:A4:A26:A38:A22:A9:A27:A15:A39:A34:A6:A40:A13:A31
C4:A41:A31:A26:A5:A3:A32:A21:A20:A39:A27:A25:A9:A34:A35:A15:A23:A7:A42:A4:A11:A33:A17:A28:A40:A19:A36:A22:A14:A30:A10:A13:A29:A38:A6:A16:A24:A12:A18:A37:A1:A2:A8
C5:A9:A22:A33:A25:A39:A41:A15:A8:A10:A5:A6:A40:A21:A42:A29:A16:A32:A35:A19:A13:A18:A30:A3:A11:A23:A37:A34:A20:A36:A27:A31:A17:A26:A2:A12:A24:A38:A1:A14:A7:A28:A4
C6:A27:A42:A29:A19:A6:A1:A24:A3:A2:A5:A31:A28:A36:A33:A15:A32:A30:A20:A16:A12:A23:A17:A38:A40:A21:A9:A10:A18:A25:A13:A26:A14:A39:A11:A7:A34:A8:A4:A35:A22:A37:A41
C7:A22:A39:A5:A7:A19:A13:A31:A15:A18:A20:A35:A23:A16:A33:A28:A30:A9:A27:A8:A12:A29:A21:A32:A17:A38:A37:A1:A25:A14:A26:A24:A2:A4:A3:A34:A10:A42:A41:A36:A40:A11:A6
C8:A36:A7:A20:A22:A16:A37:A2:A6:A26:A14:A30:A24:A39:A31:A10:A9:A42:A4:A5:A32:A13:A18:A27:A15:A23:A12:A33:A3:A19:A1:A38:A11:A41:A34:A8:A25:A21:A17:A35:A29:A28:A40
C9:A3:A28:A18:A34:A33:A7:A21:A24:A5:A20:A42:A30:A15:A35:A39:A40:A38:A36:A25:A2:A32:A27:A14:A29:A13:A26:A22:A12:A19:A37:A31:A23:A11:A17:A41:A6:A9:A10:A4:A1:A8:A16
C10:A23:A18:A21:A33:A7:A1:A10:A2:A26:A35:A34:A8:A25:A19:A41:A38:A20:A30:A13:A29:A31:A42:A36:A15:A28:A4:A39:A6:A17:A16:A22:A37:A14:A24:A40:A27:A12:A11:A5:A3:A32:A9
C11:A42:A7:A40:A5:A9:A6:A12:A31:A17:A14:A2:A10:A8:A26:A15:A18:A1:A36:A30:A41:A25:A32:A11:A38:A24:A35:A19:A29:A3:A20:A23:A39:A21:A27:A13:A37:A33:A28:A34:A4:A16:A22
C12:A19:A18:A22:A13:A4:A1:A11:A40:A41:A35:A12:A26:A42:A14:A33:A9:A3:A30:A34:A7:A20:A28:A5:A21:A32:A36:A15:A25:A2:A39:A17:A10:A37:A23:A31:A8:A38:A6:A24:A16:A27:A29
C13:A41:A39:A24:A35:A31:A1:A8:A19:A5:A20:A13:A17:A40:A38:A29:A7:A10:A23:A3:A2:A30:A26:A37:A14:A15:A28:A4:A16:A9:A32:A12:A25:A11:A6:A36:A42:A27:A18:A33:A22:A34:A21
C14:A34:A24:A36:A5:A1:A3:A19:A10:A4:A14:A31:A23:A26:A32:A39:A41:A11:A18:A40:A35:A28:A12:A42:A6:A33:A37:A8:A16:A7:A38:A13:A20:A30:A29:A17:A22:A27:A15:A9:A25:A21:A2
C15:A31:A24:A32:A13:A14:A23:A9:A29:A28:A1:A21:A20:A27:A40:A4:A35:A8:A38:A22:A15:A42:A11:A36:A5:A41:A19:A25:A34:A33:A12:A37:A26:A6:A3:A16:A30:A18:A7:A39:A2:A10:A17
C16:A13:A18:A16:A4:A11:A6:A9:A23:A22:A29:A14:A42:A26:A28:A30:A12:A41:A40:A39:A38:A2:A25:A5:A21:A19:A20:A1:A15:A7:A27:A8:A17:A35:A34:A24:A3:A36:A33:A31:A10:A32:A37
C17:A18:A39:A37:A14:A9:A30:A4:A1:A33:A5:A12:A3:A7:A26:A11:A34:A24:A25:A20:A38:A23:A27:A19:A21:A31:A29:A2:A13:A36:A15:A40:A6:A8:A22:A41:A28:A35:A16:A10:A42:A32:A17
C18:A40:A20:A8:A39:A31:A16:A37:A12:A32:A25:A34:A41:A10:A30:A4:A27:A23:A22:A19:A17:A13:A28:A3:A18:A42:A5:A11:A26:A7:A6:A36:A2:A14:A21:A38:A33:A24:A9:A15:A35:A1:A29
C19:A14:A35:A8:A3:A28:A22:A21:A31:A4:A33:A11:A37:A34:A9:A6:A12:A17:A18:A27:A1:A5:A15:A38:A41:A20:A19:A40:A30:A29:A13:A39:A32:A16:A7:A10:A25:A42:A23:A2:A36:A26:A24
C20:A16:A20:A1:A3:A22:A41:A18:A10:A25:A33:A21:A32:A4:A24:A30:A37:A15:A11:A5:A31:A34:A39:A35:A17:A7:A36:A6:A14:A13:A2:A12:A28:A40:A27:A26:A8:A19:A29:A23:A38:A42:A9
C21:A28:A31:A20:A30:A42:A4:A37:A35:A22:A15:A25:A5:A13:A33:A19:A14:A16:A9:A6:A7:A11:A39:A12:A2:A41:A26:A21:A38:A32:A23:A24:A27:A34:A8:A18:A17:A29:A40:A1:A10:A36:A3
C22:A3:A8:A40:A20:A12:A22:A29:A11:A19:A7:A36:A26:A23:A13:A32:A15:A37:A17:A31:A14:A1:A28:A18:A39:A2:A42:A35:A38:A10:A27:A33:A4:A34:A21:A30:A41:A5:A25:A6:A16:A9:A24
C23:A6:A11:A16:A35:A28:A41:A23:A24:A32:A3:A27:A29:A21:A13:A8:A20:A34:A36:A37:A39:A10:A18:A14:A4:A42:A2:A26:A9:A12:A33:A15:A19:A1:A5:A25:A22:A31:A40:A17:A7:A38:A30
C24:A19:A15:A11:A41:A18:A42:A25:A30:A31:A17:A9:A33:A36:A38:A27:A40:A20:A34:A24:A39:A23:A5:A6:A14:A13:A32:A28:A29:A1:A2:A3:A37:A26:A4:A7:A16:A22:A10:A35:A12:A8:A21
C25:A37:A5:A41:A31:A35:A12:A8:A11:A28:A36:A18:A39:A20:A9:A33:A32:A6:A25:A23:A26:A42:A19:A7:A16:A1:A10:A2:A34:A14:A29:A40:A3:A21:A24:A27:A13:A38:A17:A4:A15:A30:A22
C26:A2:A26:A11:A14:A1:A40:A25:A27:A12:A34:A5:A9:A13:A10:A35:A23:A32:A7:A36:A29:A28:A4:A39:A6:A38:A37:A41:A16:A17:A15:A24:A8:A21:A31:A20:A33:A18:A3:A19:A22:A42:A30
C27:A12:A4:A13:A19:A30:A7:A32:A17:A37:A1:A23:A18:A5:A40:A9:A34:A39:A20:A25:A38:A14:A11:A15:A8:A36:A28:A35:A22:A33:A29:A10:A24:A42:A21:A6:A27:A3:A31:A41:A2:A26:A16
C28:A8:A3:A22:A36:A23:A25:A14:A11:A5:A40:A35:A24:A37:A26:A20:A15:A42:A16:A30:A19:A31:A21:A33:A1:A12:A2:A28:A10:A6:A13:A27:A17:A29:A34:A41:A32:A39:A7:A4:A9:A38:A18
C29:A29:A36:A27:A9:A25:A41:A34:A42:A7:A1:A32:A24:A3:A37:A8:A30:A12:A5:A18:A23:A26:A11:A21:A13:A10:A14:A20:A15:A19:A35:A31:A39:A28:A22:A33:A17:A40:A38:A6:A2:A16:A4
C30:A13:A9:A2:A11:A32:A26:A16:A29:A38:A41:A36:A17:A25:A27:A1:A37:A21:A28:A31:A7:A30:A5:A12:A24:A6:A42:A34:A10:A33:A4:A14:A20:A8:A40:A22:A23:A39:A19:A18:A15:A35:A3
C31:A39:A18:A17:A3:A24:A36:A11:A23:A19:A37:A5:A31:A26:A30:A34:A8:A10:A14:A22:A42:A38:A9:A16:A35:A21:A41:A33:A32:A29:A15:A1:A2:A4:A6:A25:A27:A12:A20:A7:A40:A28:A13
C32:A19:A37:A12:A21:A17:A15:A40:A5:A34:A31:A24:A39:A13:A36:A2:A25:A3:A28:A8:A14:A18:A32:A26:A23:A30:A42:A35:A9:A1:A16:A27:A10:A20:A33:A7:A29:A11:A4:A38:A6:A41:A22
C33:A28:A14:A18:A8:A16:A21:A35:A23:A30:A4:A19:A10:A39:A36:A26:A25:A32:A7:A24:A15:A41:A12:A3:A22:A17:A5:A34:A9:A42:A38:A37:A1:A33:A31:A11:A20:A40:A27:A6:A2:A13:A29
C34:A13:A20:A26:A10:A39:A38:A15:A24:A27:A3:A16:A8:A28:A19:A14:A18:A35:A1:A12:A21:A6:A25:A32:A33:A30:A41:A7:A17:A5:A9:A36:A42:A40:A11:A4:A37:A31:A2:A29:A34:A22:A23
C35:A31:A29:A19:A20:A14:A16:A33:A25:A5:A35:A24:A38:A10:A13:A4:A22:A8:A42:A7:A6:A17:A30:A36:A11:A18:A34:A39:A2:A1:A28:A3:A15:A37:A21:A12:A26:A27:A41:A23:A32:A40:A9
C36:A3:A28:A18:A11:A30:A1:A12:A29:A23:A31:A5:A38:A36:A24:A20:A9:A10:A25:A4:A22:A34:A6:A21:A41:A13:A35:A42:A15:A40:A17:A33:A27:A26:A14:A8:A16:A39:A7:A2:A19:A32:A37
C37:A28:A10:A31:A8:A15:A6:A13:A16:A37:A40:A24:A38:A29:A32:A4:A30:A3:A17:A9:A2:A34:A21:A5:A20:A26:A33:A35:A22:A42:A27:A11:A23:A36:A41:A14:A18:A1:A19:A25:A12:A39:A7
C38:A34:A4:A39:A25:A40:A28:A26:A15:A2:A36:A11:A17:A10:A8:A21:A41:A13:A9:A38:A33:A22:A23:A3:A18:A27:A35:A16:A42:A1:A24:A20:A14:A32:A6:A5:A37:A29:A12:A7:A31:A30:A19
C39:A37:A38:A4:A10:A40:A39:A27:A28:A36:A30:A22:A34:A19:A9:A35:A33:A24:A18:A42:A3:A17:A14:A8:A13:A6:A7:A26:A29:A20:A32:A16:A41:A11:A31:A15:A2:A23:A1:A25:A21:A5:A12
C40:A21:A38:A29:A42:A28:A25:A32:A41:A6:A16:A36:A11:A35:A5:A22:A3:A10:A17:A15:A39:A18:A30:A37:A7:A24:A13:A1:A31:A12:A20:A4:A33:A9:A19:A34:A8:A23:A26:A2:A40:A14:A27
C41:A23:A38:A36:A16:A24:A1:A33:A13:A35:A6:A26:A29:A14:A39:A20:A18:A11:A19:A21:A12:A32:A37:A3:A22:A7:A30:A15:A5:A31:A2:A9:A27:A40:A10:A4:A17:A8:A34:A28:A41:A42:A25
C42:A31:A18:A29:A1:A10:A21:A25:A33:A2:A27:A7:A34:A20:A5:A9:A22:A37:A3:A41:A24:A11:A32:A12:A42:A15:A14:A28:A19:A36:A4:A16:A23:A39:A26:A35:A13:A38:A8:A40:A6:A17:A30
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment