from otree.api import * from array import * from csv import writer, reader list_data=[] class C(BaseConstants): NAME_IN_URL = 'travelling_salesman_problem_allrounds' PLAYERS_PER_GROUP = None NUM_ROUNDS = 5 class Subsession(BaseSubsession): pass class Group(BaseGroup): name = models.StringField(label='enter your name') noOfCities =models.StringField(label='') timeTaken =models.StringField(label='') score =models.StringField(label='') optimalScore =models.StringField(label='') path =models.StringField(label='') class Player(BasePlayer): pass # FUNCTIONS # PAGES class play(Page): form_model = 'group' form_fields = ['noOfCities','timeTaken','score','optimalScore','path'] @staticmethod def vars_for_template(player): group = player.group boardNumber = player.round_number if(not list_data or list_data == []): if( player.participant.vars and player.participant.vars['name']): list_data.append(player.participant.vars["name"]) else: opened_file = open('TravellingSalesmanProblem.csv') read_file = reader(opened_file) apps_data = list(read_file) rowcount = len(apps_data) list_data.append(str(rowcount)) round_message = '' if boardNumber == 1: round_message = 'This is a practice round.' else: round_message = f'This is round {boardNumber - 1} out of {C.NUM_ROUNDS - 1}' return dict( board= setBoard(boardNumber), maxScore = getOptimalScore(boardNumber), roundMessage = round_message ) class endPage(Page): form_model = 'group' @staticmethod def vars_for_template(player): group = player.group boardNumber = player.round_number if(group.field_maybe_none('noOfCities') and group.field_maybe_none('noOfCities') != ''): list_data.append(group.noOfCities) if(group.field_maybe_none('timeTaken') and group.field_maybe_none('timeTaken') != ''): list_data.append(group.timeTaken) if(group.field_maybe_none('score') and group.field_maybe_none('score') != ''): list_data.append(group.score) if(group.field_maybe_none('optimalScore') and group.field_maybe_none('optimalScore') != ''): list_data.append(group.optimalScore) if(group.field_maybe_none('path') and group.field_maybe_none('path') != ''): list_data.append(group.path) if(boardNumber ==2): with open('TravellingSalesmanProblem.csv', 'a', newline='') as f_object: writer_object = writer(f_object) writer_object.writerow(list_data) f_object.close() return dict( boardNumber= boardNumber, numRounds = C.NUM_ROUNDS, list = list_data ) class welcome(Page): form_model = 'group' @staticmethod def vars_for_template(player): boardNumber = player.round_number return dict( boardNumber= boardNumber, ) class board1(Page): form_model = 'group' @staticmethod def vars_for_template(player): boardNumber = player.round_number return dict( boardNumber = boardNumber, ) page_sequence = [welcome, board1, play, endPage] def setBoard(boardNumber): boards = [ [ [[398.8922], [99.17237]], [[376.7825], [267.42898]], [[195.6278], [48.26312]], [[170.7783], [493.92347]], [[180.6471], [83.78474]], ], [ [[398.8921604], [398.9945649]], [[376.7825474], [296.8970115]], [[195.6278421], [452.6550048]], [[170.7783492], [440.4243241]], [[180.6470563], [496.9182756]], [[99.17236725], [447.9781676]], [[267.4289811], [439.3216757]], [[48.2631207], [98.80287468]], [[493.9234715], [167.4968001]], [[83.78473797], [388.6031585]], ], [ [[398.8921604], [79.7967775724828]], [[376.7825474], [40.32262531]], [[195.6278421], [66.32516917]], [[170.7783492], [85.95269907]], [[180.6470563], [238.8889181]], [[99.17236725], [350.2523864]], [[267.4289811], [439.9445312]], [[48.2631207], [438.8968407]], [[493.9234715], [426.9397972]], [[83.78473797], [82.99375791]], [[398.9945649], [261.4843767]], [[296.8970115], [434.5641005]], [[452.6550048], [115.5783441]], [[440.4243241], [59.54045337]], [[496.9182756], [411.9756132]], [[447.9781676], [40.1384898]], [[439.3216757], [476.181534]], [[98.80287468], [435.8086806]], [[167.4968001], [356.0769116]], [[388.6031585], [302.7022557]], ], [ [398.8921604, 261.4843767], [376.7825474, 434.5641005], [195.6278421, 115.5783441], [170.7783492, 59.54045337], [180.6470563, 411.9756132], [99.17236725, 40.1384898], [267.4289811, 476.181534], [48.2631207, 435.8086806], [493.9234715, 356.0769116], [83.78473797, 302.7022557], [398.9945649, 112.7160921], [296.8970115, 369.797568], [452.6550048, 447.7712236], [440.4243241, 147.2316203], [496.9182756, 257.6762586], [447.9781676, 217.3247751], [439.3216757, 287.5825621], [98.80287468, 370.4780097], [167.4968001, 339.0863172], [388.6031585, 181.0080932], [79.79677757, 167.2787287], [40.32262531, 374.4279996], [66.32516917, 253.3082761], [85.95269907, 431.1295759], [238.8889181, 379.7786282], [350.2523864, 482.1916273], [439.9445312, 417.2186187], [438.8968407, 418.5184659], [426.9397972, 133.7335451], [82.99375791, 87.966247], ], [ [398.8921604, 115.5783441], [376.7825474, 59.54045337], [195.6278421, 411.9756132], [170.7783492, 40.1384898], [180.6470563, 476.181534], [99.17236725, 435.8086806], [267.4289811, 356.0769116], [48.2631207, 302.7022557], [493.9234715, 112.7160921], [83.78473797, 369.797568], [398.9945649, 447.7712236], [296.8970115, 147.2316203], [452.6550048, 257.6762586], [440.4243241, 217.3247751], [496.9182756, 287.5825621], [447.9781676, 370.4780097], [439.3216757, 339.0863172], [98.80287468, 181.0080932], [167.4968001, 167.2787287], [388.6031585, 374.4279996], [79.79677757, 253.3082761], [40.32262531, 431.1295759], [66.32516917, 379.7786282], [85.95269907, 482.1916273], [238.8889181, 417.2186187], [350.2523864, 418.5184659], [439.9445312, 133.7335451], [438.8968407, 87.966247], [426.9397972, 98.01783809], [82.99375791, 9.790094453], [261.4843767, 263.8636989], [434.5641005, 90.81478545], ], ] if(boardNumber<=C.NUM_ROUNDS): return boards[boardNumber-1] return boards[boardNumber-1] def getOptimalScore(boardNumber): scores = [ 1134.22, 1469.86, 1798.77, 2032.46, 2243.8 ] return scores[boardNumber-1]