• 大小: 12KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-07
  • 语言: C/C++
  • 标签: 蚁群算法  

资源简介

基本蚁群算法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


评论

共有 条评论