next up previous
Next: Genetic Algorithm Code Up: PROGRAM CODE Previous: PROGRAM CODE

Cellular Automata Code

import java.util.Random;

/**
* @author Austin Rachlin
* Summer 2002
* Majority Classification Problem
*/

//Uses 7 neighbors


class test
{
   int[] array = new int[149];
}

class rule
{
   int[] array = new int[128];
   int val;
}
   
public class MCP
{
   public static Random rand;
   static { rand = new java.util.Random();}
   
   public static void main(String[] args)
   {
       //Calls CreateArrays
       //Calls CreateRules
       //Calls RunAllRules
       ////GA
       //Returns some value
       
       System.out.println("Hajimemashoo");
       
       //Modifiable variables
       //
       int NumberOfTests=100;
       int NumberOfRules=100;
       int NumberOfFinalTests=1000;
       //
       
       test[] TestList = new test[NumberOfTests];
       CreateArrays(TestList);
       
       rule[] RuleList = new rule[NumberOfRules];
       CreateArrays(RuleList);
       
//      int nbrs = 3;
       
       RunAllRules(RuleList, TestList);

       rule Best = SelectBest(RuleList);
       System.out.println("");
       System.out.println("BEST");
       DisplayArrays(Best);
       test[] FinalTestList = new test[NumberOfFinalTests];
       CreateArrays(FinalTestList);
       
       float result = FinalExam(Best, FinalTestList);
       //Calls SelectBest
       //Calls FinalExam
       
       System.out.println("Result: " + result + "%");


       System.out.println("");
       System.out.println("owatta!");
   }
   
   public static void DisplayArrays(test List)
   {
       String str = "";
       for (int i = 0; i < List.array.length; i++)
       {      
           str += List.array[i];
       }
       System.out.println(str);
   }
   
   public static void DisplayArrays(rule List)
   {
       String str = "";
       for (int i = 0; i < List.array.length; i++)
       {
           str += List.array[i];
       }
       System.out.println("Rule: " + str + "   val: " + List.val);
   }
   
   public static void PrintArray(test List)
   {
       String str = "";
       for (int i = 0; i < List.array.length; i++)
       {
           if (List.array[i] == 1)
           {
               str += "|";
           }
           else
           {
               str += " ";
           }
       }
       System.out.println(str);
   }

   
   public static void CreateArrays(test[] List) //Takes 2D array of arrays (empty) and # of desired arrays
   {
       //Creates all of the arrays
       //2D array of all the individual arrays
       
       for (int i = 0; i < List.length; i++)
       {
           List[i] = new test();
           for (int j = 0; j < List[i].array.length; j++)
           {
               if (rand.nextBoolean() == true)
               {
                   List[i].array[j] = 0;
               }
               else
               {
                   List[i].array[j] = 1;
               }
           }
       }
   }
   
   public static void CreateArrays(rule[] List) //Takes 2D array of arrays (empty) and # of desired arrays
   {
       //Creates all of the arrays
       //2D array of all the individual arrays
       
       for (int i = 0; i < List.length; i++)
       {
           List[i] = new rule();
           for (int j = 0; j < List[i].array.length; j++)
           {
               List[i].val = 0;
               if (rand.nextBoolean() == true)
               {
                   List[i].array[j] = 0;
               }
               else
               {
                   List[i].array[j] = 1;
               }
           }
       }
   }
   
   public static void RunAllRules(rule[] RuleList, test[] TestList) //Takes all rules and tests
   {
       //Runs a loop to call ApplyRuleToAllTests for every rule
       boolean prnt = false;
       for (int i=0; i < RuleList.length; i++)
       {
               ApplyRuleToAllTests(RuleList[i], TestList, prnt);
       }
   }
   
   public static void ApplyRuleToAllTests(rule Rule, test[] TestList, boolean prnt) //Takes a rule and all tests
   {
       //Runs a loop to call ApplyRuleToSingleTest for all tests
       for (int i =0; i < TestList.length; i++)
       {
           ApplyRuleToSingleTest(Rule, TestList[i], prnt);
       }
   }
   
   public static void ApplyRuleToSingleTest(rule Rule, test Test, boolean prnt) //Takes a rule and a test
   {
       //Applies the individual rule to an individual test
       //Calls EvalArray
       //Calls StoreArray
       //Calls RecordSuccess
       int runTime = 100;
       
       test T1 = Test;
       
       int maj = FindMajority(Test, prnt);
       
       int runs = 0;
       do
       {
           for (int i=0; i < Test.array.length; i++)
           {
               T1.array[i] = EvalArray(i, Rule, Test);
           }
           if (prnt == true)
           {
               PrintArray(Test);
           }
           runs ++;
       }while ((AllSame(Test) == false) & (runs < runTime));
       
       if (prnt == true)
       {
           for (int i=0; i < 5; i++)
           {
               System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
           }
           System.out.println("");
       }
       Rule.val += RecordSuccess(maj, T1);
   }
   

