问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

蚁群算法求解最短路的C#代码

发布网友 发布时间:2022-04-28 22:28

我来回答

2个回答

热心网友 时间:2022-06-24 04:16

你好,希望对你有所帮助
using System;
using System.Collections.Generic;
using System.Text;
namespace AntSystem
{
public class AA
{
/**//// <summary>
/// 对信息量的重视程度
/// </summary>
private int alpha;
/**//// <summary>
/// 启发式信息的受重视程度
/// </summary>
private int beta;
/**//// <summary>
/// 信息素的挥发速度
/// </summary>
private double lo;
/**//// <summary>
/// 城市距离矩阵
/// </summary>
private double[,] City;
/**//// <summary>
/// 信息素矩阵
/// </summary>
private double[,] Message;
/**//// <summary>
/// opneList用于存放下一步可行城市
/// </summary>
private Queue<int> openList=new Queue<int> ();
/**//// <summary>
/// closedList用于存放已经访问过的城市
/// </summary>
private Queue<int> closedList=new Queue<int> ();
/**//// <summary>
/// 储存较好的路径
/// </summary>
private Queue <int> BestList=new Queue<int> ();
private int Pro_time = 0;
/**//////////////////////////////////////////////////////////
/// <summary>
/// 构造函数:形成城市距离和信息素矩阵
/// </summary>
/// <param name="city">城市距离矩阵</param>
/// <param name="Lo"> 信息素的挥发速度</param>
public AA(double[,] city,double Lo,int Alpha,int Beta)
{
alpha = Alpha;
beta = Beta;
lo=Lo;
int temp = Convert.ToInt32( Math.Sqrt(city.Length));
City=new double [temp,temp];
Message=new double [temp,temp];
for (int i = 0; i < temp; i++)
{
for (int j = 0; j < temp; j++)
{
City[i, j] = city[i, j];
}
}
//初始化信息素矩阵
for (int i = 0; i < temp; i++)
{
for (int j = 0; j < temp; j++)
{
if (i != j)
{
Message[i, j] = (double)1 / (temp * temp - temp);
}
}
}
}
/**/////////////////////////////////////////////////////////////
/// <summary>
/// 改变信息素矩阵,closed_list为较好的路径
/// </summary>
/// <param name="closed_list"></param>
private void Change_Message(Queue<int> closed_list)
{
lock (this)
{
int[] temp_Array = new int[closed_list.Count];
temp_Array = closed_list.ToArray();
for (int i = 0; i < closed_list.Count - 1; i++)
{
Message[temp_Array[i], temp_Array[i + 1]] = Message[temp_Array[i], temp_Array[i + 1]] + lo / ((1 - lo) *Convert.ToInt32(Get_Weight(closed_list)+1));
}
Message[temp_Array[temp_Array.Length - 1], temp_Array[0]] = Message[temp_Array[temp_Array.Length - 1], temp_Array[0]] + lo / ((1 - lo) *Convert.ToInt32(Get_Weight(closed_list)));
for (int i = 0; i < closed_list.Count; i++)
{
for (int j = 0; j < closed_list.Count; j++)
{
Message[i, j] = (1 - lo) * Message[i, j];
}
}
}
}
/**////////////////////////////////////////////////////////////////
/// <summary>
/// 输入一个链表,计算出其对应的总路径
/// </summary>
/// <param name="closed_list"></param>
/// <returns></returns>
public double Get_Weight(Queue <int> closed_list)
{
lock (this)
{
double sum = 0;
int[] temp_Array = new int[closed_list.Count];
temp_Array = closed_list.ToArray();
for (int i = 0; i < Convert.ToInt32(temp_Array.Length) - 1; i++)
{
sum = sum + City[temp_Array[i], temp_Array[i + 1]];
}
sum = sum + City[temp_Array[temp_Array.Length - 1], temp_Array[0]];
return sum;
}
}
/**///////////////////////////////////////////////////////////////
/// <summary>
/// 产生到i城市后,下一个可走城市的集合。并将城市编号加入到openList中。
/// 产生的城市不可以已经存在closedList中
/// </summary>
/// <param name="i"></param>
private void NextCity()
{
openList.Clear();
int temp_int=Convert.ToInt32(Math.Sqrt(City.Length));
for (int i = 0; i < temp_int; i++)
{
if (closedList.Contains(i) ==false)
{
openList.Enqueue(i);
}
}
}
/**///////////////////////////////////////////////////////////////
/// <summary>
/// 选择应该走那条路,选择完路A后,清空openList,再把A加入到openList中
/// </summary>
/// <returns></returns>
private int choiceRoute()
{
int index = 0;//记录选择的城市
Random random = new Random();
double random_value =(double) random.NextDouble();//随机选择的概率
int[] temp_Array=new int [openList.Count];
temp_Array=openList.ToArray();
double sum_Message = 0;//openList所有节点的总信息量
for (int i = 0; i < openList.Count; i++)
{
double eta = 1 / City[Pro_time, temp_Array[i]];
sum_Message = sum_Message +Math.Pow(Message[Pro_time, temp_Array[i]],alpha)*Math.Pow (eta,beta);
}
double temp=0;
for (int j = 0; j < openList.Count; j++)
{
double eta = 1 / City[Pro_time, temp_Array[j]];
temp=temp+Math.Pow(Message[Pro_time,temp_Array[j]],alpha)*Math.Pow(eta,beta)/sum_Message;
if (temp > random_value)
{
index = temp_Array [j];
break;
}
}
openList.Clear();
openList.Enqueue(index);
return index;
}
/**//////////////////////////////////////////////////////////////
public Queue<int> Main_DW()
{
BestList.Clear();
/**////共循环20次
for (int i = 0; i < 4; i++)
{
/**////共有n只蚂蚁n=City'number Convert.ToInt32(Math.Sqrt(City.Length))
for (int j = 0; j < Convert.ToInt32(Math.Sqrt(City.Length)); j++)
{
openList.Enqueue(0);
closedList.Clear();
while (openList.Count != 0 && closedList.Count != Convert.ToInt32(Math.Sqrt(City.Length)))
{
int temp = openList.Dequeue();
Pro_time = temp;
closedList.Enqueue(temp);
if (openList.Count == 0 && closedList.Count == Convert.ToInt32(Math.Sqrt(City.Length)))
{
if (BestList.Count == 0)
{
int[] temp_Array = new int[Convert.ToInt32(Math.Sqrt(City.Length))];
temp_Array = closedList.ToArray();
for (int k = 0; k < Convert.ToInt32(Math.Sqrt(City.Length)); k++)
{
BestList.Enqueue(temp_Array[k]);
}
}
if (Get_Weight(BestList) > Get_Weight(closedList))
{
BestList.Clear();
int[] temp_Array = new int[Convert.ToInt32(Math.Sqrt(City.Length))];
temp_Array = closedList.ToArray();
for (int k = 0; k < Convert.ToInt32(Math.Sqrt(City.Length)); k++)
{
BestList.Enqueue(temp_Array[k]);
}
}
}
NextCity();
choiceRoute();
}
}
Change_Message(BestList);//修改信息量
}
return BestList;
}
}
}

