⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 afa.txt

📁 人工鱼群算法
💻 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 + -