📄 algorithm.java
字号:
package ga;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.lang.*;
import java.io.PrintWriter;
public class Algorithm {
public Algorithm() {
try {
jbInit();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String args[]){
Algorithm m = new Algorithm();
Quit_Flag = false;
m.init(); //
while (true) {
m.evalutate();
if (Quit_Flag == true)
{ break;
//
// m.showWindow();
//System.exit(1);//hui tuichu zuihou yao zhuyi
}
else {
m.select();
m.crossover();
m.mutate();
// m.invert();
}
}
m.denormalize();
m.showWindow();
}
public void init(){
int i, j, k;
// double max, min;
double len;
double[] fx = new double[this.STEP];
double[] fy = new double[this.STEP];
// int max_y, min_y;
String str;
circle = 1;
fit_max = -200;
fit_min = 100;
for (i = 0; i < Group_Size; i++)
// gene_fit[i] =Math.random();
gene_fit[i]=0;
fhw = new File("ga.txt");
fhy = new File("xy.txt");
fhny = new File("nxy.txt");
try{
fw =new PrintWriter(new FileOutputStream(fhw));
}catch(IOException e)
{
}
for (i = 0; i <Group_Size; i++)
for (j = 0; j < Gene_Len; j++)
group[i][j] = Math.random() * width - width / 2;
//group[i][j]=0;
fx[0] = Start_X;
fy[0] = f(fx[0]);
len = (Stop_X - Start_X) / (double) STEP;
for (i = 1; i <STEP; i++) {
fx[i] = fx[i - 1] + len;
fy[i] =f(fx[i]);
if (fy[i]>max )
max=fy[i];
if(fy[i]<min)
min=fy[i];
}
for(i=0;i<STEP;i++)
{
px[i]=(fx[i]-Start_X)/(Stop_X-Start_X);
py[i]=(fy[i]-min)/(max-min);
}
for(i=0;i<STEP;i++)
{
sampleResult[i]=py[i];
}
for(i=0;i<5;i++)
{
listofinfo[i]=new LinkedList();
listofinfo[i].add(new Double(infoMinOutput));
listofinfo[i].add(new Double(infoMaxOutput));
}
}
public void Cross(int a,int b)
{
int i;
double p;
double ta,tb;
for (i = 0; i < Gene_Len; i++) {
p = Math.random();
if (p <= pc)
{
ta=group[a][i];
tb=group[b][i];
group[a][i]=(ta+2*tb)/3;
group[b][i]=(tb+2*ta)/3;
}
}
}
public void crossover()
{
int i,N;
mangle();
N=(Group_Size-nn)/2;
for(i=0;i<N;i++)
{
Cross(pool[2*i],pool[2*i+1]);
}
}
public void evalutate(){
int i,k;
double s,s2,total;
double y;
String str;
total=0;
fit_max=-100000;
fit_min=100000;
for(i=0;i<Group_Size;i++)
{
s=0;
s2=0;
Gene2Weight(i);
for(k=0;k<STEP;k++)
{
y=Learn_Process(px[k]);
s=s+(y-py[k])*(y-py[k]);
}
if( s>fit_max )
fit_max=s;
if(s<fit_min)
{ fit_min=s;
ptr_good=i;
diff=s/STEP;
}
gene_fit[i]=s;
total=total+s;
}
// System.out.println(diff);
// System.out.println(circle);
if((circle%1000)==0){
Gene2Weight(ptr_good);
listofinfo[0].add(new Double(w[2]));
if(w[2]<((Double)listofinfo[0].get(0)).doubleValue())
listofinfo[0].set(0,new Double(w[2]));
if(w[2]>((Double)listofinfo[0].get(1)).doubleValue())
listofinfo[0].set(1,new Double(w[2]));
//
listofinfo[1].add(new Double(w[6]));
if(w[6]<((Double)listofinfo[1].get(0)).doubleValue())
listofinfo[1].set(0,new Double(w[6]));
if(w[6]>((Double)listofinfo[1].get(1)).doubleValue())
listofinfo[1].set(1,new Double(w[6]));
//
listofinfo[2].add(new Double(w[10]));
if(w[10]<((Double)listofinfo[2].get(0)).doubleValue())
listofinfo[2].set(0,new Double(w[10]));
if(w[10]>((Double)listofinfo[2].get(1)).doubleValue())
listofinfo[2].set(1,new Double(w[10]));
//
listofinfo[3].add(new Double(w[15]));
if(w[15]<((Double)listofinfo[3].get(0)).doubleValue())
listofinfo[3].set(0,new Double(w[15]));
if(w[15]>((Double)listofinfo[3].get(1)).doubleValue())
listofinfo[3].set(1,new Double(w[15]));
//
listofinfo[4].add(new Double(w[20]));
if(w[18]<((Double)listofinfo[4].get(0)).doubleValue())
listofinfo[4].set(0,new Double(w[20]));
if(w[20]>((Double)listofinfo[4].get(1)).doubleValue())
listofinfo[4].set(1,new Double(w[20]));
System.out.print(circle);
System.out.println();
System.out.print(diff);
System.out.println();
for(i=0;i<Gene_Len;i++)
{
System.out.print(w[i]);
System.out.print(" ");
}
System.out.println();
}
circle=circle+1;
if(diff<this.EPS | circle>300000)
{
Quit_Flag=true;
Gene2Weight(ptr_good);
//
listofinfo[0].add(new Double(w[2]));
if(w[2]<((Double)listofinfo[0].get(0)).doubleValue())
listofinfo[0].set(0,new Double(w[2]));
if(w[2]>((Double)listofinfo[0].get(1)).doubleValue())
listofinfo[0].set(1,new Double(w[2]));
//
listofinfo[1].add(new Double(w[6]));
if(w[6]<((Double)listofinfo[1].get(0)).doubleValue())
listofinfo[1].set(0,new Double(w[6]));
if(w[6]>((Double)listofinfo[1].get(1)).doubleValue())
listofinfo[1].set(1,new Double(w[6]));
//
listofinfo[2].add(new Double(w[10]));
if(w[10]<((Double)listofinfo[2].get(0)).doubleValue())
listofinfo[2].set(0,new Double(w[10]));
if(w[10]>((Double)listofinfo[2].get(1)).doubleValue())
listofinfo[2].set(1,new Double(w[10]));
//
listofinfo[3].add(new Double(w[15]));
if(w[15]<((Double)listofinfo[3].get(0)).doubleValue())
listofinfo[3].set(0,new Double(w[15]));
if(w[15]>((Double)listofinfo[3].get(1)).doubleValue())
listofinfo[3].set(1,new Double(w[15]));
//
listofinfo[4].add(new Double(w[20]));
if(w[20]<((Double)listofinfo[4].get(0)).doubleValue())
listofinfo[4].set(0,new Double(w[20]));
if(w[20]>((Double)listofinfo[4].get(1)).doubleValue())
listofinfo[4].set(1,new Double(w[20]));
for(k=0;k<STEP;k++)
{
actualResult[k]=Learn_Process(px[k]);
}
System.out.print(circle);
System.out.println();
System.out.println(diff);
System.out.println();
for(i=0;i<Gene_Len;i++)
{
System.out.print(w[i]);
System.out.print(" ");
}
System.out.println();
}
}
public void mangle()
{
int i;
double a,b;
int p1,p2;
int t;
for(i=nn;i<Group_Size;i++)
pool[i]=i;
for(i=0;i<Group_Size/2;i++)
{
a=(double)Math.random()*(Group_Size-nn)+(double)nn;
b=(double)Math.random()*(Group_Size-nn)+(double)nn;
p1=(int)a;
p2=(int)b;
if(p1!=p2)
{ t=pool[p1];
pool[p1]=pool[p2];
pool[p2]=t;
}
}
}
public void Gene2Weight(int k)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -