📄 afa.txt
字号:
using System;
using System.Collections.Generic;
using System.Text;
namespace AF
{
class Program
{
const int M = 40;//数量
const int D = 2;//维数
static double[,] X = new double[M, D];//空间位置
const double Visual = 2.5;//可视距离
const double Step = 0.3;//人工鱼移动的最大步长
const double delta = 0.618;//拥挤度因子
const int Try_num = 5;//最大尝试次数
static double[] X_best = new double[D];//最优人工鱼个体状态
static double Y_best = new double();//最优人工鱼的食物浓度
static void Main(string[] args)
{
}
static double[,] initiate(double[,] x)//初始化
{
Random rand = new Random();
for (int i = 0; i < M; i++)
for (int j = 0; j < D; j++)
x[i, j] = rand.NextDouble() * 20.0 - 10.0;
return x;
}
static double[] rand_move(double[] xi, double step)//随机移动
{
Random rand=new Random();
for (int j = 0; j < D; j++)
xi[j] += rand.NextDouble() * step;
return xi;
}
static double distance(double[] xi, double[] xj)//计算xi,xj两个鱼之间的距离
{
double d = 0;
for (int j = 0; j < D; j++)
d += Math.Pow(xi[j]-xj[j],2.0);
return Math.Sqrt(d);
}
static double food_consistence(double [] xi)//计算食物浓度
{
double f = 0;
f = Math.Sin(xi[0]) / xi[0] + Math.Sin(xi[1]) / xi[1];
return f;
}
static double af_prey(double [] xi)//捕食行为
{
double[] xj = new double[D];
for (int i = 0; i < Try_num; i++)
{
xj = rand_move(xi,Step);
if (food_consistence(xi) < food_consistence(xj))
xi =matrix_add(xi, rand_move(matrix_deduct(xi, xj), Step / distance(xi, xj)));
else
xi = rand_move(xi, Step);
}
return food_consistence(xi);
}
static double[] matrix_deduct(double[] xi, double[] xj)//向量相减
{
double[] x=new double[D];
for (int j = 0; j < D; j++)
x[j] = xi[j] - xj[j];
return x;
}
static double[] matrix_add(double[] xi, double[] xj)//向量相加
{
double[] x = new double[D];
for (int j = 0; j < D; j++)
x[j] = xi[j] + xj[j];
return x;
}
static double[] matrix_division(double[] xi, double nf)//矩阵除以常数
{
for (int j = 0; j < D; j++)
xi[j] /= nf;
return xi;
}
static void matrix_equal(double[] xi, double[] xj)
{
for (int j = 0; j < D; j++)
xi[j] = xj[j];
}
static double af_swarm(double[] xi)//聚群行为
{
int nf = 0;
double[] xc = new double[D];
for (int j = 0; j < M; j++)
{
if (distance(X[j], xi) < Visual)
{
nf++;
xc = matrix_add(xc, X[j]);
}
}
xc = matrix_division(xc, (double)nf);
if (food_consistence(xc) / (double)nf > delta * food_consistence(xi))
xi =matrix_add(xi, rand_move(matrix_deduct(xc, xi), Step / distance(xc, xi)));
else
af_prey(xi);
return food_consistence(xi);
}
static double af_follow(double[] xi)
{
double y_max = -1000;
double[] x_max = new double[D];
double d_max = 0;
int nf = 0;
for (int i = 0; i < M; i++)
{
if (distance(X[i], xi) < Visual && food_consistence(X[i]) > y_max)
{
y_max = food_consistence(X[i]);
matrix_equal(x_max, xi);
}
}
for (int j = 0; j < M; j++)
{
if (distance(x_max, X[j]) < Visual)
nf++;
}
if (food_consistence(x_max / (double)nf > delta * food_consistence(xi)))
xi = matrix_add(xi, rand_move(matrix_deduct(x_max, xi), Step / distance(x_max, xi)));
else
af_prey(xi);
return food_consistence(xi);
}
static void caculate()
{
double f1 = 0;
double f2 = 0;
double[] xi = new double[d];
for(int times=0;times<100;times++)
for (int i = 0; i < M; i++)
{
matrix_equal(xi, X[i]);
f1=af_follow(xi);
f2 = af_swarm(xi);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -