Courses/CS 461/Winter 2006/Darren Iwaki/week 5

From CSWiki

Jump to: navigation, search

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.

Image:DarrenIPD.jpg

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 ];
   }

}

Personal tools