热心网友 时间:2022-06-24 04:16

一起学习一下
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
违章建筑被强拆如何确定补偿?违章建筑补偿标准 违章建筑可以得到补偿吗?征收违章建筑物怎么赔偿 违章建筑拆除补偿的细则是怎样的? 违建拆除有补偿吗强拆有赔偿吗,政府征收违建房屋拆除有补偿吗 违章建筑强拆怎么赔偿?违建强拆会赔偿吗 违章建筑被强行拆除有补偿吗?违法建筑被违法强拆怎么赔偿 原材料明细账怎么登帐 原材料明细账用什么账本 小米3安装程序,,老出现储存空间不足怎么办 小米3电信版无法安装百度视频,说我内存不足,我剩余内存还有5g并且我安... 身上长痘痘是什么原因 急求蚁群算法解决 VRPTW问题的matlab代码,最好是ACS或者MMAS的! 华为手机怎么取消游戏免打扰?就是在游戏中收到信息有提示。 昨晚安庆上空飞机是怎么回事 身上老是出油背上长痘痘是什么原因? xgboost的python包有多少参数 小米空气净化器2s怎么连接手机 身上长痘是什么原因 小米空气净化器2经常离线,什么情况 蚁群算法求解TSP问题遇到“索引超出矩阵维度。”的问题跪求大神能解答 matlab蚁群算法路径优化 小米空气净化器2无法连接WIFI,求助 1500米远柴油发电机供电能不能实现?大家帮我看一看,最好结合实际经验,不要仅有数字理论 在机器学习中有哪些典型的Online算法 小米空气净化器2无法连接wifi λ演算的非形式化的描述 身上长痘痘是怎么回事啊? 求助Matlab蚁群算法求一般函数极值的算法 手机连不上小米空气净化器2 模拟退火算法解决路径优化 的源代码 为什么巢湖上空天天有战斗机在飞 是不是安庆军用机场的? 小米空气净化器2怎样连接wifi? 身上长痘痘是什么原因? 安庆市军用飞机频繁飞出为什么? 怎么才能把油螺肉取出来? 身上脸上长痘痘怎么回事? 安庆 如何被日本占领的 银耳莲子羹煮多久 网络用语毛线是什么意思 如何让微信名字显示空白 苏联空军志愿队的苏联空军的作战 网络用语:毛线 是什么意思? 银耳莲子羹怎么做比较适合孩子喝? 历史上哪位将军镇守西关? 在家自制银耳莲子羹,该如何掌握火候? 常州机场有轰炸机吗 小米空气净化器APP连不上怎么回事? 为什么徐州每天都有战斗机飞 银耳莲子羹怎么煮 小米一代空气净化器,app无法搜到设备,用二维码扫描添加,显示已被其