Courses/CS 461/Winter 2006/Darren Iwaki/week 5
From CSWiki
I implemented the first part of the Iterated Prisoners Model from http://www.cs.nyu.edu/courses/fall01/G22.3033-002/http/hw1.html from scratch with java. It's not too impressive at this point because it just prints out a chart. I was going to implement the gui, but hw#3 with the Jswing seemed just a bit too long to figure out. Hopefully, by next week I can modify my classes to work with Mason.
Main.java /*
* Main.java * * Created on February 10, 2006, 1:42 AM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */
package src.myapp; import java.io.*; import java.util.*; import java.lang.*; import java.text.DecimalFormat; /**
* * @author Owner */
public class Main {
static int rounds = 10; // number of rounds simulation should last
static int noise = 0; // a decimal value. 0 - 1. 0 by default
static Agent [] strategiesSelected = new Agent [16]; // Agent array, One Agent for every strategy
static boolean subsets = false;
static PayOff payOffData = new PayOff(3,0,5,1); // stores the payoff for the simulation
static int numOfStrategiesActive = 0;
/** Creates a new instance of Main */
public Main() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
for ( int i = 0; i < strategiesSelected.length; i++)
{
strategiesSelected[i] = new Agent (i, noise);
}
if (args == null)
{
System.out.println("-payoff {cc}/{cd}/{dc}/{dd}");
System.out.println("-rounds {value}");
System.out.println("-noise");
System.out.println("-strategies");
System.out.println("-subsets");
}
else if (args[0].equals("-help" ))
{
System.out.println("-payoff {cc}/{cd}/{dc}/{dd}");
System.out.println("-rounds {value}");
System.out.println("-noise");
System.out.println("-strategies");
System.out.println("-subsets");
}
else
{
for (int i = 0; i < args.length; i++)
{
if ( ( args[i] ).equals( "-payoff") )
{
String temp = args[ i+1 ];
StringTokenizer st = new StringTokenizer( temp, "/");
int temp1 = Integer.parseInt(st.nextToken());
int temp2 = Integer.parseInt(st.nextToken());
int temp3 = Integer.parseInt(st.nextToken());
int temp4 = Integer.parseInt(st.nextToken());
payOffData.setValues( temp1, temp2, temp3, temp4 );
System.out.println("payoff modified "+temp1+"/"+temp2+"/"+temp3+"/"+temp4);
}
else if ( ( args[i] ).equals( "-rounds") )
{
rounds = Integer.parseInt( args[i+1] );
i ++;
System.out.println("rounds changed to "+rounds);
}
else if ( ( args[i] ).equals( "-noise") )
{
noise = Integer.parseInt( args[ i + 1] );
i++;
System.out.println("noise set to "+noise);
for ( int o = 0; o < strategiesSelected.length; o++)
{
strategiesSelected[i].setNoise (noise);
}
}
else if ( ( args[i] ).equals( "-strategies") )
{
String temp = args[ i + 1];
StringTokenizer st = new StringTokenizer( temp,"," );
int j = 0;
while (st.hasMoreTokens())
{
int temps = Integer.parseInt(st.nextToken());
(strategiesSelected [ temps ]).setActiveTrue();
j++;
}
numOfStrategiesActive = j;
i++;
for ( int z = 0; z < strategiesSelected.length; z++)
{
if (strategiesSelected[z].isActive()) {System.out.println(strategiesSelected[z].getStratNum());}
}
}
else if ( ( args[i] ).equals( "-subsets") )
{
if ((args[i]).equals("true"))
subsets = true;
else
subsets = false;
}
}
}
// begin simulation
Agent player1, player2;
for ( int i = 0; i < strategiesSelected.length; i++)
{
if (strategiesSelected[i].isActive())
{
player1 = strategiesSelected[ i ];
for ( int j = i; j < strategiesSelected.length; j++)
{
if (strategiesSelected[j].isActive())
{
player2 = strategiesSelected[ j ];
for ( int k = 0; k < rounds; k++)
{
payOffData.playGame( player1, player2);
}
}
}
}
}
System.out.println("Strat Points Percentage");
DecimalFormat df = new DecimalFormat("000.0");
int highScore = 0;
for ( int i = 0; i < strategiesSelected.length; i++)
{
if (strategiesSelected[i].isActive())
{
if (strategiesSelected[i].getScore() > highScore)
{
highScore = strategiesSelected[i].getScore();
}
}
}
for ( int i = 0; i < strategiesSelected.length; i++)
{
if (strategiesSelected[i].isActive())
{
strategiesSelected[i].setHighScore( highScore );
}
}
for ( int i = 0; i < strategiesSelected.length; i++)
{
if (strategiesSelected[i].isActive())
{
System.out.println(i+"\t"+strategiesSelected[i].getScore()+"\t"+df.format(strategiesSelected[i].getPercentage()));
}
}
}
}
agent.java /*
* Agent.java * * Created on February 10, 2006, 1:40 PM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */
package src.myapp;
/**
* * @author Owner */
public class Agent {
private int stratNum = -1;
private int score = 0;
private int[][] history = new int [16][2]; //index = strategy:
//[0] = selfs last move
//[1] = opponents last move
private boolean active = false;
private int noise = 0;
ResponseTable response;
private int numberOfGames = 0;
private double percentage = 0;
private int numberOfWins = 0;
private int maxNumOfPoints = 0;
int highScore;
//constructor
public Agent(int stratNum, int noise)
{
this.stratNum = stratNum;
this.noise = noise;
response = new ResponseTable( stratNum, noise );
}
public void setNoise( int value )
{
noise = value;
}
public void addToMaxNumOfPoints( int value )
{
maxNumOfPoints += value;
}
public void setHighScore( int value )
{
highScore = value;
}
public void setActiveTrue()
{
active = true;
}
public int getNumberOfWins() { return numberOfWins;}
public void addWin() { numberOfWins ++;}
public boolean isActive() { return active; }
public int getStratNum() { return stratNum; }
public int getScore() { return score; }
public ResponseTable getResponseTable() { return response; }
public int getOpponentsLastMove( Agent opponent)
{
return history [ opponent.getStratNum() ][1];
}
public void addToScore(int x)
{
score += x;
}
public void addGamesPlayed()
{
numberOfGames++;
}
public double getPercentage()
{
percentage =((double)(score/(double)highScore))*100;
return percentage;
}
public int getNumOfGames() { return numberOfGames;}
public int getCurrentMove (Agent opponent)
{
int myLastMove = history [ opponent.getStratNum()][0];
int oppLastMove = history [ opponent.getStratNum()][1];
int myMove = response.getMove( myLastMove, oppLastMove);
storeMyMove ( myMove, opponent.getStratNum() );
return myMove;
}
public void storeMyMove( int theMove, int index )
{
history [ index ][0] = theMove;
}
public void storeOppMove( int theMove, int index )
{
history [ index ][1] = theMove;
}
}
Payoff.java /*
* PayOff.java * * Created on February 10, 2006, 2:37 AM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */
package src.myapp;
public class PayOff
{
private int cc = 3;
private int cd = 0;
private int dc = 5;
private int dd = 1;
public PayOff( int cc, int cd, int dc, int dd)
{
this.cc = cc;
this.cd = cd;
this.dc = dc;
this.dd = dd;
}
public void setValues ( int cc, int cd, int dc, int dd)
{
this.cc = cc;
this.cd = cd;
this.dc = dc;
this.dd = dd;
}
public int getCC() { return cc; }
public int getCD() { return cd; }
public int getDC() { return dc; }
public int getDD() { return dd; }
public int getMax( int myMove)
{
if (myMove == 1)
{
if ( cd > dd)
return cd;
else
return dd;
}
else
{
if (dc > cc)
return dc;
else
return cc;
}
}
public void playGame( Agent player1, Agent player2)
{
player1.addGamesPlayed();
player2.addGamesPlayed();
int player1CurrMove = player1.getCurrentMove(player2);
int player2CurrMove = player2.getCurrentMove(player1);
player1.addToMaxNumOfPoints(getMax(player2CurrMove));
player2.addToMaxNumOfPoints(getMax(player1CurrMove));
//stores the opponents move
player1.storeOppMove( player2CurrMove, player2.getStratNum());
player2.storeOppMove( player1CurrMove, player1.getStratNum());
//both players cooperate
if ( (player1CurrMove == 0) && (player2CurrMove == 0) )
{
player1.addToScore(cc);
player2.addToScore(cc);
player1.addWin();
player2.addWin();
} //player1 cooperate, player2 deflects
else if ( (player1CurrMove == 0) && (player2CurrMove == 1) )
{
player1.addToScore(cd);
player2.addToScore(dc);
player2.addWin();
} //player1 deflects, player 2 cooperates
else if ( (player1CurrMove == 1) && (player2CurrMove == 0))
{
player1.addToScore(dc);
player2.addToScore(cd);
player1.addWin();
} // both players deflect
else if ( (player1CurrMove == 1) && (player2CurrMove == 1))
{
player1.addToScore(dd);
player2.addToScore(dd);
player1.addWin();
player2.addWin();
}
}
}
ResponseTable.java
/*
* ResponseTable.java * * Created on February 10, 2006, 2:15 PM * 1 : Cooperate * 2 : Deflect */
package src.myapp;
/**
* * @author Owner */
public class ResponseTable {
int [][] data = new int[2][2]; //stores the choice chart
int noise = 0;
/** Creates a new instance of ResponseTable */
public ResponseTable(int strategyNumber, int noise)
{
this.noise = noise;
data[0][0] = strategyNumber >> 3;
data[0][1] = (strategyNumber >> 2)%2;
data[1][0] = (strategyNumber >> 1)%2;
data[1][1] = strategyNumber%2;
}
public int getMove( int player1LastMove, int player2LastMove)
{
if (Math.random() < (noise))
{
if ((data[ player1LastMove ][ player2LastMove ]) == 1) return 0;
if ((data[ player1LastMove ][ player2LastMove ]) == 0) return 1;
}
return data[ player1LastMove ][ player2LastMove ];
}
}

