previousScoreImprovement = arrangement.makeBestSwapFromUnhappiestGroup()
    print arrangement
    print previousScoreImprovement
    arrangement.score = arrangement.calculateScore()
  return arrangement

#--------------- Run ----------------------------------#

# Convert CSV
jsonArrangement = csv2json(INPUT_CSV_FILENAME)
# uncomment the following two line to run with sample data and comment the line above
# with open('grouper/sample_data/class40participants.json') as csvFile:
# jsonArrangement = json.dumps(json.load(csvFile))

print jsonArrangement;

arrangements = [Arrangement(jsonString = jsonArrangement) for x in range(NUM_ITERATIONS)]
for arrangement in arrangements:
  arrangement.randomizeGroups()

results = []

for arrangement in arrangements:
  results.append(swapUnhappiest(arrangement))
  results = sorted(results, key = lambda x: x.score)
  print results[-3:]

# # Save to file
for i in range(1, 5):
  arrangement2csv(results[-i], OUTPUT_FOLDER + OUTPUT_FILENAME + '_' + str(i) + '.csv')

# ------------- Genetic Algorithm. Random Swaps -------------#
# for x in range(0, 10):
#   for arrangement in arrangements:
#     arrangement.randomizeGroups()
#   for i in range(0, 40):
#     tempArrangements = []
#     for arrangement in arrangements:
#       for i in range(5):
#         arrangement.swapRandomIndividuals()
#       arrangement.score = arrangement.calculateScore()
#       tempArrangements.append(copy.deepcopy(arrangement))
#     result = sorted(tempArrangements, key=lambda x: x.score)
#     arrangements = result[-10:]
# print arrangements


#-------------- Make best swap from unhappiest group -----------#
for arrangement in arrangements:
  arrangement.randomizeGroups()
  for i in range(0, 10):
    arrangement.makeBestSwapFromUnhappiestGroup()
    print arrangement
  arrangement.score = arrangement.calculateScore()
result = sorted(arrangements, key=lambda x: x.score)
print result

for i in range(1, 4):
  arrangement2csv(result[-i], 'arrangement_' + str(i) + '.csv')