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

📄 aa.cs

📁 C#写的蚁群算法
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;

namespace AntSystem
{
    class Program
    {
	 const int n = 5;//city num
        const int nc = 100;// cicle num
        const int m = 10;// num of ants
        const double loss = 0.5;// 挥发速度
        const double alpha = 5;//对信息量的重视程度
        const double beta = 5;//启发式信息的受重视程度
        static void Main(string[] args)
        {
            city city = new city();
            double[,]  c= city.d;
           // ant[] antt;
            ant[] antt =new ant[m];
            for (int i = 0; i < m; i++)
            {
                antt[i] = new ant();
            }
            Random rand = new Random();
            double[,] p = new double[n, n];
             ant w = new ant();
             int accept = 0;
             double signal_all = 0;
             singnal sig = new singnal();
            double[,] message=new double[n,n];
             sig.sign = sig.sign_arr(0.1);
             double generate_rand = 0;
             double[, ,] p_rang = new double[n, n, 2];
             double p_temp=0;
             int[] start=new int[m];
             int[,] road=new int[m,n];
             double[] road_length = new double[m];

            // Console.Write(w.tour[2]);
            /* for (int i = 0; i < m; i++)
             { 
                 
                 antt[i].current = 0;
                 for (int k = 0; k < n; k++)
                 {
                     antt[i].tour[k] =0;
                     antt[i].visited[k] = true;
                 }
                 
               
             }*/


             

             for (int j = 0; j < m; j++)
             {
                antt[j].tour[0] = (int)(rand.NextDouble()*(double)(n-1)+0.5);
                antt[j].visited[antt[j].tour[0]]=false;
                antt[j].current=antt[j].tour[0];
                start[j] = antt[j].tour[0];
                Console.Write(antt[j].tour[0]);

              }



             for (int i = 0; i < nc; i++)
             {
                 for (int j = 0; j < m; j++)
                 {
                     for (int cNum = 0; cNum < n + 1; cNum++)
                     {
                         for (int visite = 0; visite < n; visite++)
                         {
                             if (antt[j].visited[visite])
                                 signal_all+=Math.Pow( sig.sign[antt[j].current,visite],alpha)*Math.Pow(1/c[antt[j].current,visite],beta);
                             
                         }


                         for (int visite = 0; visite < n; visite++)
                         {
                             if (antt[j].visited[visite])
                             {
                                 p[antt[j].current, visite] = Math.Pow(sig.sign[antt[j].current, visite], alpha) * Math.Pow(1 / c[antt[j].current, visite], beta) / signal_all;
                                 p_rang[antt[j].current, visite, 0] += p[antt[j].current, visite];
                             }
                         }
                         generate_rand = rand.NextDouble();
                         for (int p_i = 0; p_i < n; p_i++)
                         {
                             for (int p_j = 0; p_j < n; p_j++)
                             {
                                 if (p_rang[p_i, p_j, 0] >0)
                                 {
                                     p_temp += p_rang[p_i, p_j, 0];
                                     p_rang[p_i, p_j, 1] = p_temp;
                                 }
                             }
                         }
                         p_temp = 0;
                         for (int p_i = 0; p_i < n; p_i++)
                         {
                             for (int p_j = 0; p_j < n; p_j++)
                             {
                                 if (p_rang[p_i, p_j, 1] > 0)
                                 {
                                     p_rang[p_i, p_j, 0] = p_temp;
                                     p_temp =p_rang[p_i, p_j, 1];
                                 }
                             }
                         }
                         p_temp = 0;

                         for (int p_i = 0; p_i < n; p_i++)
                         {
                             for (int p_j = 0; p_j < n; p_j++)
                             {
                                 if (p_rang[p_i, p_j, 1] > generate_rand & generate_rand>(p_rang[p_i, p_j, 0] ))
                                 {
                                    antt[j].current=p_j;
                                     if(cNum<n)
                                    antt[j].tour[cNum + 1] = p_j;
                                    antt[j].visited[p_j] = false;
                                    antt[j].tour_length += c[p_i, p_j];
                                 }
                             }
                         }
                         for (int p_i = 0; p_i < n; p_i++)
                         {
                             for (int p_j = 0; p_j < n; p_j++)
                             {
                                 if (p_rang[p_i, p_j, 1] > 0)
                                 {
                                     p_rang[p_i, p_j, 0] =0;
                                     p_rang[p_i, p_j, 1]=0;
                                 }
                                 p[p_i, p_j] = 0;
                             }
                         }
                         signal_all = 0;
                         if (cNum == n - 1)
                             antt[j].visited[start[j]] = true;

                     }

                     for (int cc = 0; cc < n; cc++)
                         road[j, cc] = antt[j].tour[cc];
                     road_length[j] = antt[j].tour_length;

                  }
                  for (int sign_i = 0; sign_i < n; sign_i++)
                  {
                      for (int sign_j = 0; sign_j < n; sign_j++)
                          sig.sign[sign_i, sign_j] *= loss;
                  }
                      for (int j = 0; j < m; j++)
                      {
                          for (int ss = 0; ss < n - 1; ss++)
                              sig.sign[road[j, ss], road[j, ss + 1]] += 1 / road_length[j];
                          sig.sign[road[j, n - 1], road[j, 0]] += 1 / road_length[j];

                      }
                 
             }


         }



        

        



        class city
        {
            public const int n = 5;//city num
            public double[,] d = new double[5, 5] { { 0, 10, 15, 6, 2 }, { 0, 0, 8, 13, 9 }, { 0, 0, 0, 20, 15 }, { 0, 0, 0, 0, 5 }, { 0, 0, 0, 0, 0 } };
            public city()
            {
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 5; j++)
                        d[j, i] = d[i, j];
                }
                for (int i = 0; i < 5; i++)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        Console.Write(d[i, j] + ",");
                    }
                    Console.Write("\n");
                }

            }
            
        }
        
        


    }
    public class ant
    {
        public static int n = 5;
        public double tour_length = new int();
        public int[] tour = new int[n + 1];
        public bool[] visited = new bool[n];
        public int current;
        public ant()
        {
            this.current = 0;
            this.tour_length = 0;
            for (int i = 0; i < n; i++)
            {
                this.tour[i] = 0;
                this.visited[i] = true;
            }
            this.tour[n] = 0;
        }
    }
   public class singnal
    {
        public const int n = 5;
        public double[,] sign = new double[n, n];
        public double[,] sign_arr(double x)
        {
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    if(i!=j)
                    sign[i, j] = x;
            return sign;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -