#! /pkg/gnu/bin/gawk -f BEGIN { srand() if (!MINUTES) MINUTES = 3 suffix = rand() # system("cp -f offers old.offers."suffix) # system("cp -f payoffs old.payoffs."suffix) # system("cp -f players old.players."suffix) system("rm -r player1.peek player2.peek") com = "ls -1 */neg" while (com | getline) { newname = $1 dir = substr($1,1,index($1,"/")-1) dirs[++ndirs] = dir numdir[$1] = ndirs numdir[dir] = ndirs print "agent available " ndirs": "dir } close(com) if (ndirs < 2) { print "i need at least two players"; exit } if (numdir[player1]) player1 = numdir[player1] if (numdir[player2]) player2 = numdir[player2] com = "ps -u `whoami`" while (com | getline) pids[++npids] = $1 close(com) # generate new payoffs system("gawk -f makepayoffs.awk > payoffs") # get payoffs while (getline < "payoffs") { # burn the lines until "player 1's payoffs" if ($0 ~ /payoffs/) break } while (getline < "payoffs") { # burn the lines until "player 2's payoffs" if ($0 ~ /payoffs/) break if ($1 == "(1)") { row++ for (i=3; i<=NF; i++) utils1[row,i-2] = $i } } row = 0 while (getline < "payoffs") { # exhaust the file here if ($1 == "(1)") { row++ for (i=3; i<=NF; i++) utils2[row,i-2] = $i maxcols = i-2 } } maxrows = row close("payoffs") system("cat payoffs") system("echo > offers") # let the internet play too system("chmod a+rw offers") if (!player1) player1 = int(1+rand()*ndirs) used[player1] = 1 if (!player2) do { player2 = int(1+rand()*ndirs) } while (used[player2]) print "player1 = "dirs[player1] print "player2 = "dirs[player2] print "player1 = "dirs[player1] > "players" print "player2 = "dirs[player2] > "players" print systime() > "players" close("players") starttime = systime() targettime = starttime + MINUTES*60 system("echo 1 | " dirs[player1] "/neg & ") system("sleep 2") system("echo 2 | " dirs[player2] "/neg & ") com = "ps -u `whoami` | grep neg" while (com | getline) { print $0; if (!pids[$1]) mychild[++nmychild] = $1 } close(com) for (i in mychild) print "process "mychild[i]" is mine." while (1) { system("sleep 10") print "\n CHECKING\t" targettime - systime() " secs remain" if (targettime - systime() < 60) { if (rand() > (targettime - systime())/30) break } if (targettime - systime() < -30) break # check offers while (getline < "offers") { if ($2 == "prop" && okrow($3) && okcol($4) && !forcemade) { if ($1 == "player1") props1[$3,$4] = 1 if ($1 == "player2") props2[$3,$4] = 1 # go ahead and take first joint proposal if (props1[$3,$4] && props2[$3,$4]) { finalr = $3; finalc = $4; break } } if ($2 == "accept" && !forcemade) { if ($1 == "player1" && props2[$3,$4] = 1 && okrow($3) && okcol($4)) { finalr = $3; finalc = $4; break } if ($1 == "player2" && props1[$3,$4] = 1 && okrow($3) && okcol($4)) { finalr = $3; finalc = $4; break } } if ($2 == "force") { if ($1 == "player1" && okrow($3)) { finalr = $3; forcemade = 1 } if ($1 == "player2" && okcol($4)) { finalc = $4; forcemade = 1 } if (finalr && finalc) break } } close("offers") if (finalr && finalc) break } print "terminating processes..." print "----before kill----" system("ps -u `whoami` | grep neg") for (i in mychild) system("kill -9 "mychild[i]) print "----after kill----" system("ps -u `whoami` | grep neg") print "------------------" # check offers forcemade = 0 while (getline < "offers") { if ($2 == "prop" && okrow($3) && okcol($4) && !forcemade) { if ($1 == "player1") props1[$3,$4] = 1 if ($1 == "player2") props2[$3,$4] = 1 # go ahead and take first joint proposal if (props1[$3,$4] && props2[$3,$4]) { finalr = $3; finalc = $4; break } } if ($2 == "accept" && !forcemade) { if ($1 == "player1" && props2[$3,$4] = 1 && okrow($3) && okcol($4)) { finalr = $3; finalc = $4; break } if ($1 == "player2" && props1[$3,$4] = 1 && okrow($3) && okcol($4)) { finalr = $3; finalc = $4; break } } if ($2 == "force") { if ($1 == "player1" && okrow($3)) { finalr = $3; forcemade = 1 } if ($1 == "player2" && okcol($4)) { finalc = $4; forcemade = 1 } if (finalr && finalc) break } } close("offers") if (!finalr || !finalc) { finalr = maxrows finalc = 1 discount = rand()*.15-.05 print "nonstandard termination, discount = "discount } uf1 = utils1[finalr,finalc]*(1-discount) uf2 = utils2[finalr,finalc]*(1-discount) print "final row, final col = "finalr,finalc print "payoff to 1 is "uf1 print "payoff to 2 is "uf2 print "\n\nfinal row, final col = "finalr,finalc >> "offers" print "payoff to 1 is "uf1 >> "offers" print "payoff to 2 is "uf2 >> "offers" print dirs[player1],dirs[player2],uf1,uf2 >> "sim.log" # so we can see final state in shell-repeated calls system("sleep 10") } func okrow(x) { if (x==int(x) && x+0==x && x>=1 && x<=maxrows) return 1; return 0 } func okcol(x) { if (x==int(x) && x+0==x && x>=1 && x<=maxcols) return 1; return 0 }