资源简介
基本蚁群算法C,比较详细!
代码片段和文件信息
using System;
using System.Collections.Generic;
using System.Text;
namespace ant_C
{
class CAnt
{
public int[] m_nPath; //蚂蚁走的路径
int[] m_nAllowedCity;//没去过的城市
int m_nCurCityNo; //当前所在城市编号
int m_nMovedCityCount; //已经去过的城市数量
public double m_dbPathLength; //蚂蚁走过的路径长度
public CAnt()
{
m_nPath=new int[Common.N_CITY_COUNT];
m_nAllowedCity=new int[Common.N_CITY_COUNT]; //没去过的城市
}
//初始化函数,蚂蚁搜索前调用
public void Init()
{
for (int i = 0; i < Common.N_CITY_COUNT; i++)
{
m_nAllowedCity[i]=1; //设置全部城市为没有去过
m_nPath[i]=0; //蚂蚁走的路径全部设置为0
}
//蚂蚁走过的路径长度设置为0
m_dbPathLength=0.0;
//随机选择一个出发城市
m_nCurCityNo = Common.rnd(0 Common.N_CITY_COUNT);
//把出发城市保存入路径数组中
m_nPath[0]=m_nCurCityNo;
//标识出发城市为已经去过了
m_nAllowedCity[m_nCurCityNo]=0;
//已经去过的城市数量设置为1
m_nMovedCityCount=1;
}
//选择下一个城市
//返回值 为城市编号
public int ChooseNextCity()
{
int nSelectedCity=-1; //返回结果,先暂时把其设置为-1
//==============================================================================
//计算当前城市和没去过的城市之间的信息素总和
double dbTotal=0.0;
double[] prob=new double[Common.N_CITY_COUNT]; //保存各个城市被选中的概率
for (int i=0;i {
if (m_nAllowedCity[i] == 1) //城市没去过
{
prob[i] = System.Math.Pow(Common.g_Trial[m_nCurCityNoi] Common.ALPHA) * System.Math.Pow(1.0 / Common.g_Distance[m_nCurCityNoi] Common.BETA); //该城市和当前城市间的信息素
dbTotal=dbTotal+prob[i]; //累加信息素,得到总和
}
else //如果城市去过了,则其被选中的概率值为0
{
prob[i]=0.0;
}
}
//==============================================================================
//进行轮盘选择
double dbTemp=0.0;
if (dbTotal > 0.0) //总的信息素值大于0
{
dbTemp=Common.rnd(0.0dbTotal); //取一个随机数
for (int i=0;i {
if (m_nAllowedCity[i] == 1) //城市没去过
{
dbTemp=dbTemp-prob[i]; //这个操作相当于转动轮盘,如果对轮盘选择不熟悉,仔细考虑一下
if (dbTemp < 0.0) //轮盘停止转动,记下城市编号,直接跳出循环
{
nSelectedCity=i;
break;
}
}
}
}
//==============================================================================
//如果城市间的信息素非常小 ( 小到比double能够表示的最小的数字还要小 )
//那么由于浮点运算的误差原因,上面计算的概率总和可能为0
//会出现经过上述操作,没有城市被选择出来
//出现这种情况,就把第一个没去过的城市作为返回结果
//题外话:刚开始看的时候,下面这段代码困惑了我很长时间,想不通为何要有这段代码,后来才搞清楚。
if (nSelectedCity == -1)
{
for (int i = 0; i < Common.N_CITY_COUNT; i++)
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 5710 2011-06-15 16:11 ant_C#\ant_C\ant.cs
文件 2044 2011-06-15 16:35 ant_C#\ant_C\ant_C.csproj
文件 704 2011-06-15 16:35 ant_C#\ant_C\AO.cs
文件 5632 2005-11-11 22:25 ant_C#\ant_C\bin\Release\ant_C.vshost.exe
文件 2419 2011-06-15 16:35 ant_C#\ant_C\Common.cs
文件 1181 2011-06-11 10:04 ant_C#\ant_C\Properties\AssemblyInfo.cs
文件 5029 2011-06-15 16:56 ant_C#\ant_C\tsp.cs
文件 398 2011-06-11 11:23 ant_C#\ant_C\ve-42C.tmp
文件 904 2011-06-11 10:04 ant_C#\ant_C.sln
..A..H. 13312 2011-06-15 17:00 ant_C#\ant_C.suo
目录 0 2011-06-15 17:00 ant_C#\ant_C\obj\Debug\TempPE
目录 0 2011-06-15 17:00 ant_C#\ant_C\obj\Release\TempPE
目录 0 2011-06-15 17:00 ant_C#\ant_C\bin\Debug
目录 0 2011-06-15 17:00 ant_C#\ant_C\bin\Release
目录 0 2011-06-15 17:00 ant_C#\ant_C\obj\Debug
目录 0 2011-06-15 17:00 ant_C#\ant_C\obj\Release
目录 0 2011-06-15 17:00 ant_C#\ant_C\bin
目录 0 2011-06-15 17:00 ant_C#\ant_C\obj
目录 0 2011-06-11 10:04 ant_C#\ant_C\Properties
目录 0 2011-06-15 17:00 ant_C#\ant_C
目录 0 2011-06-11 10:04 ant_C#
----------- --------- ---------- ----- ----
37333 21
- 上一篇:c语言编写的一个基于mysql简单数据管理系统
- 下一篇:c++操作系统进程管理模拟
评论
共有 条评论