   public static int FindMajority(test Test, boolean prnt)
   {
       int on = 0;
       int off = 0;
       for (int i=0; i < Test.array.length; i++)
       {
           if (Test.array[i] == 0)
           {
               off++;
           }
           if (Test.array[i] == 1)
           {
               on++;
           }
       }
       if (prnt == true)
       {
           System.out.println("BLACK: " + on);
           System.out.println("WHITE: " + off);
       }
       
       if (on > off)
       {
           if (prnt == true)
           {
               System.out.println("majority: ON");
           }
           return 1;
       }
       
       else
       {
           if (prnt == true)
           {
               System.out.println("majority: OFF");
           }
           return 0;
       }
   }
   
   
/*  public static int EvalArray(int pos, rule Rule, test Test) //Takes a single position and a rule
   {
       //Evaluates the array at a single position according to the rule
       
       int x;
       int y;
       int z;
       
       if (pos == 0)
       {
           x = Test.array[Test.array.length-1];
       }
       else
       {
           x = Test.array[pos-1];
       }
       
       y = Test.array[pos];
       
       if (pos == Test.array.length - 1)
       {
           z = Test.array[0];
       }
       else
       {
           z = Test.array[pos + 1];
       }
       
       int val = (((x << 1) | y) << 1) | z;
       return Rule.array[val];
   }
*/

   public static int EvalArray(int pos, rule Rule, test Test) //Takes a single position and a rule
   {
       //Evaluates the array at a single position according to the rule
       
       int min3;
       int min2;
       int min1;
       int cntr;
       int max1;
       int max2;
       int max3;
       
       if (pos == 0)
       {
           min3 = Test.array[Test.array.length-3];
           min2 = Test.array[Test.array.length-2];
           min1 = Test.array[Test.array.length-1];
       }
       else if (pos == 1)
       {
           min3 = Test.array[Test.array.length-2];
           min2 = Test.array[Test.array.length-1];
           min1 = Test.array[pos-1];
       }
       else if (pos == 2)
       {
           min3 = Test.array[Test.array.length-1];
           min2 = Test.array[pos-2];
           min1 = Test.array[pos-1];
       }
       else
       {
           min3 = Test.array[pos-3];
           min2 = Test.array[pos-2];
           min1 = Test.array[pos-1];
       }
       
       cntr = Test.array[pos];
       
       if (pos == Test.array.length - 1)
       {
           max1 = Test.array[0];
           max2 = Test.array[1];
           max3 = Test.array[2];
       }
       else if (pos == Test.array.length - 2)
       {
           max1 = Test.array[pos + 1];
           max2 = Test.array[0];
           max3 = Test.array[1];
       }
       else if (pos == Test.array.length - 3)
       {
           max1 = Test.array[pos + 1];
           max2 = Test.array[pos + 2];
           max3 = Test.array[0];
       }
       else
       {
           max1 = Test.array[pos + 1];
           max2 = Test.array[pos + 2];
           max3 = Test.array[pos + 3];
       }
       
       int val = (((((((((((min3 << 1) | min2) << 1) | min1) << 1) | cntr) << 1) | max1) << 1) | max2) << 1) | max3;
           
   //  int val = (((x << 1) | y) << 1) | z;
       return Rule.array[val];
   }
   
/*  public static void StoreArray() //Takes a single position value and location (x and y)
   {
       //Stores the resultant position of the array in the 2D array
   }
*/
   
   public static int RecordSuccess(int maj, test T1) //Takes a rule and modified array
   {
       //Modifies the value of the rule depending upon the outcome
       if (AllSame(T1) == true)
       {
           if (maj == T1.array[0])
           {
               return 1;
           }
       }

       return 0;
   }
   
   public static boolean AllSame(test T1)
   {
       int check = T1.array[0];
       boolean result = true;
       for (int i = 0; i < T1.array.length; i++)
       {
           if (check != T1.array[i])
           {
               result = false;
           }
       }
       return result;
   }
   
   public static int ReturnSuccess(rule Rule) //Takes a rule
   {
       //Returns the success of a single rule
       return Rule.val;
   }
   
   public static rule SelectBest(rule[] RuleList)
   {
       //Chooses the best rule
       rule Best = new rule();
       Best.val = -1;
       for (int i = 0; i < RuleList.length; i++)
       {
           if (RuleList[i].val > Best.val)
           {
               Best.array = RuleList[i].array;
               Best.val = RuleList[i].val;
           }
       }
       return Best;
   }
   
   public static float FinalExam(rule Best, test[] FinalTestList)
   {
       System.out.println("_________________________");
       //Calls CreatArrays with enormous number

       //Applies best rule to giant 2D array of landscapes
       //Returns success rate

       System.out.println("FINAL TEST");
//      DisplayArrays(Best);
       Best.val = 0;
       boolean prnt = false;
       
       
       ApplyRuleToAllTests(Best, FinalTestList, prnt);
       System.out.println(Best.val + " / " + FinalTestList.length);
       float val = Best.val;
       float success = (100 * val / FinalTestList.length);
       return success;
   }
}



Austin L. Rachlin 2003-06-12