Csharp实现蚁群算法解决TSP问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#实现蚁群算法解决TSP问题
学习了一个学期的人工智能,了解到了人工智能的强大力量.很多智能算法真是很令人向往!
下面是我实现的蚁群算法.
下面介绍一下什么是蚁群算法:
主要是一种模拟生物的进化:
用信息素来引导蚂蚁向比较好的方向前进.
用我们熟悉的鲁迅先生的一句话:地上没有路,走的人多了也就有了路.(用在蚁群算法身上很好)
using System;
using System.Collections.Generic;
using System.Text;
namespace AntSystem
{
public class AA
{
/**////
/// 对信息量的重视程度
///
private int alpha;
/**////
/// 启发式信息的受重视程度
///
private int beta;
/**////
/// 信息素的挥发速度
///
private double lo;
/**////
/// 城市距离矩阵
///
private double[,] City;
/**////
/// 信息素矩阵
///
private double[,] Message;
/**////
/// opneList用于存放下一步可行城市
///
private Queue
/**////
/// closedList用于存放已经访问过的城市
///
private Queue
/**////
/// 储存较好的路径
///
private Queue
/**//////////////////////////////////////////////////////////
///
/// 构造函数:形成城市距离和信息素矩阵
///
/// 城市距离矩阵
/// 信息素的挥发速度 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);
}
}
}
}
/**/////////////////////////////////////////////////////////////
///
/// 改变信息素矩阵,closed_list为较好的路径
///
///
private void Change_Message(Queue
{
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];
}
}
}
}
/**////////////////////////////////////////////////////////////////
///
/// 输入一个链表,计算出其对应的总路径
///
///
///
public double Get_Weight(Queue
{
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]];
}