<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://unfoldingneurons.com/"
	>

<channel>
	<title>朱文昊 Albert Zhu &#187; Cpp 语言</title>
	<atom:link href="http://zhuwenhao.com/category/%e6%8a%80%e6%9c%af/%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e8%af%ad%e8%a8%80/cpp-%e8%af%ad%e8%a8%80/feed/" rel="self" type="application/rss+xml" />
	<link>http://zhuwenhao.com</link>
	<description>朱文昊的中文博客－－专注技术，向往自由</description>
	<lastBuildDate>Wed, 25 Aug 2010 00:53:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>提出一种高精度延迟函数的实现，欢迎交流</title>
		<link>http://zhuwenhao.com/238/%e6%8a%80%e6%9c%af/%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e8%af%ad%e8%a8%80/cpp-%e8%af%ad%e8%a8%80/%e6%8f%90%e5%87%ba%e4%b8%80%e7%a7%8d%e9%ab%98%e7%b2%be%e5%ba%a6%e5%bb%b6%e8%bf%9f%e5%87%bd%e6%95%b0%e7%9a%84%e5%ae%9e%e7%8e%b0%ef%bc%8c%e6%ac%a2%e8%bf%8e%e4%ba%a4%e6%b5%81/</link>
		<comments>http://zhuwenhao.com/238/%e6%8a%80%e6%9c%af/%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e8%af%ad%e8%a8%80/cpp-%e8%af%ad%e8%a8%80/%e6%8f%90%e5%87%ba%e4%b8%80%e7%a7%8d%e9%ab%98%e7%b2%be%e5%ba%a6%e5%bb%b6%e8%bf%9f%e5%87%bd%e6%95%b0%e7%9a%84%e5%ae%9e%e7%8e%b0%ef%bc%8c%e6%ac%a2%e8%bf%8e%e4%ba%a4%e6%b5%81/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 15:02:02 +0000</pubDate>
		<dc:creator>朱文昊 Albert Zhu</dc:creator>
				<category><![CDATA[Cpp 语言]]></category>

		<guid isPermaLink="false">http://zhuwenhao.com/238/%e6%8a%80%e6%9c%af/%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e8%af%ad%e8%a8%80/cpp-%e8%af%ad%e8%a8%80/%e6%8f%90%e5%87%ba%e4%b8%80%e7%a7%8d%e9%ab%98%e7%b2%be%e5%ba%a6%e5%bb%b6%e8%bf%9f%e5%87%bd%e6%95%b0%e7%9a%84%e5%ae%9e%e7%8e%b0%ef%bc%</guid>
		<description><![CDATA[在Windows系统下，需要延迟一定的时间后继续流程，貌似缺乏这种库函数，MFC提供的延迟函数似乎本质精度无法保证。比如Sleep。在下面提出一种方法，请大家斧正。当然先提出一点，有人认为在Windows系统先不可能获得准确定时，或者把系统挂起来延迟等待不符合多线程编程规范。是的，谢谢您的提醒，但这个讨论中大家就不要再重复这样的观点啦。我们的确需要精确定时，即使我把系统完全占用也在所不惜。不就是几十毫秒嘛  

View Code CPP1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// 高精度延迟函数 【开发草稿】 Rev 0.01
/* 注：MSDN中提到的以下问题，本版本程序并未处理！！
On a multiprocessor computer, it should not matter which processor is called. 
However, you can get different results on different processors due to bugs 
in the basic input/output system (BIOS) or the hardware abstraction layer (HAL).
To specify processor affinity for a thread, use the SetThreadAffinityMask function. ]]></description>
			<content:encoded><![CDATA[<p>在Windows系统下，需要延迟一定的时间后继续流程，貌似缺乏这种库函数，MFC提供的延迟函数似乎本质精度无法保证。比如Sleep。在下面提出一种方法，请大家斧正。当然先提出一点，有人认为在Windows系统先不可能获得准确定时，或者把系统挂起来延迟等待不符合多线程编程规范。是的，谢谢您的提醒，但这个讨论中大家就不要再重复这样的观点啦。我们的确需要精确定时，即使我把系统完全占用也在所不惜。不就是几十毫秒嘛 <img src='http://zhuwenhao.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p238code2'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2382"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
</pre></td><td class="code" id="p238code2"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// 高精度延迟函数 【开发草稿】 Rev 0.01</span>
<span style="color: #ff0000; font-style: italic;">/* 注：MSDN中提到的以下问题，本版本程序并未处理！！
On a multiprocessor computer, it should not matter which processor is called. 
However, you can get different results on different processors due to bugs 
in the basic input/output system (BIOS) or the hardware abstraction layer (HAL).
To specify processor affinity for a thread, use the SetThreadAffinityMask function. 
*/</span>
<span style="color: #0000ff;">int</span> DelayPrecision<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> TimeInMilliSecond<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    LARGE_INTEGER Frequency<span style="color: #008080;">;</span>
    LARGE_INTEGER CountBegin<span style="color: #008080;">;</span>
    LARGE_INTEGER CountNow<span style="color: #008080;">;</span>
    LONGLONG DelayCount<span style="color: #008080;">;</span>
    LONGLONG EndCount<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> QueryPerformanceFrequency<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>Frequency<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #666666;">//试算终止计数</span>
        DelayCount <span style="color: #000080;">=</span> Frequency.<span style="color: #007788;">QuadPart</span> <span style="color: #000040;">/</span> <span style="color: #0000dd;">1000</span> <span style="color: #000040;">*</span> TimeInMilliSecond<span style="color: #008080;">;</span>
        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> QueryPerformanceCounter<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>CountBegin<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            EndCount <span style="color: #000080;">=</span> CountBegin.<span style="color: #007788;">QuadPart</span> <span style="color: #000040;">+</span> DelayCount<span style="color: #008080;">;</span>
            <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>EndCount <span style="color: #000080;">&lt;</span> CountBegin.<span style="color: #007788;">QuadPart</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #666666;">//计数器循环回去了</span>
                <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> QueryPerformanceCounter<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>CountNow<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
                    <span style="color: #008000;">&#123;</span>
                        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>CountNow.<span style="color: #007788;">QuadPart</span> <span style="color: #000080;">&lt;</span> CountBegin.<span style="color: #007788;">QuadPart</span> <span style="color: #000040;">&amp;&amp;</span> CountNow.<span style="color: #007788;">QuadPart</span> <span style="color: #000080;">&gt;</span> EndCount<span style="color: #008000;">&#41;</span>
                        <span style="color: #008000;">&#123;</span>
                            <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
                        <span style="color: #008000;">&#125;</span>
                    <span style="color: #008000;">&#125;</span>
                    <span style="color: #0000ff;">else</span>
                    <span style="color: #008000;">&#123;</span>
                        <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                    <span style="color: #008000;">&#125;</span>
                <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #0000ff;">else</span>
            <span style="color: #008000;">&#123;</span>
                <span style="color: #666666;">//一般情况</span>
                <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
                <span style="color: #008000;">&#123;</span>
                    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> QueryPerformanceCounter<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>CountNow<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
                    <span style="color: #008000;">&#123;</span>
                        <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>CountNow.<span style="color: #007788;">QuadPart</span> <span style="color: #000080;">&gt;</span> EndCount<span style="color: #008000;">&#41;</span>
                        <span style="color: #008000;">&#123;</span>
                            <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
                        <span style="color: #008000;">&#125;</span>
                    <span style="color: #008000;">&#125;</span>
                    <span style="color: #0000ff;">else</span>
                    <span style="color: #008000;">&#123;</span>
                        <span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
                    <span style="color: #008000;">&#125;</span>
                <span style="color: #008000;">&#125;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #666666;">//如果无法使用高精度定时器,拿Sleep凑合着用吧.</span>
    Sleep<span style="color: #008000;">&#40;</span>TimeInMilliSecond<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://zhuwenhao.com/238/%e6%8a%80%e6%9c%af/%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e8%af%ad%e8%a8%80/cpp-%e8%af%ad%e8%a8%80/%e6%8f%90%e5%87%ba%e4%b8%80%e7%a7%8d%e9%ab%98%e7%b2%be%e5%ba%a6%e5%bb%b6%e8%bf%9f%e5%87%bd%e6%95%b0%e7%9a%84%e5%ae%9e%e7%8e%b0%ef%bc%8c%e6%ac%a2%e8%bf%8e%e4%ba%a4%e6%b5%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转载]简单蚁群算法的实现</title>
		<link>http://zhuwenhao.com/157/%e6%8a%80%e6%9c%af/%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e8%af%ad%e8%a8%80/cpp-%e8%af%ad%e8%a8%80/%e8%bd%ac%e8%bd%bd%e7%ae%80%e5%8d%95%e8%9a%81%e7%be%a4%e7%ae%97%e6%b3%95%e7%9a%84%e5%ae%9e%e7%8e%b0/</link>
		<comments>http://zhuwenhao.com/157/%e6%8a%80%e6%9c%af/%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e8%af%ad%e8%a8%80/cpp-%e8%af%ad%e8%a8%80/%e8%bd%ac%e8%bd%bd%e7%ae%80%e5%8d%95%e8%9a%81%e7%be%a4%e7%ae%97%e6%b3%95%e7%9a%84%e5%ae%9e%e7%8e%b0/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 04:05:11 +0000</pubDate>
		<dc:creator>朱文昊 Albert Zhu</dc:creator>
				<category><![CDATA[Cpp 语言]]></category>
		<category><![CDATA[计算机科学]]></category>

		<guid isPermaLink="false">http://zhuwenhao.com/157/%e6%8a%80%e6%9c%af/%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e8%af%ad%e8%a8%80/cpp-%e8%af%ad%e8%a8%80/%e8%bd%ac%e8%bd%bd%e7%ae%80%e5%8d%95%e8%9a%81%e7%be%a4%e7%ae%97%e6%b3%95%e7%9a%84%e5%ae%9e%e7%8e%b0/</guid>
		<description><![CDATA[本文转载自http://blog.chinaunix.net/u1/34560/showart_312651.html
一 引言
蚁群算法(ant colony optimization，ACO)，又称蚂蚁算法，是一种用来在图中寻找优化路径的机率型技术。它由Marco Dorigo于1992年在他的博士论文中引入，其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法。初步的研究表明该算法具有许多优良的性质。针对PID控制器参数优化设计问题，将蚁群算法设计的结果与遗传算法设计的结果进行了比较，数值仿真结果表明，蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值。蚁群算法是一种求解组合最优化问题的新型通用启发式方法，该方法具有正反馈、分布式计算和富于建设性的贪婪启发式搜索的特点。正因为蚁群算法有这些优点，很多研究者都在致力研究和改过它，本文的目的正是为了介绍蚁群算法，学习如何编写蚁群算法。
二 蚁群算法的介绍
昆虫世界中，蚂蚁的组成是一种群居的世袭大家庭，我们称之为蚁群。蚂蚁分为世袭制的蚁王（后）和工蚁两种，它们具有高度组织的社会性，彼此沟通不仅可以借助触觉和视觉的联系，在大规模的协调行动中还可以借助外激素（有些书称信息素）之类的信息介质。
首先我们要理解蚂蚁是如何觅食的，蚂蚁平时在巢穴附近作无规则行走，一量发现食物并不立即进食而是将之搬回蚁穴与其它蚂蚁分享，在食物小时则独自搬回蚁穴，否则就回蚁穴搬兵，一路上会留下外激素，食物越大外激素的浓度就越大，越能吸引其它的蚂蚁过去一起搬去食物，这样最终就能将食物全部搬回蚁穴。这个过程用程序实现看似非常复杂，要编写一个“智能”的蚂蚁也看似不太可能，事实上每个蚂蚁只做了非常简单的工作：检查某个范围内有无食物，并逐渐向外激素浓的方向运动。简而言之，蚁群运动无非是同时反复执行多个简单规则而已。下面详细说明蚁群中的这些简单规则：
1、范围：蚂蚁观察到的范围是一个方格世界，蚂蚁有一个参数为速度半径（一般是3），那么它能观察到的范围就是3*3个方格世界，并且能移动的距离也在这个范围之内。
2、环境：蚂蚁所在的环境是一个虚拟的世界，其中有障碍物，有别的蚂蚁，还有外激素，外激素有两种，一种是找到食物的蚂蚁洒下的食物外激素，一种是找到窝的蚂蚁洒下的窝的外激素。每个蚂蚁都仅仅能感知它范围内的环境信息。环境以一定的速率让外激素消失。
3、觅食规则：在每只蚂蚁能感知的范围内寻找是否有食物，如果有就直接过去。否则看是否有外激素，并且比较在能感知的范围内哪一点的外激素最多，这样，它就朝外激素多的地方走，并且每只蚂蚁多会以小概率犯错误，从而并不是往外激素最多的点移动。蚂蚁找窝的规则和上面一样，只不过它对窝的外激素做出反应，而对食物外激素没反应。
4、移动规则： 每只蚂蚁都朝向外激素最多的方向移，并且，当周围没有外激素指引的时候，蚂蚁会按照自己原来运动的方向惯性的运动下去，并且，在运动的方向有一个随机的小的扰动。为了防止蚂蚁原地转圈，它会记住最近刚走过了哪些点，如果发现要走的下一点已经在最近走过了，它就会尽量避开。
5、避障规则：如果蚂蚁要移动的方向有障碍物挡住，它会随机的选择另一个方向，并且有外激素指引的话，它会按照觅食的规则行为。
7、播撒外激素规则：每只蚂蚁在刚找到食物或者窝的时候撒发的外激素最多，并随着它走远的距离，播撒的外激素越来越少。
根据这几条规则，蚂蚁之间并没有直接的关系，但是每只蚂蚁都和环境发生交互，而通过外激素这个纽带，实际上把各个蚂蚁之间关联起来了。比如，当一只蚂蚁找到了食物，它并没有直接告诉其它蚂蚁这儿有食物，而是向环境播撒外激素，当其它的蚂蚁经过它附近的时候，就会感觉到外激素的存在，进而根据外激素的指引找到了食物。成功的觅食算法正是最小化搜索食物的时间。
三 蚁群算法的实现
理解蚁群算法的实质之后写出一个简单蚁群算法也不是太困难，关键是实现以上介绍的几个规则，下面用JAVA简单讲述一下以上规则的实现。
1、蚂蚁：蚂蚁是蚁群中最小的单位，是所以简单规则应用的最小个体。
&#160;

View Code CPP1
2
3
4
5
6
7
8
9
10
11
12
public class Ant
&#123;
    public Square SQUARE;           //蚂蚁所在方格
    public Food CARRYING = null;    //所搬的食物数
    public int ID;         ]]></description>
			<content:encoded><![CDATA[<p>本文转载自<a title="http://blog.chinaunix.net/u1/34560/showart_312651.html" href="http://blog.chinaunix.net/u1/34560/showart_312651.html">http://blog.chinaunix.net/u1/34560/showart_312651.html</a></p>
<p><b>一 </b><b>引言</b></p>
<p>蚁群算法(ant colony optimization，ACO)，又称蚂蚁算法，是一种用来在图中寻找优化路径的机率型技术。它由Marco Dorigo于1992年在他的博士论文中引入，其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法。初步的研究表明该算法具有许多优良的性质。针对PID控制器参数优化设计问题，将蚁群算法设计的结果与遗传算法设计的结果进行了比较，数值仿真结果表明，蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值。蚁群算法是一种求解组合最优化问题的新型通用启发式方法，该方法具有正反馈、分布式计算和富于建设性的贪婪启发式搜索的特点。正因为蚁群算法有这些优点，很多研究者都在致力研究和改过它，本文的目的正是为了介绍蚁群算法，学习如何编写蚁群算法。</p>
<p><b>二 </b><b>蚁群算法的介绍</b></p>
<p>昆虫世界中，蚂蚁的组成是一种群居的世袭大家庭，我们称之为蚁群。蚂蚁分为世袭制的蚁王（后）和工蚁两种，它们具有高度组织的社会性，彼此沟通不仅可以借助触觉和视觉的联系，在大规模的协调行动中还可以借助外激素（有些书称信息素）之类的信息介质。</p>
<p>首先我们要理解蚂蚁是如何觅食的，蚂蚁平时在巢穴附近作无规则行走，一量发现食物并不立即进食而是将之搬回蚁穴与其它蚂蚁分享，在食物小时则独自搬回蚁穴，否则就回蚁穴搬兵，一路上会留下外激素，食物越大外激素的浓度就越大，越能吸引其它的蚂蚁过去一起搬去食物，这样最终就能将食物全部搬回蚁穴。这个过程用程序实现看似非常复杂，要编写一个“智能”的蚂蚁也看似不太可能，事实上每个蚂蚁只做了非常简单的工作：检查某个范围内有无食物，并逐渐向外激素浓的方向运动。简而言之，蚁群运动无非是同时反复执行多个简单规则而已。下面详细说明蚁群中的这些简单规则：</p>
<p>1、范围：蚂蚁观察到的范围是一个方格世界，蚂蚁有一个参数为速度半径（一般是3），那么它能观察到的范围就是3*3个方格世界，并且能移动的距离也在这个范围之内。</p>
<p>2、环境：蚂蚁所在的环境是一个虚拟的世界，其中有障碍物，有别的蚂蚁，还有外激素，外激素有两种，一种是找到食物的蚂蚁洒下的食物外激素，一种是找到窝的蚂蚁洒下的窝的外激素。每个蚂蚁都仅仅能感知它范围内的环境信息。环境以一定的速率让外激素消失。</p>
<p>3、觅食规则：在每只蚂蚁能感知的范围内寻找是否有食物，如果有就直接过去。否则看是否有外激素，并且比较在能感知的范围内哪一点的外激素最多，这样，它就朝外激素多的地方走，并且每只蚂蚁多会以小概率犯错误，从而并不是往外激素最多的点移动。蚂蚁找窝的规则和上面一样，只不过它对窝的外激素做出反应，而对食物外激素没反应。</p>
<p>4、移动规则： 每只蚂蚁都朝向外激素最多的方向移，并且，当周围没有外激素指引的时候，蚂蚁会按照自己原来运动的方向惯性的运动下去，并且，在运动的方向有一个随机的小的扰动。为了防止蚂蚁原地转圈，它会记住最近刚走过了哪些点，如果发现要走的下一点已经在最近走过了，它就会尽量避开。</p>
<p>5、避障规则：如果蚂蚁要移动的方向有障碍物挡住，它会随机的选择另一个方向，并且有外激素指引的话，它会按照觅食的规则行为。</p>
<p>7、播撒外激素规则：每只蚂蚁在刚找到食物或者窝的时候撒发的外激素最多，并随着它走远的距离，播撒的外激素越来越少。</p>
<p>根据这几条规则，蚂蚁之间并没有直接的关系，但是每只蚂蚁都和环境发生交互，而通过外激素这个纽带，实际上把各个蚂蚁之间关联起来了。比如，当一只蚂蚁找到了食物，它并没有直接告诉其它蚂蚁这儿有食物，而是向环境播撒外激素，当其它的蚂蚁经过它附近的时候，就会感觉到外激素的存在，进而根据外激素的指引找到了食物。成功的觅食算法正是最小化搜索食物的时间。</p>
<p><b>三 </b><b>蚁群算法的实现</b></p>
<p>理解蚁群算法的实质之后写出一个简单蚁群算法也不是太困难，关键是实现以上介绍的几个规则，下面用JAVA简单讲述一下以上规则的实现。</p>
<p>1、蚂蚁：蚂蚁是蚁群中最小的单位，是所以简单规则应用的最小个体。</p>
<p>&#160;</p>
<p>
<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p157code9'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p1579"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p157code9"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> Ant
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">public</span> Square SQUARE<span style="color: #008080;">;</span>           <span style="color: #666666;">//蚂蚁所在方格</span>
    <span style="color: #0000ff;">public</span> Food CARRYING <span style="color: #000080;">=</span> null<span style="color: #008080;">;</span>    <span style="color: #666666;">//所搬的食物数</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> ID<span style="color: #008080;">;</span>                  <span style="color: #666666;">//蚂蚁的编号</span>
    <span style="color: #0000ff;">public</span> boolean HELPING <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span> <span style="color: #666666;">//是否帮忙搬运食物</span>
&nbsp;
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> move<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> turn<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">//蚂蚁移动到下一个方格</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p>2、范围：蚂蚁所在的方格应该包含附近的方格编号，所含食物数量，蚂蚁数量，外激素的浓度，以及坐标等信息。</p>
<p>
<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p157code10'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15710"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code" id="p157code10"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> Square
<span style="color: #008000;">&#123;</span> <span style="color: #0000ff;">public</span> Square NE<span style="color: #008080;">;</span>            <span style="color: #666666;">//附近的8个方向的方格</span>
&nbsp;
     <span style="color: #0000ff;">public</span> Square N<span style="color: #008080;">;</span>
     <span style="color: #0000ff;">public</span> Square NW<span style="color: #008080;">;</span>
     <span style="color: #0000ff;">public</span> Square W<span style="color: #008080;">;</span>
     <span style="color: #0000ff;">public</span> Square SW<span style="color: #008080;">;</span>
     <span style="color: #0000ff;">public</span> Square S<span style="color: #008080;">;</span>
     <span style="color: #0000ff;">public</span> Square SE<span style="color: #008080;">;</span>
     <span style="color: #0000ff;">public</span> Square E<span style="color: #008080;">;</span>
     <span style="color: #0000ff;">public</span> LinkedList ANTS<span style="color: #008080;">;</span>        <span style="color: #666666;">//本方格中包含的蚂蚁</span>
     <span style="color: #0000ff;">public</span> Food FOOD<span style="color: #008080;">;</span>            <span style="color: #666666;">//本方格中包含的食物数</span>
     <span style="color: #0000ff;">public</span> Nest NEST<span style="color: #008080;">;</span>                <span style="color: #666666;">//方格为蚁穴</span>
     <span style="color: #0000ff;">public</span> Pheromone_1 PHEROMONE_1<span style="color: #008080;">;</span>            <span style="color: #666666;">//本方格中的外激素含量</span>
     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> X<span style="color: #008080;">;</span>            <span style="color: #666666;">//本方格的坐标</span>
     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> Y<span style="color: #008080;">;</span>
     <span style="color: #0000ff;">private</span> World WORLD<span style="color: #008080;">;</span>            <span style="color: #666666;">//所属的环境</span>
     <span style="color: #0000ff;">public</span> boolean WALL<span style="color: #008080;">;</span>            <span style="color: #666666;">//是否有障碍物</span>
&nbsp;
    <span style="color: #0000ff;">public</span> Square<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> x, <span style="color: #0000ff;">int</span> y, World world<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        FOOD <span style="color: #000080;">=</span> null<span style="color: #008080;">;</span>
        NEST <span style="color: #000080;">=</span> null<span style="color: #008080;">;</span>
        PHEROMONE_1 <span style="color: #000080;">=</span> null<span style="color: #008080;">;</span>
        X <span style="color: #000080;">=</span> x<span style="color: #008080;">;</span>
        Y <span style="color: #000080;">=</span> y<span style="color: #008080;">;</span>
        WORLD <span style="color: #000080;">=</span> world<span style="color: #008080;">;</span>
        WALL <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
        ANTS <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> LinkedList<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p>3、环境：环境是由多个方格组成的，是一个平面的，因此用一个方格的二维数组来表示是最合适不过的。</p>
<p>
<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p157code11'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15711"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p157code11"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> World
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">private</span> Square<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> WORLD<span style="color: #008080;">;</span>        <span style="color: #666666;">//定义环境二维数组</span>
    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span> WIDTH<span style="color: #008080;">;</span>                <span style="color: #666666;">//环境的长宽</span>
    <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">int</span> HEIGHT<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">private</span> Pheromone_1List P1LIST<span style="color: #008080;">;</span>        <span style="color: #666666;">//保存所有外激素的列表</span>
&nbsp;
    <span style="color: #0000ff;">public</span> World<span style="color: #008000;">&#40;</span>Pheromone_1List p1list<span style="color: #008000;">&#41;</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">this</span>.<span style="color: #007788;">WIDTH</span> <span style="color: #000080;">=</span> Settings.<span style="color: #007788;">WIDTH</span><span style="color: #008080;">;</span>
        <span style="color: #0000dd;">this</span>.<span style="color: #007788;">HEIGHT</span> <span style="color: #000080;">=</span> Settings.<span style="color: #007788;">HEIGHT</span><span style="color: #008080;">;</span>
        <span style="color: #0000dd;">this</span>.<span style="color: #007788;">P1LIST</span> <span style="color: #000080;">=</span> p1list<span style="color: #008080;">;</span>
        WORLD <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> Square<span style="color: #008000;">&#91;</span>WIDTH<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>HEIGHT<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p>&#160;&#160;&#160;&#160; 4、觅食规则，移动规则和避障规则：这三种规则全都跟蚂蚁的移动方向有关，并在移动前都要先计算周围方格的外激素浓度，选择外激素浓度最高的方格方向移动。</p>
<p>
<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p157code12'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15712"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code" id="p157code12"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">private</span> Square chooseBestSquare<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
     Square<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> square_list <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span>SQUARE.<span style="color: #007788;">E</span>, SQUARE.<span style="color: #007788;">NE</span>, SQUARE.<span style="color: #007788;">N</span>, SQUARE.<span style="color: #007788;">NW</span>, SQUARE.<span style="color: #007788;">W</span>, SQUARE.<span style="color: #007788;">SW</span>, SQUARE.<span style="color: #007788;">S</span>, SQUARE.<span style="color: #007788;">SE</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">double</span> current_best_value <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
        <span style="color: #0000ff;">double</span> value <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
        Square square <span style="color: #000080;">=</span> SQUARE<span style="color: #008080;">;</span>
        <span style="color: #666666;">// 选择最好的方格</span>
&nbsp;
        <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>square_list.<span style="color: #007788;">length</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            value <span style="color: #000080;">=</span> calculateSquareValue<span style="color: #008000;">&#40;</span>square_list<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">//计算方格值</span>
            <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>value <span style="color: #000080;">&gt;</span> current_best_value<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                current_best_value <span style="color: #000080;">=</span> value<span style="color: #008080;">;</span>
                square <span style="color: #000080;">=</span> square_list<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
            <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>square.<span style="color: #007788;">ANTS</span>.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;=</span> Settings.<span style="color: #007788;">MAXIMUM_NUMBER_OF_ANTS</span><span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
          <span style="color: #0000ff;">return</span> SQUARE<span style="color: #008080;">;</span>
        <span style="color: #008000;">&#125;</span>
        <span style="color: #0000ff;">return</span> square<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p>
<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p157code13'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15713"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p157code13"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">double</span> calculateSquareValue<span style="color: #008000;">&#40;</span>Square s<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">double</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> thresholds <span style="color: #000080;">=</span> Settings.<span style="color: #007788;">THRESHOLDS</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>s<span style="color: #000080;">==</span>null <span style="color: #000040;">||</span> s.<span style="color: #007788;">WALL</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">// 方格有障碍物</span>
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">100000</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #666666;">// 计算方格中各项参数的值</span>
    <span style="color: #0000ff;">return</span> s.<span style="color: #007788;">getFood</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span>thresholds<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span>        <span style="color: #666666;">// 食物</span>
    <span style="color: #000040;">+</span> s.<span style="color: #007788;">getPheromone_1</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> thresholds<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span>    <span style="color: #666666;">// 外激素</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p>5、播撒外激素规则：每只蚂蚁找到食物后会根据食物的数量播撒相应量的外激素，以便其它蚂蚁能够更快得找到这堆食物。</p>
<p>
<div class="wp_codebox_msgheader"><span class="right"></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p157code14'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15714"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p157code14"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> putPheromone_1<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span> amount<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>SQUARE.<span style="color: #007788;">getPheromone_1</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;</span> Settings.<span style="color: #007788;">PHEROMONE_LIMIT</span><span style="color: #008000;">&#41;</span>
     SQUARE.<span style="color: #007788;">addPheromone_1</span><span style="color: #008000;">&#40;</span>amount<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</p>
<p>从以上蚁群算法中各个要素的代码来看，实现蚁群算法并不难。每只蚂蚁并不是像我们想象的需要知道整个环境的信息，它们只关心很小范围内的眼前信息，而且根据这些局部信息利用几条简单的规则进行决策，这样，在蚁群这个集体里，复杂性的行为就会凸现出来。这就是人工生命、复杂性科学解释的规律。</p>
<p><b>四 </b><b>蚁群算法的不足</b></p>
<p>本文实现的蚁群算法只是简单的大致模拟蚁群的觅食过程，真正的蚂蚁觅食过程远比这个复杂，比如增加蚂蚁搬运食物的距离和数量，蚂蚁在搬运食物发现更大的食物可能会丢弃原有食物，还可以增加蚂蚁搬运食物回蚁穴的最短路径的求解。同时需要注意的是，由于蚁群算法觅食的过程，蚁群算法可能会过早的收敛并陷入局部最优解。</p>
]]></content:encoded>
			<wfw:commentRss>http://zhuwenhao.com/157/%e6%8a%80%e6%9c%af/%e7%a8%8b%e5%ba%8f%e8%ae%be%e8%ae%a1%e8%af%ad%e8%a8%80/cpp-%e8%af%ad%e8%a8%80/%e8%bd%ac%e8%bd%bd%e7%ae%80%e5%8d%95%e8%9a%81%e7%be%a4%e7%ae%97%e6%b3%95%e7%9a%84%e5%ae%9e%e7%8e%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
