Sei sulla pagina 1di 5

E:\My Documents\Java Project\AI\GA\GAProject.

java

1: /*
2: * Copyright Denny Hermawanto (d_3_nny@yahoo.com) - 2006
3: * Genetic Algorithm to determine variable a,b,c,d
4: * that satisfied equation a+2b+3c+4d=30
5: *
6: */
7: class GAProject{
8:
9: private double RandomNumberGenerator(){
10: java.util.Random rnd = new java.util.Random();//new
Date().getTime());
11: return rnd.nextDouble();
12: }
13:
14: private double[][] InitializePopulation(){
15: double[][] result = new
double[numberofpopulation][chromosomelength];
16: for(int i=0;i<numberofpopulation;i++){
17: for(int j=0;j<chromosomelength;j++){
18: result[i][j] = RandomNumberGenerator()/100;
19: }
20: }
21: return result;
22: }
23:
24: private double[][] ApplyConstraints(double[][] chromosomes){
25: double[][] result = new
double[numberofpopulation][chromosomelength];
26: for(int i=0;i<numberofpopulation;i++){
27: for(int j=0;j<chromosomelength;j++){
28: result[i][0] =
Math.floor(chromosomes[i][0]*Integer.MAX_VALUE) % 30;
29: result[i][1] =
Math.floor(chromosomes[i][1]*Integer.MAX_VALUE) % 10;
30: result[i][2] =
Math.floor(chromosomes[i][2]*Integer.MAX_VALUE) % 10;
31: result[i][3] =
Math.floor(chromosomes[i][3]*Integer.MAX_VALUE) % 10;
32: }
33: }
34: return result;
35: }
36:
37: private double ObjectiveFunction(double[] chromosome){
38: double result;
39: result = chromosome[0] + (2*chromosome[1]) + (3*chromosome[2]) +
(4*chromosome[3]);
40: return result;
41: }
42:
43: private double[] ComputeFitnesses(double[][] chromosome){
44: double[] result = new double[numberofpopulation];
45: for(int i=0;i<numberofpopulation;i++){
46: result[i] = Math.abs(ObjectiveFunction(chromosome[i]) - 30);
47: // System.out.println("Fit:"+result[i]);
48: }
49: return result;
50: }
51:
52: private double ComputeSingleFitnesses(double[] chromosome){
53: double result;
54: result = Math.abs(ObjectiveFunction(chromosome) - 30);
55: return result;
56: }
57:
58: private double[] ComputeSelectionProbability(double[] fitnessvalue){

Print Date: 8/17/2010. Time: 2:28:59 PM 1/5


E:\My Documents\Java Project\AI\GA\GAProject.java

59: double[] result = new double[numberofpopulation];


60: double totalfitness = 0;
61:
62: for(int i=0;i<fitnessvalue.length;i++){
63: totalfitness += 1/fitnessvalue[i];
64: }
65:
66: for(int i=0;i<numberofpopulation;i++){
67: //result[i] = fitnessvalue[i] / totalfitness;
68: //the minimum fitness has bigger prob
69: result[i] = ((1/fitnessvalue[i]) / totalfitness);
70: //System.out.println("Selec prob:"+result[i]);
71: }
72: return result;
73: }
74:
75: private double[][] SelectionProcess(double[][] chromosome, double[]
selectionprobability){
76: double[][] result = new
double[numberofpopulation][chromosomelength];
77:
78: double[] cumulativeprobability = new double[numberofpopulation];
79: double tempofcumulative = 0;
80: for(int i=0;i<numberofpopulation;i++){
81: cumulativeprobability[i] = selectionprobability[i] +
tempofcumulative;
82: tempofcumulative = cumulativeprobability[i];
83: //System.out.println("Cum:"+tempofcumulative);
84: }
85:
86: double temp;
87: int index = 0;
88: for(int i=0;i<numberofpopulation;i++){
89: temp = RandomNumberGenerator();
90: while(temp>cumulativeprobability[index]){
91: index++;
92: }
93: result[i] = chromosome[index];
94: }
95: return result;
96: }
97:
98: private double[][] Crossover(double[][] chromosome){
99: double[][] result = new
double[numberofpopulation][chromosomelength];
100: double[] r = new double[numberofpopulation];
101: int[] parent = new int[numberofpopulation];
102: int counter = 0;
103:
104: for(int i=0;i<numberofpopulation;i++){
105: r[i] = RandomNumberGenerator();
106: if(r[i]<crossoverprobability){
107: counter++;
108: parent[counter] = i;
109: }
110: result[i] = chromosome[i];
111: }
112: if(counter>1){
113: for(int i=0;i<counter;i++){
114: int cutpoint =
(int)(Math.random()*Integer.MAX_VALUE)%(chromosomelength-1);
115: if(i==counter-1){
116: for(int j=cutpoint;j<chromosomelength;j++){
117: result[parent[i]][j] = chromosome[parent[1]][j];
118: }
119: }

Print Date: 8/17/2010. Time: 2:28:59 PM 2/5


E:\My Documents\Java Project\AI\GA\GAProject.java

120: else{
121: for(int j=cutpoint;j<chromosomelength;j++){
122: result[parent[i]][j] = chromosome[parent[i+1]][j];
123: }
124: }
125: }
126: }
127: return result;
128: }
129:
130: private double[][] Mutation(double[][] chromosome){
131: double[][] result = new
double[numberofpopulation][chromosomelength];
132: int totalsubchromosome=0;
133: int[] subchromosomenumber;
134: int[][] mutatedchromosome;
135: int index = 0;
136:
137: totalsubchromosome = numberofpopulation * chromosomelength;
138: subchromosomenumber = new int[totalsubchromosome];
139:
140: for(int i=0;i<totalsubchromosome;i++){
141: double r = RandomNumberGenerator();
142: if(r<mutationprobability){
143: subchromosomenumber[index] = i;
144: index++;
145: //System.out.println("Mutation");
146: }
147: }
148: mutatedchromosome = new int[index][2];
149: //int chromnum,mutateposition;
150: for(int i=0;i<index;i++){
151: mutatedchromosome[i][0] = subchromosomenumber[i] /
chromosomelength;
152: //chromnum = mutatedchromosome[i][0];
153: mutatedchromosome[i][1] = subchromosomenumber[i] %
chromosomelength;
154: //mutateposition = mutatedchromosome[i][1];
155: }
156: for(int i=0;i<numberofpopulation;i++){
157: for(int j=0;j<chromosomelength;j++){
158: result[i][j] = chromosome[i][j];
159: }
160: }
161: for(int i=0;i<index;i++){
162: result[mutatedchromosome[i][0]][mutatedchromosome[i][1]]=Math.
floor(RandomNumberGenerator()*Integer.MAX_VALUE) % 30;
163: }
164: return result;
165: }
166:
167: /* private double[] SortChromosome(double[] chromosomefitness){
168: int totalnumber =chromosomefitness.length;
169: double[] result = new double[totalnumber];
170: double temp;
171: for(int i=0;i<totalnumber;i++){
172: result[i] = chromosomefitness[i];
173: }
174: for(int i=1;i<=totalnumber-1;i++){
175: for(int j=i;j<totalnumber;j++){
176: if(result[i-1]>result[j]){
177: temp = result[i-1];
178: result[i-1] = result[j];
179: result[j] = temp;
180: }
181: }

Print Date: 8/17/2010. Time: 2:28:59 PM 3/5


E:\My Documents\Java Project\AI\GA\GAProject.java

182: }
183: return result;
184: } */
185:
186: private double[][] SortChromosome(double[][] chromosome){
187: double[][] result = new
double[numberofpopulation][chromosomelength];
188: //double fitnessvaluebefore;
189: //double fitnessvaluecurrent;
190: double[] tempchromosome = new double[chromosomelength];
191:
192: for(int i=0;i<numberofpopulation;i++){
193: for(int j=0;j<chromosomelength;j++){
194: result[i][j] = chromosome[i][j];
195: }
196: }
197: for(int i=1;i<=numberofpopulation-1;i++){
198: for(int j=i;j<numberofpopulation;j++){
199: double fitnessvaluebefore =
ComputeSingleFitnesses(result[i-1]);
200: double fitnessvaluecurrent =
ComputeSingleFitnesses(result[j]);
201: if(fitnessvaluebefore>fitnessvaluecurrent){
202: tempchromosome = result[i-1];
203: result[i-1] = result[j];
204: result[j] = tempchromosome;
205: }
206: }
207: }
208: return result;
209: }
210:
211: public void PrintChromosome(double[][] chromosome){
212: for(int i=0;i<numberofpopulation;i++){
213: for(int j=0;j<chromosomelength;j++){
214: System.out.print(chromosome[i][j]+";");
215: }
216: System.out.println("");
217: }
218: }
219:
220: public void PrintFitnesses(double[] chromosomefitness){
221: //for(int i=0;i<chromosomefitness.length;i++){
222: System.out.print("Best Fitness:"+chromosomefitness[0]);
223: //}
224: System.out.println("");
225: }
226:
227: public void PrintBestChromosome(double[] bestchromosome){
228: System.out.println("Result:");
229: System.out.println("A=" + bestchromosome[0]);
230: System.out.println("B=" + bestchromosome[1]);
231: System.out.println("C=" + bestchromosome[2]);
232: System.out.println("D=" + bestchromosome[3]);
233: System.out.println("");
234: double result = bestchromosome[0]+(2*bestchromosome[1])
+(3*bestchromosome[2])+(4*bestchromosome[3]);
235:
System.out.println("("+bestchromosome[0]+")+2("+bestchromosome[1]+")+3("+
236: bestchromosome[2]+")+4("+bestchromosome[3]+")="+result);
237: }
238:
239: public void RunGA(){
240: chromosomes = InitializePopulation();
241: chromosomes = ApplyConstraints(chromosomes);
242: System.out.println("Init Population");

Print Date: 8/17/2010. Time: 2:28:59 PM 4/5


E:\My Documents\Java Project\AI\GA\GAProject.java

243: PrintChromosome(chromosomes);
244: for(int i=0;i<numberofgeneration;i++){
245: chromosomefitness = ComputeFitnesses(chromosomes);
246: chromosomeselectionprobability =
ComputeSelectionProbability(chromosomefitness);
247: newchromosome = SelectionProcess(chromosomes,
chromosomeselectionprobability);
248: newchromosome = Crossover(newchromosome);
249: newchromosome = Mutation(newchromosome);
250: chromosomes = newchromosome;
251: }
252: SortChromosome(chromosomes);
253: //chromosomefitness = SortChromosome(chromosomefitness);
254: System.out.println("Mature Population");
255: //PrintChromosome(chromosomes);
256: System.out.println("");
257: //PrintFitnesses(chromosomefitness);
258: PrintBestChromosome(chromosomes[0]);
259: System.out.println("Best
Fitness:"+ComputeSingleFitnesses(chromosomes[0]));
260: }
261:
262: //GA operator variables
263: private double[][] chromosomes;
264: private int chromosomelength;
265: private double[] chromosomefitness;
266: private double[] chromosomeselectionprobability;
267: private double[][] newchromosome;
268:
269: //GA behaviour definition
270: private int numberofpopulation;
271: private int numberofgeneration;
272: private double crossoverprobability;
273: private double mutationprobability;
274:
275: public static void main(String[] args){
276: GAProject myGA = new GAProject();
277: myGA.numberofpopulation = 45;
278: myGA.numberofgeneration = 50;
279: myGA.chromosomelength = 4;
280: myGA.crossoverprobability = 0.5;
281: myGA.mutationprobability = 0.01;
282: myGA.RunGA();
283: }
284: }

Print Date: 8/17/2010. Time: 2:28:59 PM 5/5

Potrebbero piacerti anche