📄 aa.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 + -