package AFAS;
//import java.util.Random;
import java.util.Date;
public class myAFAS {
public myAFAS() {
// TODO 自动生成的构造函数存根
}
int fish_number; // 人工鱼群的规模
int try_number; // 尝试次数
int dim; // 人工鱼状态空间维数
double step; // 人工鱼移动的步长
double delta; // 拥挤度因子
double[][] distance; // 人工鱼的距离
double visual; // 视野
fish[] g_f; // 人工鱼群
fish best_fish; // 鱼群中的最有人工鱼个体
fish f_next[]; // 人工鱼的下一步
int index; // 当前最优值的人工鱼索引值
double DELTA[];
double XH[];
double init_X[][]; //初始化人工鱼状态
public myAFAS( int n,int ws, double v, int t, double step, double dt )
{
fish_number = n;
try_number = t;
this.step = step;
delta = dt;
dim = ws;
visual = v;
g_f = new fish[fish_number]; // 生成人工鱼群
}
// 初始化函数
public void init(int fish_num,int dim, double visual, int t, double s, double d)
{
fish_number = fish_num;
try_number = t;
step = s;
delta = d;
this.dim = dim;
this.visual = visual;
g_f = new fish[fish_number]; // 生成人工鱼群
int i=0,j=0;
init_X = new double[fish_number][dim];
// 对整个鱼群进行初始化
for( i=0; i<fish_number; ++i )
{
g_f[i] = new fish();
g_f[i].init(dim, visual);
for(j=0; j<dim; ++j)
init_X[i][j] = g_f[i].X[j];
System.out.println("fit:"+g_f[i].fit);
}
double distance[][] = new double[fish_number][fish_number];
// 计算距离
for( i=0; i<fish_number; ++i )
for( j=i; j<fish_number; ++j )
{
if(i!=j )
{
distance[i][j] = calDistance(g_f[i].X, g_f[j].X, dim);
distance[j][i] = distance[i][j];
}
else
{
distance[i][j]=0.00001;
}
}
//
DELTA = new double[dim];
XH = new double[dim];
// 对其他人工鱼的初始化
best_fish = new fish();
best_fish.init(dim,visual); // 初始化最有人工鱼
best_fish.fit = -999999; // 此时 , 最有人工鱼的最优值为-0xffffffff(无穷小)
//原来是f_n,我改成了f_next
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
f_next = new fish[3];
f_next[0] = new fish();
f_next[1] = new fish();
f_next[2] = new fish();
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
f_next[0].init(dim,visual);
f_next[1].init(dim,visual);
f_next[2].init(dim,visual);
// cout<<best_fish.fit<<endl;
}
// 计算两个人工鱼之间的距离
public double calDistance( double x1[], double x2[], int size )
{
// ofstream cout("pos.txt", ios::app);
double dis=0.0;
for( int i=0; i<size; ++i )
{
// System.out.print(x1[i]+" "+x2[i]);
dis += (x1[i]-x2[i])*(x1[i]-x2[i]);
}
if(Math.abs(dis)<0.0001 )
{
dis=0.0001;
}
// System.out.print("dis:"+dis+" 开方:"+Math.sqrt(dis));
return Math.sqrt(dis); // 返回结果
}
//混沌
public void hunDun(int ind)
{
int i=0;
param.Z = param.U2*( param.Z*(1-param.Z) );
for( i=0; i<dim; i++ )
{
DELTA[i] = -visual+2*visual*param.Z;
DELTA[i] = visual -param.U1*DELTA[i]*DELTA[i];
//原来是f_n,我改成了f_next
XH[i] = f_next[0].X[i]+DELTA[i];
}
double temp = f_next[0].consistence(XH, dim );
if( temp > f_next[0].fit )
{
for( i=0; i<dim; i++ )
{
f_next[0].X[i] = XH[i];
}
param.hd++;
// System.out.print("hd="+param.hd);
f_next[0].fit = temp;
}
}
// 混沌
public void hunDun_new(int ind )
{
int i=0;
for( i=0; i<dim; ++i )
{
DELTA[i] = -visual+2*visual*init_X[ind][i];
//原来是f_n,我改成了f_next
XH[i] = f_next[ind].X[i]+DELTA[i];
}
double temp = f_next[ind].consistence(XH, dim );
if( temp > f_next[ind].fit )
{
// System.out.print(""flag");
for( i=0; i<dim; i++ )
{
f_next[ind].X[i] = XH[i];
}
param.hd++;
// System.out.print("hd="+param.hd);
f_next[ind].fit = temp;
}
}
// 觅食行为
public void prey(int ind)
{
// ofstream cout("prey.txt", ios::app );
int i,j;
/*
static int tt=(unsigned)time(NULL);
srand((unsigned)time(NULL)+tt++);
long r1 = System.currentTimeMillis();
Random rand = new Random(r1);
double r = (2*(rand.nextDouble())-1)*param.Umax;
*/
// double r = (2*(Math.random())-1)*param.Umax;
fish new_fish = new fish();
new_fish.init(dim,visual);
System.out.println("dim="+dim);
for(i=0; i<try_number; ++i ) // 进行try_number次尝试
{
for(j=0; j<dim; j++ )
{
//new_fish.X[j] = visual*rand()/(double)RAND_MAX;
new_fish.X[j] = (2*(Math.random())-1)*param.Umax;
// System.out.println("new_fish.X["+j+"]:"+new_fish.X[j]);
}
new_fish.fit = new_fish.consistence(new_fish.X, dim);
// System.out.println("new_fish.fit:"+new_fish.fit);
// 如果f_n1的食物浓度大于当前人工鱼的食物浓度
if( new_fish.fit > g_f[ind].fit )
{
// double dis = calDistance( new_fish.X, g_f[ind].X,dim);
// 计算X_new 与X[ind]d的距离
for( j=0; j<dim; j++ )
f_next[0].X[j] = new_fish.X[j];
// g_f[ind].X[j]+(new_fish.X[j]-g_f[ind].X[j])*step*rand()/(double)RAND_MAX/dis;
f_next[0].fit =f_next[0].consistence(f_next[0].X,dim); // new_fish.fit;
}
else
{
for( j=0; j<dim; j++ )
// f_next[0].X[j] = g_f[ind].X[j]+step*rand()/(double)RAND_MAX;
f_next[0].X[j] = g_f[ind].X[j]+step*Math.random();
f_next[0].fit = f_next[0].consistence(f_next[0].X, dim );
}
}
// 加入混沌
// hunDun(ind );
}
//聚群行为
public void swarm( int ind )
{
int nf = 0;
double X_center[] = new double[param.DIM]; // 中心位置
//memset( X_center,0,sizeof(X_center) );
int i,j;
// 计算人工鱼的中心位置
for( j=0; j<fish_number; ++j )
{
if( distance[ind][j]<visual )
{
nf++;
for( i=0; i<dim; ++i )
{
X_center[i] += g_f[j].X[i];
}
}
}
for( i=0; i<dim; i++ )
X_center[i] /=nf; // 人工鱼的中心位置
// 满足条件
double dis=0.0;
// static int tt=(unsigned)time(NULL);
// srand((unsigned)time(NULL)+tt++);
//f_n->f_next
f_next[1].fit = f_next[1].consistence( X_center, dim );
if( f_next[1].fit/nf > delta*g_f[ind].fit )
{
dis = calDistance(X_center,g_f[ind].X,dim );
for( i=0; i<dim ; ++i )
f_next[1].X[i] = g_f[ind].X[i]+
// (X_center[i]-g_f[ind].X[i])*step*rand()/(double)RAND_MAX/dis;
(X_center[i]-g_f[ind].X[i])*step*Math.random()/dis;
}
else
{
prey(ind); // 不满足条件执行觅食行为
} //
}
//追尾行为
public void follow(int ind)
{
int i,j;
double dis = 0.0;
double max = -999999;
double max_x[]=new double[param.DIM];
for( j=0; j<fish_number; ++j )
{
if( distance[ind][j]<visual && g_f[j].fit>max )
{
max = g_f[j].fit;
for( i=0; i<dim; i++ )
max_x[i] = g_f[j].X[i];
index = j;
}
}
int nf = 0;