复杂系统简介
家庭作业1，高级
这是一个视频教程
讲解家庭作业高级解法
请打开Netlogo模型
名为multipleants（多个蚂蚁）
在网站的课程材料版块
打开程序以后
界面应该是这样的
在前两个家庭作业版块中
我们已经做了一些改编
并且还没有还原
所以首先我要改变蚂蚁颜色
使其一直为红色
现在我们来去掉这两行代码
为了让代码更清晰
回到主界面
现在家庭作业让我们
在找到食物的蚂蚁走过的地方
建立信息素轨迹
以便其他蚂蚁跟随
以便来检验这种策略是否更快
那么，来到代码界面
首先，建立一个碎片（patch）变量
命名为pheromone（信息素），在这里写入代码
之后，往下滑来到装载部分
我们需要装载这些碎片
不仅要建立一个巢穴，还要有信息素
现在来改写装载巢穴
为了装载这些碎片
我们来让这些碎片初始化信息素为0
设置信息素为0，然后检查一下
下面，我们来让吃过食物
返回巢穴的蚂蚁
沿途留下信息素
并让其他蚂蚁跟随
这条信息素轨迹
向下滑
找到回到巢穴的程序
我们来添加一行代码，来设置碎片的信息素水平
那么，来设置为当前信息素水平+1
为了使
每个碎片的信息素水平可视化
我将设置碎片标签plabel
来表示信息素数值
你也可以用一个不同的颜色
但我觉得
使用数字标签更有趣
那么，来检查一下
看看是否管用
看起来蚂蚁在收集食物
到巢穴
并且铺下一条信息素路线
增加此路线蚂蚁数量
现在我们来让信息素
随时间蒸发
回到代码
在go程序中添加一行
我们把它命名为蒸发信息素
下面来编写这个程序
我们可以让信息素有一个蒸发率
概率在0到1之间
让我们来装载一个临时变量
命名为x
x是一个0到1之间的随机小数
所以应为随机浮点数 1
然后找到信息素水平大于0的碎片
也就是任何拥有信息素的碎片
如果x小于我们设定的蒸发率
也就是
我们在装载界面设置的滚动条上的值
我们称之为滚动条
也就是蒸发率
之后我们将把信息素水平为当前水平 - 1
我们最好可以看出这一变化
所以需要把plabel设置为新的数值
然后我们徐要添加刚才提到的滚动条
方法是来到主界面
来到这个按钮，选择滚动条（slider）
我们在这儿添加它
然后调用它，作为蒸发率
它将是一个0到1之间的小数
我们设置增量为0.01
让我们把初始值设置为0.1
我漏掉了一个“e”。点击OK
我想把这个滚动条移动到
这个滚动条的下面
所以我要向下移动这个作图窗口
与世界视野对齐
这样看起来好些
然后移动这个滚动条
调整为与其他滚动条同宽
现在来检查一下
回到主界面，运行
这些信息素水平应该下降
看起来的确是的
那么好，最后的问题是
让其他蚂蚁跟随信息素轨迹
所以接下来实现这一功能
另外，在主界面
选择不同窗口的方法是
用鼠标点击一块开放区域
然后拖动按钮或者滚动条
你也可以在选择按钮之后，用鼠标右键点击
然后用另一种方法编辑它
现在，来到代码界面
我们来改变蚂蚁移动的方式
让我们来到寻找食物（look for food）部分
然后在此添加一些代码
我们将在此之下添加一些新的变量
为了寻找食物，我们可以说
让前方的信息素以0角度发送
以及让右侧的信息素以45°角发送
以及让左侧的信息素以-45°角发送
这个代码
和NetLogo中的ant（蚂蚁）模型很相似
所以基本上
我们在让每个蚂蚁向前看
并稍微向右或者向左偏
来决定附近是否有信息素
以及是否有信息素来跟随
如果没有则做随机行走
这后半部分代码将保持不变
之后我们将编写一系列 if-else （如果-或是）语句
if else 前括号
如果右侧的信息素大于前方的信息素
或者如果左侧的信息素大于前方
结束括号
或者如果右侧的信息素
大于左侧
我门将向右侧45°前进，如过不是向左侧45°前进
如果任意一个条件都不满足
那就是只有前方有信息素
或者周围都没有信息素
所以，如果前方信息素为0
那么就运行之后的代码
我们将需要一个前中括号和一个后中括号
来检查一下，它告诉我们
没有名为sent-at-angle（发送角度）的变量
的确，我们还没有装载这个部分
下面向下滑动
直到代码的末尾
我们要加入一个报告器（reporter）
来报告sent-at-angle（发送角度）然后输入一个角度
让p作为右侧前方的碎片
这些是嵌入Netlogo的原始量
要知道原始量的意思
你可以选中它然后右键点击
然后走到快速帮助（Quick Help）
这会给原始量一个简介
所以，右侧前方
我们将使用我们已经输入的角度
以及前方的距离，也就是1
如果p不等于任何一个，即没有信息素
所以报告0，或者（有信息素）
报告当前的信息素值
报告p的信息素，应该是这样的
来检查一下
少加了一个后中括号
所以我们有一个错误信息
看来我这里忘加了一个后中括号
我还注意到
这几行有一些漏加的中括号
我现在加上，抱歉
现在检查一下
看起来一切正常
回到主界面
看起来行为很棒
我们可以分析这个再多一些
对这个原理做更好的陈述
但是我将把这个任务留给你
我的确注意到很多蚂蚁
在世界的边缘收集食物
我们可以修改这个
通过点击设置
“world wraps horizontally” （世界水平分布）和
“world warps vertically”（世界垂直分布）点击OK
现在看起来
蚂蚁很快吃掉所有食物
大约73块，在之前的模型
即加入信息素之前
我们有128块
所以，这就是家庭作业1教学视频
我希望你喜欢
我希望下次还能和你讨论