📄 algorithm.java~185~
字号:
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");
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[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]));
}
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]);
}
}
}
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)
{
int i;
for(i=0;i<this.Gene_Len;i++)
{
w[i]=group[k][i];
// System.out.println(w[i]);
}
}
public double Learn_Process(double xx)
{ int L0=1;
int L1=3;
int L2=3;
int L3=1;
int i,j,tx1,tx2,tw;
x_pos[0]=0;
x_pos[1]=2;
x_pos[2]=6;
x_pos[3]=10;
x[1]=-1;
x[5]=-1;
x[9]=-1;
x[0]=xx;
tx1=x_pos[1];
tw=0;
double s;
//L1
for(i=0;i<L1;i++)
{
s=0;
tx2=x_pos[0];
for(j=0;j<L0+1;j++)
{
s=s+x[tx2]*w[tw];
tw=tw+1;
tx2=tx2+1;
}
x[tx1]=1/(1+Math.exp(-s));
tx1=tx1+1;
}
//L2
tx1=x_pos[2];
tw=6;
for(i=0;i<L2;i++)
{
s=0;
tx2=x_pos[1];
for(j=0;j<L1+1;j++)
{
s=s+w[tw]*x[tx2];
tw=tw+1;
tx2=tx2+1;
}
x[tx1]=1/(1+Math.exp(-s));
tx1=tx1+1;
}
tx1=x_pos[3];
tw=18;
for(i=0;i<L3;i++)
{
s=0;
tx2=x_pos[2];
for(j=0;j<L2+1;j++)
{
s=s+w[tw]*x[tx2];
tw=tw+1;
tx2=tx2+1;
}
x[tx1]=1/(1+Math.exp(-s));;
}
return x[tx1];
}
public void select()
{ int i,k,j,a;
sort();
fit_ave=fit_min+(fit_max-fit_min)/10;
k=0;
for(i=0;i<(int)(Group_Size*0.90);i++)//0.95
{ for(j=0;j<Gene_Len;j++)
// group[pool2[i]][j]=old_Group[k][j];
old_Group[k][j]=group[pool2[i]][j];
k=k+1;
}
i=0;
while(k<Group_Size)
{
//System.arraycopy(group[pool2[i]],0,old_Group[k],0,Gene_Len);
for(j=0;j<Gene_Len;j++)
{
// group[pool2[i]][a]=old_Group[k][a];
old_Group[k][j]=group[pool2[i]][j];
}
i=i+1;
k=k+1;
}
for(i=0;i<Group_Size;i++)
{ for(j=0;j<Gene_Len;j++)
// old_Group[i][j]=group[i][j];
group[i][j]=old_Group[i][j];
}
}
public double f(double x)
{
double result;
result=x*(1+Math.cos(x))*(2+Math.sin(2*x));
return result;
}
public void sort()
{
int i,j,k,s;
for(i=0;i<Group_Size;i++)
pool2[i]=i;
for(i=0;i<Group_Size;i++)
{
k=pool2[i];
for(j=i+1;j<Group_Size;j++)
{
if(gene_fit[pool2[j]]<gene_fit[k])
k=j;
}
s=pool2[i];
pool2[i]=k;
pool2[k]=s;
}
}
public void mutate()
{
int i,j,n,k,p1,p2,pa;
double p,q;
double a,b;
q=diff;
if(diff>0.09)
q=0.09;
p=q*200;
for(n=0;n<28;n++)//n<(int)((q*200)/2);
for(k=0;k<20;k++)//(int)(q*200)/3
{
if(Math.random()*100<p)
{
a=Math.random()*(Group_Size-nn)+(double)nn;
b=Math.random()*Gene_Len;
i=(int)a;
j=(int)b;
pa=60;
if(diff<0.05)
pa=40;
p1=(int)(Math.random()*100);
p2=(int)(Math.random()*100);
if(p1>pa)
group[i][j]=Math.random()*width-width/2;
else if(p1>pa+(100-pa)/2)
{
if(p2>70)
group[i][j]=group[i][j]+Math.random()*2;
else if(p2<30)
group[i][j]=group[i][j]+Math.random();
else
group[i][j]=group[i][j]+Math.random()/10;
}
else
{ if(p2>70)
group[i][j]=group[i][j]-Math.random()*2;
else if(p2<30)
group[i][j]=group[i][j]-Math.random()/2;
else
group[i][j]=group[i][j]-Math.random()/10;
}
}
}
}
public void invert()
{
int start,stop,i,j,n,k,ptr;
double t,p,q;
q=diff;
if(diff>0.09)
q=0.09;
p=diff*200;
for(n=0;n<(int)((q*200)/3);n++)
for(j=0;j<(int)((q*200)/3);j++)
{
if(Math.random()*100<p)
{
ptr=(int)(Math.random()*(Group_Size-nn)+nn);
start=(int)(Math.random()*Gene_Len);
stop=(int)(Math.random()*Gene_Len);
if(start<stop)
{k=start;
start=stop;
stop=k;
}
k=stop;
for(i=start;i<=(start+stop)/2;i++)
{
t=group[ptr][i];
group[ptr][i]=group[ptr][k];
group[ptr][k]=t;
k=k-1;
}
}
}
}
public void denormalize()
{ int i;
for(i=0;i<STEP;i++)
{
sampleResult[i]=sampleResult[i]*(max-min)+min;
actualResult[i]=actualResult[i]*(max-min)+min;
}
}
public void showWindow(){
ResultFrame frame =new ResultFrame(actualResult,sampleResult,listofinfo,max,min);
frame.show();
}
static boolean Quit_Flag;//是否学习完毕
private static final int STEP=20;
File fhw;//输入文件
File fhy;
File fhny;
BufferedReader reader;
PrintWriter writer;
private static int circle ;
private static double fit_max,fit_min,fit_ave;
private static final int Group_Size=30;
private double[] gene_fit =new double[Group_Size];
private static final int Gene_Len=22;
double[][] Gene_Array= new double[Group_Size][Gene_Len];
private static double[][] group=new double[Group_Size][Gene_Len];
private static double[][] old_Group=new double[Group_Size][Gene_Len];
private static final float width=90;
private static final double Start_X=0;
private static final double Stop_X=2*Math.PI;
double[] px= new double[STEP];
double[] py= new double[STEP];
private static final double pc=0.8;//0.8
private static final int nn=2;
int[] pool= new int[Group_Size];
int[] pool2=new int[Group_Size];
private int ptr_good;
private double diff;
Point[] learn_newpxy= new Point[STEP];
Point[] learn_oldpxy= new Point[STEP];
double[] w= new double[Gene_Len];
FileOutputStream outfw;
private static final double EPS=0.001;
double[] x=new double[11];
int[] x_pos=new int[4];
private static final int View_WEIGHT_NUM=5;
private LinkedList[] listofinfo=new LinkedList[View_WEIGHT_NUM];
private double[] info=new double[View_WEIGHT_NUM];
double min=9999;
double max=0;
double infoMinOutput=9999;
double infoMaxOutput=-9999;
double[] actualResult =new double[Gene_Len];
double[] sampleResult =new double[Gene_Len];
private void jbInit() throws Exception {
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -