X-Git-Url: https://git.ucc.asn.au/?p=progcomp2012.git;a=blobdiff_plain;f=simulator%2Fsimulate.py;fp=simulator%2Fsimulate.py;h=60320d9d69af1ac955baa7b9625c1f7a8ca6cb4d;hp=5531143f8b5d33aa9766d0c3f16dea554c8ce504;hb=2120cc40abf9e3fd763c84a1e09b61064bb40be6;hpb=fe470c015d73d07c44f0e951a2bb205d95763f22 diff --git a/simulator/simulate.py b/simulator/simulate.py index 5531143..60320d9 100755 --- a/simulator/simulate.py +++ b/simulator/simulate.py @@ -26,9 +26,9 @@ nGames = 10 #Number of games played by each agent against each opponent. Half wi managerPath = baseDirectory+"manager/stratego" #Path to the manager program -scores = {"WIN":3, "DRAW":2, "LOSS":1, "NONE":0} #Score dictionary -#NONE occurs if both programs crash. If only one program crashes the result is reported as a win-loss +scores = {"VICTORY":(3,1), "DEFEAT":(1,3), "SURRENDER":(0,3), "DRAW":(2,2), "DRAW_DEFAULT":(1,1), "ILLEGAL":(-1,2), "DEFAULT":(2,-1), "BOTH_ILLEGAL":(-1,-1), "INTERNAL_ERROR":(0,0)} #Score dictionary +verbose = True #Make necessary directories @@ -55,15 +55,19 @@ agentNames = os.listdir(agentsDirectory) agents = [] for name in agentNames: #sys.stdout.write("\nLooking at Agent: \""+ str(name)+"\"... ") - sys.stdout.write("Scan \""+name+"\"... ") + if verbose: + sys.stdout.write("Scan \""+name+"\"... ") if os.path.isdir(agentsDirectory+name) == False: #Remove non-directories - sys.stdout.write(" Invalid! (Not a directory)\n") + if verbose: + sys.stdout.write(" Invalid! (Not a directory)\n") continue if os.path.exists(agentsDirectory+name+"/info") == False: #Try and find the special "info" file in each directory; ignore if it doesn't exist - sys.stdout.write(" Invalid! (No \"info\" file found)\n") + if verbose: + sys.stdout.write(" Invalid! (No \"info\" file found)\n") continue - sys.stdout.write(" Valid!") + if verbose: + sys.stdout.write(" Valid!") #sys.stdout.write("OK") #Convert the array of names to an array of triples #agents[0] - The name of the agent (its directory) @@ -71,19 +75,17 @@ for name in agentNames: #agents[2] - The score the agent achieved in _this_ round. Begins at zero agentExecutable = agentsDirectory+name+"/"+(open(agentsDirectory+name+"/info").readline().strip()) agents.append([name, agentExecutable, 0]) - sys.stdout.write(" (Run program \""+agentExecutable+"\")\n") + if verbose: + sys.stdout.write(" (Run program \""+agentExecutable+"\")\n") if len(agents) == 0: print "Couldn't find any agents! Check paths (Edit this script) or generate \"info\" files for agents." sys.exit(0) +if verbose: + print "Total: " + str(len(agents)) + " valid agents found (From "+str(len(agentNames))+" possibilities)" + print "" + print "Commencing ROUND " + str(roundNumber) + " combat! ("+str(nGames)+" games per pairing)" -print "Total: " + str(len(agents)) + " valid agents found (From "+str(len(agentNames))+" possibilities)" - -print "" - -print "Commencing ROUND " + str(roundNumber) + " combat! ("+str(nGames)+" games per pairing)" -print "Points values are: "+str(scores) -print "" normalGames = 0 draws = 0 @@ -96,45 +98,47 @@ for red in agents: #for each agent playing as red, continue #Exclude battles against self for i in range(1, nGames/2 + 1): #Play a game and read the result. Note the game is logged to a file based on the agent's names - sys.stdout.write("Agents: \""+red[0]+"\" and \""+blue[0]+"\" playing game " + str(i) + "/"+str(nGames/2) + "... ") + if verbose: + sys.stdout.write("Agents: \""+red[0]+"\" and \""+blue[0]+"\" playing game " + str(i) + "/"+str(nGames/2) + "... ") logFile = logDirectory + "round"+str(roundNumber) + "/"+red[0]+"_vs_"+blue[0]+"_"+str(i) outline = os.popen(managerPath + " -o " + logFile + " " + red[1] + " " + blue[1], "r").read() results = outline.split(' ') - #Look at who won, and adjust scores based on that - if results[0] == "NONE": - red[2] += scores["NONE"] - blue[2] += scores["NONE"] - sys.stdout.write(" No contest. (Check AI for errors).\n") - aiErrors += 1 - elif results[0] == "DRAW": - red[2] += scores["DRAW"] - blue[2] += scores["DRAW"] - sys.stdout.write(" Draw.\n") - draws += 1 - elif results[0] == red[1]: - red[2] += scores["WIN"] - blue[2] += scores["LOSS"] - sys.stdout.write(" \""+red[0]+"\"\n") - normalGames += 1 - elif results[0] == blue[1]: - red[2] += scores["LOSS"] - blue[2] += scores["WIN"] - sys.stdout.write(" \""+blue[0]+"\"\n") - normalGames += 1 + + if len(results) != 6: + if verbose: + sys.stdout.write("Garbage output! " + outline) else: - sys.stdout.write(" Garbage output! \""+outline+"\" (log file \""+logFile+"\")\n") - managerErrors += 1 - + if results[1] == "RED": + red[2] += scores[results[2]][0] + blue[2] += scores[results[2]][1] + elif results[1] == "BLUE": + red[2] += scores[results[2]][1] + blue[2] += scores[results[2]][0] + elif results[1] == "BOTH": + red[2] += scores[results[2]][0] + blue[2] += scores[results[2]][1] + red[2] += scores[results[2]][1] + blue[2] += scores[results[2]][0] + + if verbose: + sys.stdout.write(" " + outline) + + + + -print "Completed combat. Total of " + str(normalGames + draws + aiErrors + managerErrors) + " games played. " + +if verbose: + print "Completed combat. Total of " + str(normalGames + draws + aiErrors + managerErrors) + " games played. " if managerErrors != 0: - print " WARNING: Recieved "+str(managerErrors)+" garbage outputs. Check the manager program." + print "WARNING: Recieved "+str(managerErrors)+" garbage outputs. Check the manager program." -print "" +if verbose: + print "" #We should now have complete score values. - -sys.stdout.write("Creating results files for ROUND " + str(roundNumber) + "... ") +if verbose: + sys.stdout.write("Creating results files for ROUND " + str(roundNumber) + "... ") agents.sort(key = lambda e : e[2], reverse=True) #Sort the agents based on score @@ -142,13 +146,14 @@ resultsFile = open(resultsDirectory+"round"+str(roundNumber)+".results", "w") #C for agent in agents: resultsFile.write(agent[0] + " " + str(agent[2]) +"\n") #Write the agent names and scores into the file, in descending order -sys.stdout.write(" Complete!\n") - -sys.stdout.write("Updating total scores... "); +if verbose: + sys.stdout.write(" Complete!\n") + sys.stdout.write("Updating total scores... "); #Now update the total scores if os.path.exists(resultsDirectory+"total.scores"): - sys.stdout.write(" Reading from \""+resultsDirectory+"total.scores\" to update scores... ") + if verbose: + sys.stdout.write(" Reading from \""+resultsDirectory+"total.scores\" to update scores... ") totalFile = open(resultsDirectory+"total.scores", "r") #Try to open the total.scores file for line in totalFile: #For all entries, data = line.split(' ') @@ -163,11 +168,13 @@ if os.path.exists(resultsDirectory+"total.scores"): agents.sort(key = lambda e : e[2], reverse=True) else: - sys.stdout.write(" First round - creating \""+resultsDirectory+"total.scores\"... ") -sys.stdout.write(" Complete!\n") + if verbose: + sys.stdout.write(" First round - creating \""+resultsDirectory+"total.scores\"... ") +if verbose: + sys.stdout.write(" Complete!\n") + print "Finished writing results for ROUND " + str(roundNumber) + print "" -print "Finished writing results for ROUND " + str(roundNumber) -print "" print "RESULTS FOR ROUND " + str(roundNumber) print "Agent: [name, path, total_score, recent_score]"