import java.util.*; import java.lang.Math; public class PlayerGeneticLearningMemory extends Player { public int[][] TempMatrix; public int[][] HistoryMatrix; public int[][] SuccessMatrix; public PlayerGeneticLearningMemory() { sName = "Genetic Learning with Memory"; sShortType = "GLM"; TempMatrix = newMatrix(); HistoryMatrix = newMatrix(); SuccessMatrix = newMatrix(); iDecisionMatrix = GenerateDecisionMatrix("Random"); } public PlayerGeneticLearningMemory(int iGen) { sName = "Genetic Learning with Memory, Generation "+iGen+" (Mutation)"; sShortType = "GLM"; TempMatrix = newMatrix(); HistoryMatrix = newMatrix(); SuccessMatrix = newMatrix(); iDecisionMatrix = GenerateDecisionMatrix("Random"); } public PlayerGeneticLearningMemory(String sInitType) { sName = "Genetic Learning with Memory"; sShortType = "GLM"; TempMatrix = newMatrix(); HistoryMatrix = newMatrix(); SuccessMatrix = newMatrix(); iDecisionMatrix = GenerateDecisionMatrix(sInitType); } public PlayerGeneticLearningMemory(int iGen, PlayerGeneticLearningMemory Parent1, PlayerGeneticLearningMemory Parent2) { sName = "Genetic Learning with Memory, Generation "+iGen+" (Bred)"; sShortType = "GLM"; TempMatrix = newMatrix(); HistoryMatrix = newMatrix(); SuccessMatrix = newMatrix(); iDecisionMatrix = Breed(Parent1, Parent2); } public int[][] Breed(PlayerGeneticLearningMemory Parent1, PlayerGeneticLearningMemory Parent2) { int[][] ReturnedMatrix = new int[17][10]; Random generator = new Random(); int iDonor; for (int i = 0; i < 17; i++) { for (int j = 0; j < 10; j++) { iDonor = generator.nextInt(2); if (Parent1.SuccessMatrix[i][j]/(1+Math.sqrt(Parent1.HistoryMatrix[i][j])) > Parent2.SuccessMatrix[i][j]/(1+Math.sqrt(Parent2.HistoryMatrix[i][j]))) { ReturnedMatrix[i][j] = Parent1.iDecisionMatrix[i][j]; HistoryMatrix[i][j] = Parent1.HistoryMatrix[i][j]; SuccessMatrix[i][j] = Parent1.SuccessMatrix[i][j]; } else if (Parent1.SuccessMatrix[i][j]/(1+Math.sqrt(Parent1.HistoryMatrix[i][j])) < Parent2.SuccessMatrix[i][j]/(1+Math.sqrt(Parent2.HistoryMatrix[i][j]))) { ReturnedMatrix[i][j] = Parent2.iDecisionMatrix[i][j]; HistoryMatrix[i][j] = Parent1.HistoryMatrix[i][j]; SuccessMatrix[i][j] = Parent1.SuccessMatrix[i][j]; } else if (Parent1.SuccessMatrix[i][j] == Parent2.SuccessMatrix[i][j] && Parent1.HistoryMatrix[i][j] < Parent2.HistoryMatrix[i][j]) { ReturnedMatrix[i][j] = Parent1.iDecisionMatrix[i][j]; HistoryMatrix[i][j] = Parent1.HistoryMatrix[i][j]; SuccessMatrix[i][j] = Parent1.SuccessMatrix[i][j]; } else if (Parent1.SuccessMatrix[i][j] == Parent2.SuccessMatrix[i][j] && Parent1.HistoryMatrix[i][j] > Parent2.HistoryMatrix[i][j]) { ReturnedMatrix[i][j] = Parent2.iDecisionMatrix[i][j]; HistoryMatrix[i][j] = Parent1.HistoryMatrix[i][j]; SuccessMatrix[i][j] = Parent1.SuccessMatrix[i][j]; } else { if (iDonor == 0) { ReturnedMatrix[i][j] = Parent1.iDecisionMatrix[i][j]; HistoryMatrix[i][j] = Parent1.HistoryMatrix[i][j]; SuccessMatrix[i][j] = Parent1.SuccessMatrix[i][j]; } else {ReturnedMatrix[i][j] = Parent2.iDecisionMatrix[i][j]; HistoryMatrix[i][j] = Parent2.HistoryMatrix[i][j]; SuccessMatrix[i][j] = Parent2.SuccessMatrix[i][j]; } } } } return ReturnedMatrix; } public int[][] newMatrix() { int[][] nMatrix = new int[17][10]; for (int i = 0; i < 17; i++) { for (int j = 0; j < 10; j++) { nMatrix[i][j] = 0; } } return nMatrix; } public void updateScore(int iProfit) { iScore = iScore + iProfit; iRunningScore = iRunningScore + iProfit; iGameCount++; iRunningGameCount++; for (int i = 0; i < 17; i++) { for (int j = 0; j <10; j++) { HistoryMatrix[i][j] += TempMatrix[i][j]; if (iProfit > 0) SuccessMatrix[i][j] += TempMatrix[i][j]; } } if (iProfit > 0) iWins++; TempMatrix = newMatrix(); } public int call(int iPlayerNum, int iPlayers, Hand[] hPlayers) { int iPlayer = hPlayers[iPlayerNum].getScore()-4; int iDealer = hPlayers[0].faceCard()-2; if (iPlayer == 17) return 1; if (iPlayer < 0 || iPlayer > 17 || iDealer < 0 || iDealer > 9) return 0; TempMatrix[iPlayer][iDealer]++; return iDecisionMatrix[iPlayer][iDealer]; } public String toHistoryString() { String sOutput = "History of "+sName+":\n"; for (int i = 0; i < 17; i++) { sOutput+="["; for (int j = 0; j < 10; j++) { if (HistoryMatrix[i][j] < 10) sOutput+=" "; if (HistoryMatrix[i][j] < 100) sOutput+=" "; if (HistoryMatrix[i][j] < 1000) sOutput+=" "; if (HistoryMatrix[i][j] < 10000) sOutput+=" "; if (HistoryMatrix[i][j] < 100000) sOutput+=" "; if (HistoryMatrix[i][j] < 1000000) sOutput+=" "; sOutput+=HistoryMatrix[i][j]; } sOutput+=" ] Score = "+(i+4)+"\n"; } sOutput+="\n"; return sOutput; } public String toSuccessString() { String sOutput = "Successes of "+sName+":\n"; for (int i = 0; i < 17; i++) { sOutput+="["; for (int j = 0; j < 10; j++) { if (SuccessMatrix[i][j] < 10) sOutput+=" "; if (SuccessMatrix[i][j] < 100) sOutput+=" "; if (SuccessMatrix[i][j] < 1000) sOutput+=" "; if (SuccessMatrix[i][j] < 10000) sOutput+=" "; if (SuccessMatrix[i][j] < 100000) sOutput+=" "; if (SuccessMatrix[i][j] < 1000000) sOutput+=" "; sOutput+=SuccessMatrix[i][j]; } sOutput+=" ] Score = "+(i+4)+"\n"; } sOutput+="\n"; return sOutput; } public static void main(String[] args) { int iIterations; int iGenerations; int iTrainingRuns; if (args.length>0) iGenerations = Integer.parseInt(args[0]); else iGenerations = 25; if (args.length>1) iIterations = Integer.parseInt(args[1]); else iIterations = 100000; if (args.length>2) iTrainingRuns = Integer.parseInt(args[2]); else iTrainingRuns = 100000; PlayerGeneticLearningMemory pOne = new PlayerGeneticLearningMemory(); // PlayerGeneticLearningMemory pTwo = new PlayerGeneticLearningMemory(); System.out.println("Type: "+pOne.getName()+"; Iterations: "+iIterations+"; Generations: "+iGenerations+"; Trainings Runs: "+iTrainingRuns); System.out.println(pOne.toString()); // System.out.println(pTwo.toString()); for (int i = 0; i < iGenerations; i++) { System.out.println("Beginning Generation #"+(i+1)); pOne.run(iIterations); // pTwo.run2(iIterations); } System.out.println(pOne.toHistoryString()); // System.out.println(pTwo.toHistoryString()); System.out.println(pOne.toSuccessString()); // System.out.println(pTwo.toSuccessString()); } }