这是自己在图像分割时用到的,稍作修改变成简单的求解二元二次函数问题,没有进行优化,确定可以
(1) 步长和视野为定值,可以修改为变值,先大后小
(2) 每次探路后的迈步也可以进行优化,此处未用
(3) 对于不需要的部分完全可以剪枝
(4) 可以增加变化机制,适当微量调整最优值
一、主函数
package AFAS_PACK;
import java.io.IOException;
public class mainTest {
/**
* @param args
* @throws IOException
* @author sun
*/
public static void main(String[] args) throws IOException {
//int fishNum, int tryTime, int dim, double step, double delta, double visual
System.out.println("begin");
AFAS run = new AFAS(10,5,2,5,0.2,10);
run.doAFAS(40 );//括号内为迭代次数
}
}
二、人工鱼
package AFAS_PACK;
import java.io.IOException;
public class Fish {
public int dim; //每条鱼的维度
public int[] x; //每条鱼的具体多维坐标
public double fit; //鱼的适应值,浓度
public int visaul; //每条鱼的视野
public final double[] H = new double[256];
public final double[] W = new double[256];
public Fish(int dim, int visaul) throws IOException {
super();
this.dim = dim;
this.visaul = visaul;
x = new int[dim];
for(int i=0;i<dim;i++)
x[i] = (int) Math.floor(256*Math.random());
fit = 0;
//init();
}
/*getfit = newfunction(this.x[0],this.x[1]);*/
public double distance(Fish f)
{
double a = 0;
for(int i=0;i<dim;i++)
{
if(this.x[i]-f.x[i]==0)
a = 0.00001;
else
a += (this.x[