NetLogo用户手册 Net Logo Manual Chinese
User Manual:
Open the PDF directly: View PDF .
Page Count: 375
Download | |
Open PDF In Browser | View PDF |
NetLogo 4.0.2 用户手册 (简体中文版) 翻译:张发 Richter2000@163.com 审校:王军 2008 年 10 月 16 日 NetLogo 4.0.2 用户手册 目 录 译者说明...........................................................................................................................................1 我为什么要翻译NetLogo用户手册?.....................................................................................1 读者的法律责任.......................................................................................................................1 联系方式...................................................................................................................................1 致谢...........................................................................................................................................1 词汇对照表.......................................................................................................................................2 NetLogo简介(What is NetLogo?) ...............................................................................................3 产品特性...................................................................................................................................3 版权信息...........................................................................................................................................5 Copyright Information ......................................................................................................................6 第三方许可证(Third party licenses) ...................................................................................6 更新历史(What’s New?) ...........................................................................................................13 4.0.2 版 (2007 年 12 月) ........................................................................................................13 4.0 版 (2007 年 9 月) .............................................................................................................13 3.1.5 版 (2007 年 12 月) ........................................................................................................18 3.1 版 ( 2006 年 4 月) ............................................................................................................18 3.0 版 (2005 年 9 月) .............................................................................................................18 2.1 版 ( 2004 年 12 月) ..........................................................................................................19 2.0.2 版( 2004 年 8 月) ..........................................................................................................19 2.0 版( 2003 年 12 月) ...........................................................................................................19 1.3 版 ( 2003 年 6 月) ............................................................................................................19 1.2 版 ( 2003 年 3 月) ............................................................................................................20 1.1 版 ( 2002 年 7 月) ............................................................................................................20 1.0 版( 2002 年 4 月) .............................................................................................................20 系统需求(System Requirements)..............................................................................................21 系统需求:应用程序.............................................................................................................21 系统需求:保存Applets ........................................................................................................21 系统需求:3 维视图..............................................................................................................21 已知问题(Known Issues) ..........................................................................................................23 已知bug (所有系统) ...............................................................................................................23 Windows上的 bug .................................................................................................................23 Macintosh上的bug..................................................................................................................24 Linux/UNIX上的 bug ............................................................................................................24 计算机HubNet的已知问题 ....................................................................................................24 联系我们(Contacting Us)..........................................................................................................25 网站.........................................................................................................................................25 反馈、问题等.........................................................................................................................25 报告Bug..................................................................................................................................25 模型实例:聚会(Sample Model:Party)....................................................................................26 聚会.........................................................................................................................................26 挑战.........................................................................................................................................28 用模型思考.............................................................................................................................28 一 NetLogo 4.0.2 用户手册 下一步?.................................................................................................................................28 教学# 1:模型(Tutorial #1 :Models) ........................................................................................30 模型实例:狼吃羊( Wolf Sheep Predation)....................................................................30 控制模型:按钮.....................................................................................................................31 控制速度:速度滑动条.........................................................................................................31 调整设置:滑动条和开关.....................................................................................................32 收集信息:绘图和监视器.....................................................................................................34 控制视图.................................................................................................................................34 模型库.....................................................................................................................................38 下一步?...................................................................................................................................39 教学# 2: 命令(Tutorial #2:Commands)....................................................................................40 模型实例: 基本交通模型(Traffic Basic) ..............................................................................40 命令中心(The Command Center) .....................................................................................40 操纵颜色.................................................................................................................................43 主体监视器(Agent Monitors)和主体命令器(Agent Commanders)............................44 下一步?...................................................................................................................................47 教学 #3: 例程(Tutorial #3:Procedures) ...................................................................................48 主体和例程.............................................................................................................................48 制作setup 按钮 ......................................................................................................................48 制作go 按钮...........................................................................................................................50 试试命令.................................................................................................................................52 瓦片和变量.............................................................................................................................52 海龟变量.................................................................................................................................54 监视器(Monitors) ..............................................................................................................56 开关和标签(Switches and labels) .....................................................................................58 更多例程.................................................................................................................................60 画图(Plotting) ....................................................................................................................62 时钟计数器(Tick counter).................................................................................................64 更多细节.................................................................................................................................65 下一步?...................................................................................................................................66 附录:完整代码.....................................................................................................................67 界面指南(Interface Guide)........................................................................................................70 菜单.........................................................................................................................................70 标签页.....................................................................................................................................72 界面页.....................................................................................................................................73 信息页.....................................................................................................................................81 例程页.....................................................................................................................................83 Includes 菜单 .........................................................................................................................84 编程指南(Programming Guide) ................................................................................................86 主体(Agents)...........................................................................................................................86 例程(Procedures) ....................................................................................................................87 变量(Variables) .......................................................................................................................89 颜色(Colors) ...........................................................................................................................90 请求(Ask) ...............................................................................................................................92 二 NetLogo 4.0.2 用户手册 主体集合(Agentsets) ..............................................................................................................94 种类(Breeds)...........................................................................................................................96 按钮(Buttons) .........................................................................................................................98 列表(Lists ).......................................................................................................................99 数学(Math) ......................................................................................................................103 随机数(Random Numbers)..............................................................................................105 海龟图形(Turtle shapes ) ...............................................................................................106 链图形(Link Shapes).......................................................................................................106 时钟计数器(Tick Counter )............................................................................................106 视图更新(View Updates) ................................................................................................107 绘图(Plotting) ..................................................................................................................109 字符串(Strings) ...............................................................................................................112 输出(Output)....................................................................................................................113 文件输入输出(File I/O) ..................................................................................................113 电影(Movies)...................................................................................................................115 视角(Perspective) ............................................................................................................116 绘画(Drawing).................................................................................................................116 拓扑(Topology) ...............................................................................................................117 链(Links) .........................................................................................................................121 并发请求(Ask-Concurrent) .............................................................................................123 捆绑(Tie) .........................................................................................................................125 多个源文件(Multiple source files)..................................................................................125 语法(Syntax)....................................................................................................................125 迁移指南(Transition Guide)....................................................................................................129 从NetLogo 3.1 迁移 .............................................................................................................129 从NetLogo 3.0 迁移 .............................................................................................................136 NetLogo词典(NetLogo Dictionary) ........................................................................................138 分类(Categories)..............................................................................................................138 内建变量(Built-In Variables) ..........................................................................................141 关键词(Keywords) ..........................................................................................................142 常量(Constants)...............................................................................................................142 A............................................................................................................................................143 B............................................................................................................................................148 C............................................................................................................................................152 D............................................................................................................................................160 E ............................................................................................................................................164 F ............................................................................................................................................168 G............................................................................................................................................177 H............................................................................................................................................177 I .............................................................................................................................................183 J .............................................................................................................................................191 L ............................................................................................................................................191 M ...........................................................................................................................................201 N............................................................................................................................................212 三 NetLogo 4.0.2 用户手册 O............................................................................................................................................216 P ............................................................................................................................................220 R............................................................................................................................................229 S ............................................................................................................................................239 T ............................................................................................................................................251 U............................................................................................................................................258 V............................................................................................................................................262 W...........................................................................................................................................262 X............................................................................................................................................267 Y............................................................................................................................................268 ?.............................................................................................................................................268 Java小程序(Applets) ...............................................................................................................269 制作和显示Applets ..............................................................................................................269 Java需求 ...............................................................................................................................269 扩展.......................................................................................................................................270 已知问题...............................................................................................................................270 图形编辑器指南(Shapes Editor Guide)..................................................................................271 开始.......................................................................................................................................271 创建和编辑海龟图形...........................................................................................................274 创建和编辑链图形...............................................................................................................276 在模型里使用图形...............................................................................................................277 行为空间指南(BehaviorSpace Guide)....................................................................................278 什么是BehaviorSpace?.........................................................................................................278 怎样使用...............................................................................................................................279 高级用法...............................................................................................................................282 结论.......................................................................................................................................284 系统动力学指南(System Dynamics Guide) ...........................................................................285 NetLogo系统动力学建模工具是什么?...............................................................................285 怎样使用...............................................................................................................................286 教学:狼吃羊(Wolf-Sheep Predation).................................................................................289 结论.......................................................................................................................................295 HubNet指南(HubNet Guide)...................................................................................................296 理解HubNet ..........................................................................................................................296 计算机HubNet ......................................................................................................................297 计算器HubNet ......................................................................................................................300 教师研讨会...........................................................................................................................300 HubNet 编程指南 ................................................................................................................300 获得帮助...............................................................................................................................300 HubNet编程指南(HubNet Authoring Guide)..........................................................................301 一般信息...............................................................................................................................301 HubNet活动编程 ..................................................................................................................301 计算器HubNet信息 ..............................................................................................................305 计算机HubNet 信息 ............................................................................................................305 日志(Logging) .........................................................................................................................307 U 四 NetLogo 4.0.2 用户手册 开始记录...............................................................................................................................307 使用日志工具.......................................................................................................................307 高级配置...............................................................................................................................311 控制指南(Controlling Guide)..................................................................................................312 为NetLogo启动Java虚拟机 .................................................................................................312 例子(有GUI)....................................................................................................................313 例子 (headless) ....................................................................................................................314 行为空间(BehaviorSpace)...............................................................................................315 其他选项...............................................................................................................................315 结论.......................................................................................................................................316 Mathematica 连接(Mathematica Link) ..................................................................................317 它是什么?.............................................................................................................................317 我能用它做什么?.................................................................................................................317 使用NetLogo-Mathematica 连接 ........................................................................................317 安装.......................................................................................................................................318 已知问题...............................................................................................................................319 致谢.......................................................................................................................................319 扩展指南(Extensions Guide) ..................................................................................................320 使用扩展...............................................................................................................................320 编写扩展...............................................................................................................................321 数组与表扩展(Array and Table Extensions) ..........................................................................327 何时使用...............................................................................................................................327 如何使用...............................................................................................................................327 数组例子...............................................................................................................................328 哈希表例子...........................................................................................................................328 已知问题...............................................................................................................................328 数组原语...............................................................................................................................329 哈希表原语...........................................................................................................................329 声音扩展(Sound Extension)....................................................................................................332 使用Sound 扩展 ..................................................................................................................332 MIDI支持 .............................................................................................................................332 原语.......................................................................................................................................332 声音名称...............................................................................................................................335 GoGo扩展(GoGo Extension) ..................................................................................................339 GoGo板(GoGo Board)是什么?.......................................................................................339 怎样得到 GoGo板? .............................................................................................................339 安装GoGo 扩展...................................................................................................................339 使用 GoGo 扩展.................................................................................................................340 原语.......................................................................................................................................340 性能剖析扩展(Profiler Extension)..........................................................................................345 告诫.......................................................................................................................................345 使用.......................................................................................................................................345 原语.......................................................................................................................................345 常见问题解答(Frequently Asked Questions)...............................................................................348 五 NetLogo 4.0.2 用户手册 问题.......................................................................................................................................348 一般问题...............................................................................................................................351 下载问题...............................................................................................................................354 Java 小程序(Applet)问题...............................................................................................356 运行问题...............................................................................................................................357 使用问题...............................................................................................................................359 编程问题...............................................................................................................................362 行为空间问题.......................................................................................................................367 扩展问题...............................................................................................................................368 六 NetLogo 4.0.2 用户手册 译者说明 我为什么要翻译 NetLogo 用户手册? 这几年我对复杂系统很感兴趣,了解、使用过一些复杂系统仿真工具。平心而论,NetLogo 并不是特别强大,但与其他工具相比非常容易使用。对于许多从事复杂系统研究的人来说, 用它作为一个工具搞点研究是比较省事的。 以前我并没有要翻译 NetLogo 学习资料的想法。我本来认为做学术研究的人读点软件 文档不成问题,而不做学术研究的人也用不着学习 NetLogo。后来我发现情况并非如此,有 的学生使用 NetLogo 做东西,向我抱怨说英文帮助看着费劲,因此影响了研究进展。我想也 许这是事实,中国人看中文总比看英文容易点吧。 因此本项目就是让那些时间宝贵,看英文不是那么顺畅的人学习 NetLogo 使用的。当然 如果是从事学术研究的人,我的忠告是:还是要多看英文! 读者的法律责任 任何人可以用任何方式阅读、打印、复制、传播本翻译作品,不需向译者支付任何有形 或无形的报酬。 任何人不得以任何方式将本翻译作品用于商业目的。 联系方式 如果你发现译文有错误或不当之处,望不吝赐教。 我的电子邮件:Richter2000@163.com 致谢 这项不打粮食的工作之所以得以进行,需要衷心感谢以下人员: (1)我的一个好朋友让我萌生了启动这项工作的想法(虽非直接,但确有关系)。 (2)感谢电视节目制作人员,他们那些充斥荧屏的不太吸引人的作品,让我能够放弃每 天晚上 2-3 个小时的电视时间,用来从事这项工作,心里也不是那么痛苦。 (3)感谢我的父母,他们赐给我一个基本够用的脑袋,尤其是脑袋里那副质量过硬的牙 齿。当我感到难以继续时,有牙可咬,还不至于咬坏! 1 NetLogo 4.0.2 用户手册 词汇对照表 英 文 agent agentset breed diffuse directed link drawing extensions follow heading histogram import interface item label layout list link movie neighbors observer report patch pen plot procedure seed shape tick tie turtle timer undirected link wrap 中 文 主体 主体集合 种类 扩散 有向链 画图 扩展 跟随 方向 直方图 输入 界面 项 标签 布局 列表 链 电影 邻居 观察者 返回 瓦片 画笔 绘图 例程 种子 图形 滴答 捆绑 海龟 计时器 无向链 回绕 2 NetLogo 4.0.2 用户手册 NetLogo 简介(What is NetLogo?) NetLogo 是一个用来对自然和社会现象进行仿真的可编程建模环境。它是由 Uri Wilensky 在 1999 年发起的,由连接学习和计算机建模中心(CCL)负责持续开发。 NetLogo 特别适合对随时间演化的复杂系统进行建模。建模人员能够向成百上千的独立运行 的“主体”(agent)发出指令。这就使得探究微观层面上的个体行为与宏观模式之间的联系成 为可能,这些宏观模式是由许多个体之间的交互涌现出来的。 NetLogo 可以让学生运行仿真并参与其中,探究不同条件下他们的行为。它也是一个编程环 境,学生、教师和课程开发人员可以创建自己的模型。NetLogo 足够简单,学生和教师可以 非常容易的进行仿真,或者创建自己的模型。并且它也足够先进,在许多领域都可以做为一 个强大的研究工具。 NetLogo 有详尽的文档和教学材料。它还带着一个模型库,库中包含许多已经写好的仿真模 型,可以直接使用也可修改。这些仿真模型覆盖自然和社会科学的许多领域,包括生物和医 学,物理和化学,数学和计算机科学,以及经济学和社会心理学等。几个用 NetLogo 实现 的基于模型的探究性课程正在开发。 NetLogo提供了一个课堂参与式仿真工具,称为HubNet。通过联网计算机或者一些如TI图形 计算器这样的手持设备,每个学生可以控制仿真模型中的一个主体。详情见链接。 NetLogo 是一系列源自 StarLogo 的多主体建模语言的下一代。它基于我们的产品 StarLogoT, 增加了许多显著的新特征,重新设计了语言和用户界面。NetLogo 是用 Java 实现的,因此 可以在所有主流平台上运行(Mac,Windows,Linux 等) 。它作为一个独立应用程序运行。模 型也可以作为 Java Applets 在浏览器中运行。 产品特性 你可以通过下面列表了解 NetLogo 的特点和所提供的功能。 系统 跨平台: 可以在 Mac,Windows,Linux 等平台运行 语言: 完全可编程 简单语言结构 对 Logo 语言进行扩展支持主体 3 NetLogo 4.0.2 用户手册 移动主体(海龟)在由静态主体(瓦片)组成的网格上移动 主体之间可以创建链接,形成聚集、网络和图 内置大量原语 双精度浮点数(IEEE 754) 运行过程在不同平台上完全可复现 环境: 用 2 维或 3 维模式查看模型 可伸缩、可旋转矢量图形 海龟和瓦片标签 可以进行运行中(on-the-fly)交互的命令中心 界面构建,包括按钮、滑动条、开关、选择器、监视器、文本框、注解、输出区 快进滑动条使你可以对模型进行快进和慢放 强大灵活的绘图系统 信息页用来解释模型 HubNet:使用联网设备进行参与式仿真 主体监视器用来监视和控制主体 输出输入功能(输出数据,保存、恢复模型状态,制作电影) 行为空间(BehaviorSpace)工具用来从多次运行中收集数据。 系统动力学建模 Web 模型可以存为 applet 嵌入 web 页(注释:有些功能 applets 不能使用,例如有些扩展和 3 维 视图) 4 NetLogo 4.0.2 用户手册 版权信息 Copyright 1999-2007 by Uri Wilensky。保留所有权利。 NetLogo 软件、模型和文档免费提供给公众,用于探究、构建模型。允许对 NetLogo 软件、模型、文档进行复制、修改用于教育科研目的,不需支付任何费用,但前提是所有拷 贝和支持文档中必须附带此版权信息和原作者姓名。对本软件其他形式的使用,不管是原始 还是修改版本,包括但不限于整体或部分分发,必须首先获得 Uri Wilensky 的特别允许。 在没有得到 Uri Wilensky 相应的授权时,不得使用、重写、修改本软件用做商业软件或硬 件产品的基础。我们不对软件的适用性做任何承诺,也没有任何明确的或暗含的保证。 在学术出版物上引用本软件的方式是:Wilensky, U. (1999). NetLogo. http://ccl.northwestern.edu/netlogo/. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL. 本项目衷心感谢美国国家科学基金的支持((REPP 和 ROLE 项目) – 基金编号 REC #9814682 和 REC #0126227。 * 声明 * 本页为 NetLogo 4.0.2 User Manual 中 Copyright Information 的简体中文翻译,仅 供读者粗略了解相关法律要求。准确的版权声明见本文档所附 Copyright Information。译 者不对此译文的准确性承担法律责任。 5 NetLogo 4.0.2 用户手册 Copyright Information Copyright 1999-2007 by Uri Wilensky. All rights reserved. The NetLogo software, models and documentation are distributed free of charge for use by the public to explore and construct models. Permission to copy or modify the NetLogo software, models and documentation for educational and research purposes only and without fee is hereby granted, provided that this copyright notice and the original author's name appears on all copies and supporting documentation. For any other uses of this software, in original or modified form, including but not limited to distribution in whole or in part, specific prior permission must be obtained from Uri Wilensky. The software, models and documentation shall not be used, rewritten, or adapted as the basis of a commercial software or hardware product without first obtaining appropriate licenses from Uri Wilensky. We make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. To reference this software in academic publications, please use: Wilensky, U. (1999). NetLogo. http://ccl.northwestern.edu/netlogo/. Center for Connected Learning and Computer-Based Modeling, Northwestern University, Evanston, IL. The project gratefully acknowledges the support of the National Science Foundation (REPP and ROLE Programs) -- grant numbers REC #9814682 and REC #0126227. 第三方许可证(Third party licenses) MersenneTwisterFast NetLogo 使用 Sean Luke 的 MersenneTwisterFast 类作为随机数发生器。这些代码的版 权信息如下: Copyright (c) 2003 by Sean Luke. Portions copyright (c) 1993 by Michael Lecuyer. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: • • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 6 NetLogo 4.0.2 用户手册 • Neither the name of the copyright owners, their employers, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Colt NetLogo 部 分 ( 特 别 是 random-gamma 原 语 ) 基 于 Colt 库 (http://hoschek.home.cern.ch/hoschek/colt/)的代码。这些代码的版权信息如下: Copyright 1999 CERN - European Organization for Nuclear Research. Permission to use, copy, modify, distribute and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. CERN makes no representations about the suitability of this software for any purpose. It is provided "as is" without expressed or implied warranty. MRJ Adapter NetLogo 使 用 MRJ Adapter 库 , 版 权 是 Copyright (c) 2003-2005 Steve Roy sroy@roydesign.net 。 该 库 受 Artistic http://homepage.mac.com/sroy/artisticlicense.html License 。 MRJ 保 护 , Adapter 可 从 http://homepage.mac.com/sroy/mrjadapter/ 得到。 Quaqua NetLogo使用Quaqua 观感库, 版权是 Copyright (c) 2003-2005 Werner Randelshofer, http://www.randelshofer.ch/, werner.randelshofer@bluewin.ch, All Rights Reserved. 该库遵从GNU LGPL (Lesser General Public License)。该许可文件在"docs" 文件夹,与 NetLogo 一起下载, 也可从http://www.gnu.org/copyleft/lesser.html 得到。 7 NetLogo 4.0.2 用户手册 JHotDraw 系统动力学建模工具使用JHotDraw库,版权是Copyright (c) 1996, 1997 by IFA Informatik and Erich Gamma。该库遵从GNU LGPL (Lesser General Public License)。该 许 可 文 件 在 "docs" 文 件 夹 , 与 NetLogo 一 起 下 载 , 也 可 从 http://www.gnu.org/copyleft/lesser.html 得到。 MovieEncoder NetLogo 使用节选自 Sean Luke 的 sim.util.media.MovieEncoder.java 的代码制作电 影。该代码遵从 MASON Open Source License,版权信息如下: This software is Copyright 2003 by Sean Luke. Portions Copyright 2003 by Gabriel Catalin Balan, Liviu Panait, Sean Paus, and Dan Kuebrich. All Rights Reserved. Developed in Conjunction with the George Mason University Center for Social Complexity By using the source code, binary code files, or related data included in this distribution, you agree to the following terms of usage for this software distribution. All but a few source code files in this distribution fall under this license; the exceptions contain open source licenses embedded in the source code files themselves. In this license the Authors means the Copyright Holders listed above, and the license itself is Copyright 2003 by Sean Luke. The Authors hereby grant you a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: to use, reproduce, modify, display, perform, sublicense and distribute all or any portion of the source code or binary form of this software or related data with or without modifications, or as part of a larger work; and under patents now or hereafter owned or controlled by the Authors, to make, have made, use and sell ("Utilize") all or any portion of the source code or binary form of this software or related data, but solely to the extent that any such patent is reasonably necessary to enable you to Utilize all or any portion of the source code or binary form of this software or related data, and not to any greater extent that may be necessary to Utilize further modifications or combinations. In return you agree to the following conditions: If you redistribute all or any portion of the source code of this software or related data, it must retain the above copyright notice and this license and disclaimer. If you redistribute all or any portion of this code in binary form, you must include the above copyright notice and this license and disclaimer in the documentation and/or other materials provided with the distribution, and must indicate the use of this software in a prominent, publically accessible location 8 NetLogo 4.0.2 用户手册 of the larger work. You must not use the Authors's names to endorse or promote products derived from this software without the specific prior written permission of the Authors. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS, NOR THEIR EMPLOYERS, NOR GEORGE MASON UNIVERSITY, BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. JpegImagesToMovie NetLogo 使用节选自 Sun 公司的 JpegImagesToMovie.java 制作电影。这些代码的版权 信息如下: Copyright (c) 1999-2001 Sun Microsystems, Inc. All Rights Reserved. Sun grants you ("Licensee") a non-exclusive, royalty free, license to use, modify and redistribute this software in source and binary code form, provided that i) this copyright notice and license appear on all copies of the software; and ii) Licensee does not utilize the software in a manner which is disparaging to Sun. This software is provided "AS IS," without a warranty of any kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. This software is not designed or intended for use in on-line control of aircraft, air traffic, aircraft navigation or aircraft communications; or in the design, construction, operation or maintenance of any nuclear facility. Licensee represents and warrants that it will not use or redistribute the Software for such purposes. JOGL NetLogo使用JOGL, Java API for OpenGL,做图形渲染。关于JOGL的更多信息,见 http://jogl.dev.java.net/。该库遵从BSD license: Copyright (c) 2003-2006 Sun Microsystems, Inc. All Rights Reserved. 9 NetLogo 4.0.2 用户手册 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistribution of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistribution in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of Sun Microsystems, Inc. or the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. This software is provided "AS IS," without a warranty of any kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. You acknowledge that this software is not designed or intended for use in the design, construction, operation or maintenance of any nuclear facility. Matrix3D NetLogo 使用 Matrix3D 类进行 3D 矩阵操作。它的许可证如下: Copyright (c) 1994-1996 Sun Microsystems, Inc. All Rights Reserved. Sun grants you ("Licensee") a non-exclusive, royalty free, license to use, modify and redistribute this software in source and binary code form, provided that i) this copyright notice and license appear on all copies of the software; and ii) Licensee does not utilize the software in a manner which is disparaging to Sun. This software is provided "AS IS," without a warranty of any kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED 10 NetLogo 4.0.2 用户手册 OF THE POSSIBILITY OF SUCH DAMAGES. This software is not designed or intended for use in on-line control of aircraft, air traffic, aircraft navigation or aircraft communications; or in the design, construction, operation or maintenance of any nuclear facility. Licensee represents and warrants that it will not use or redistribute the Software for such purposes. ASM NetLogo 使用 ASM 库产生 Java 字节码。它的许可证如下: Copyright (c) 2000-2005 INRIA, France Telecom. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Log4j NetLogo 使用 Log4j 库实现日志功能。该库的版权和许可证如下: Copyright 1999-2005 The Apache Software Foundation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed 11 NetLogo 4.0.2 用户手册 under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 12 NetLogo 4.0.2 用户手册 更新历史(What’s New?) 用户反馈对我们设计和改进NetLogo非常有价值。我们希望听取你的意见。请把评论、 建 议 和 问 题 发 送 到 feedback@ccl.northwestern.edu , Bug 报 告 发 送 到 bugs@ccl.nrthwestern.edu 4.0.2 版 (2007 年 12 月) • • • • 文档: o 模型: o o 用户手册进行了许多小的更正和改进 新的演化模型: Bug Hunt Coevolution 改进模型: Climate Change (现在已校核), GasLab Atmosphere (更正), Red Queen, Bug Hunt Camouflage 引擎更正: o 更正链死亡 bug (只影响有多个链种类的模型) o 主体集合的sort-by ,相等的主体采用随机排序 o 当端点重合时,link-heading 报错 o 更正了画笔颜色与import-world 不兼容的bug o 更正了性能剖析扩展中当海龟死亡时有时出现荒谬的结果 用户界面更正: o 在 Linux 上 3D 视图现在又可以用了 o 现在当打开或保存 3.1 之前的模型时,给出警告。因为 4.0 不后向兼容,也 不总会前向兼容 o 更正了一个 bug, 当最小最大值改变时滑动条不能总是保持其值在范围之内。 o 更正了滑动条相关的几个 bug,他们引起 Java 例外或不期望的结果 o 更正了那些有长代码和许多滑动条的模型编译很慢的 bug。 o 更正了在 HubNet 客户编辑器不能删除界面元素或编辑开关的 bug o 改进了 3D 视图中点划线的外观 o 改进了 applets 与一些浏览器和操作系统的兼容性 4.0 版 (2007 年 9 月) • 模型: o o o o o 新的地球科学模型: Continental Divide, Climate Change 新的化学模型 l: Diprotic Acid 新的材料科学模型 l: Solid Diffusion 新的数学模型: PANDA BEAR Solo, Surface Walking 2D 新的网络模型: Team Assembly 13 NetLogo 4.0.2 用户手册 o o o o o o o o o o o o o o • • 文档: o o o 功能: o o o o o 新的计算机科学模型: Hex Cell Aggregation, Particle System Basic, Particle System Fountain, Particle System Waterfall, Particle System Flame 新游戏: Planarity 新的社会科学模型: Language Change, El Farol (老的 El Farol 模型现在叫 El Farol Network Congestion) 新的 NIELS 电磁模型: Ohm's Law, Series Circuit, Parallel Circuit 一套新的 Urban Suite 课程模型 一套新的 Connected Chemistry 课程模型 一套新的 BEAGLE Evolution 课程模型 改进和校核的模型: Dice Stalagmite, Autumn, Conic Sections 2, Echo, Rebellion, Daisyworld, Sound Machines, Birthdays, Bug Hunt Speeds, Electrostatics 其他改进模型: Small Worlds (更正), 多数 CA 1D models (更正), Star Fractal (检查代码), Genetic Drift T Interact (增加了可选墙), Flocking (平滑动画), Planarity (代码简化), Mimicry (代码简化), GasLab Circular Particles (代码清 晰,增加图), acid/base models ((代码简化) 新的代码实例: Random Grid Walk Example, Link Lattice Example, Lattice-Walking Turtles Example, Link-Walking Turtles Example, Intersecting Links Example, State Machine Example, Breed Procedures Example, Link Breeds Example, Mouse Drag Multiple Example, Hill Climbing Example, Rolling Plot Example, Ask-Concurrent Example, Ask Ordering Example, Random Network Example, Fully Connected Network Example, Mobile Aggregation Example, Wall Following Example, Circular Path Example, Profiler Example 改进代码实例: Halo Example (简化tie的使用), Intersecting Lines Example (更正), RGB and HSB Example (现在演示RGB列表), File Output Example 新的 HubNet 活动: PANDA BEAR 新的 HubNet 代码实例: Template 改进 HubNet 活动: Dice Stalagmite HubNet (校核), Bug Hunters Camouflage (校核), Root Beer Game (校核), Disease Doctors (校核), Minority Game 在用户手册新增迁移指南,帮助早期模型在 4.0 中能运行 在用户手册的编程指南新增语法部分 在用户手册新增 Applets 部分 大多数模型运行的更快: 改进程度随模型不同而不同,一般快了约 1.5 倍 加速原因是改进了编译器,现在部分 NetLogo 代码编译为 Java 字节 码 链成为除海龟、瓦片之外的另一个主体类型,这对网络模型、几何模型等有 用 新增链图形编辑器,用来控制链的形状 日志帮助研究者记录学生的行为,供以后分析 内置滴答计数器保持模型时间(见下面的语言变化) 14 NetLogo 4.0.2 用户手册 新的视图更新系统: 现在有两种视图更新模式,基于滴答或连续 启动 NetLogo 后默认是连续模式;模型库中的多数模型是基于滴答 模式;连续模式对不基于滴答的模型,例如 Termites,有用,但也对 调试有帮助 基于滴答更新的模型多数运行较快,因为可以避免显示中间状态 按钮不再有"force view update"勾选项; 多数模型应使用tick 和或 display o 改进速度滑动条: 能使用滑动条“快进”模型 (通过更少的更新视图) 在基于滴答的更新模式中,两个滴答之间有个暂停而不显示中间状 态 在连续更新模式,慢进时显示中间状态,甚至可以看到每个海龟的 运动 o 在界面页的输入框允许输入文本、数值、颜色或 NetLogo 代码作为模型参数 o 通过扩展支持数组和哈希表 (见用户手册数组与哈希表部分) o 新的性能剖析扩展使你可以计量例程的运行时间 o 新的实验性 __includes 关键词允许将模型代码分到多个源文件 o 颜色变量可以包含 NetLogo color 或 RGB color (作为三个数的列表) o 可编程滑动条范围(可使用 NetLogo 报告器作为滑动条的 min, max,或 increment) o 输出世界时包括所有的绘图数据,当输入世界时绘图内容被恢复 o 声音扩展现在除 MIDI 声音外,还可播放音频文件 o 现在注释、监视器和输出区域字体大小可设置 o 注释中的字体颜色可设置,背景颜色是否透明可选 o 界面页的"Snap to Grid" o 增加菜单项 (和 F1 快捷键) 快速访问 NetLogo 词典 o 滑动条可垂直或水平 o 模型文件自动保存到临时目录,免遭死机的损失 o HubNet 客户现在更容易编辑(客户不再是独立模型) o Mathematica-NetLogo 连接在 Mathematica 和 NetLogo 之间提供实时连接, 控制模型运行和可视化,进行后分析或实时分析 语言变化: o ask 命令总是以“无中断”方式运行;如果需要老式的并发行为, 使用 ask-concurrent o 使用扩展的语法更简单(无下划线、双引号、.jar 后缀) o 新的滴答计数原语: tick, ticks, tick-advance, reset-ticks o 改变了数值的工作方式: 所有数值都是双精度浮点数 没有小数部分的数值显示为整数(没有小数点) 可以表示更大的整数(最大约 9x10^15) o 新原语 of 代替了 VARIABLE-of, value-from, values-from o 新报告器 all?测试主体集合中的所有原语是否满足条件 o 海龟的 who numbers 不再重用,除非使用了clear-turtles 或 clear-all o • 15 NetLogo 4.0.2 用户手册 o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o 新原语 other 返回除调用主体之外的主体集合(等价于with [self != myself]) 去掉了other-turtles-here 和 other--here,使用other 新的move-to 命令移动海龟到指定的海龟或瓦片处 创建海龟或链的命令后面的命令是可选的 不再有create-custom-turtles 和 create-custom- 命令,相反使 用create-turtles 和 create- ,加上可选命令块 现在create-turtles以随机方向和颜色创建海龟;要得到均匀分布、顺序颜 色和id的海龟,使用create-ordered-turtles (简写cro) 新的turtle-set, patch-set, link-set报告器,用来以多种方式创建主体集 合 去掉turtles-from 和patches-from (相反使用 turtle-set 和 patch-set ) 新的uphill, uphill4, downhill, downhill4 命令执行爬山 这些命令代替了老的同名命令 新命令的语义略有不同 使用老命令的模型需手工修改 新的报告器 no-turtles, no-patches, no-links 报告空的主体集合 两个主体集合可以做相等测试 tie 和 untie 命令不再是实验性的,它们没有输入参数,只能由链使用; 有 两个捆绑模式 "fixed" 和"free" 操作符+ 只能对数值进行; 不能用于字符串或列表;模型必须手工修改,对字 符串使用word ,对数值使用sentence 新的histogram 命令替代了histogram-list, histogram-from 去掉了 random-int-or-float; 有些模型需手工修改,使用random或 random-float 去掉nsum 和 nsum4; 使用sum [reporter] of neighbors/neighbors4 新的主体集合原语min-n-of 和max-n-of 新的原语 with-local-randomness 运行代码时不改变随机数发生器的状态 新的文件 I/O原语 file-flush 强制输出到磁盘 新的颜色原语 base-colors 返回 14 个基本色调的列表 turtle 原语不再接收非整数输入 patch 原语现在接受非整数并取整,允许时也回绕 观察者不再使用patch-at, turtles-at, BREED-at; 相反使用 patch, turtles-on patch, BREED-on patch 比较操作符可用于海龟、瓦片和链 新的报告器原语plot-pen-exists? 老的 rgb 和 hsb原语更名为 approximate-rgb 和approximate-hsb; 现在 它们的输入参数范围是 0-255 而不是 0-1.0 hsb 和 rgb报告器现在返回RGB 列表而不是NetLogo color 新的原语 import-pcolors-rgb 将图像以RGB color导入瓦片 新的原语netlogo-applet? 测试模型是否以applet方式运行 代码中可以为滑动条设置一个最小、最大或增量所不允许的值 不再有locals; 相反使用 let 扩展原语必须使用扩展名(默认), 例如 sound:drums 而不是 drums 16 NetLogo 4.0.2 用户手册 file-read 原语跳过注释 o 去掉了许多文档中未提及的原语的别名 用户界面改变: o "text box"更名为"note" o 滑动条可以用鼠标滚轮移动 o 内置变量和原始报告器一样使用语法加亮为紫色 o 与user-* 原语关联的对话框外观和功能更一致 o 文本区增加了上下文菜单(cut/copy/paste 和 dictionary lookup) o 绘图上的 Pens 按钮去掉了 (现在编辑绘图显示或隐藏画笔图例) 引擎修正: o 现在监视器使用辅助随机数发生器,因此监视器中的代码不影响模型的可重 现 o 现在对相同字符串重复调用run 和 runresult原语时,速度大大提高 o 即使由海龟\瓦片或链使用,display 命令也可以工作 o 在内部,列表由链表实现,而不是数组。这不会影响模型行为,但可能影响 性能 (影响是好是坏取决于具体操作,见编程指南) o 当海龟移动不指明方向时(例如setxy) ,总是采用最短路(即使回绕) o 修正一个 bug,即某些情况下模型运行过程中输出然后再输入世界时,结果 会改变(通过影响 who numbers 的重用) o 对列表的sort-by现在稳定了 (即不打乱相等项的顺序) o 读取很长的列表时,file-read 原语更快了 o 更正了在某些拓扑in-cone 和 distance 不正常的bug o 更正了某些布局命令不受随机数种子控制的 bug o 与滑动条、开关、选择器、输入框关联的全局命令在无头和 GUI 方式下运 行一致,即拒绝类型不符或超出范围的值 其他更正: o Tools 菜单的 Halt 项在更多的情境下有效(而不是挂起 NetLogo) o 如果出现无限递归,Netlogo 报错,而不是盲目运行 o 当 startup 命令运行时,用户不能与模型交互 o 无头方式下支持绘图(使用export-plot 或 export-world 保存图形数据,以 后查看) o 在 3D 视图,如果世界回绕,在边界上的海龟图形也会回绕 o 升级了 JOGL, 修正了某些用户的 3D 视图 bug o Applets 现在可以找到与模型相关的文件,即使模型文件与 HTML 文件不在 同一目录 o 在系统动力学建模工具中,速率连接器可以重定位 o 系统动力学建模工具现在显示语法错误的位置 o 在系统动力学建模工具中,现在可以使用set-current-plot 控制使用哪个 绘图,使用plot-pen-exists?控制绘制哪个存量 o 默认最大 Java 堆大小为 1G o 无头模式可以在 IBM 的 Java 下工作 o GoGo 扩展现在更易用(不需独立的安装) o 新的勾选项允许在 3D 视图中关闭世界线框 扩展 API 的变化: o • • • • 17 NetLogo 4.0.2 用户手册 o o o o o 现在扩展 API 有版本号,因此只要扩展 API 的版本号没变,就可以在不同 版本的 NetLogo 中使用 扩展不仅是个 jar 文件,而是一个包含 jar 文件的目录,因此可以包括其他支 持文件 扩展 API 为定义新的数据类型提供了基本支持(数组和表扩展就是一个例子) 现在扩展可以访问随机数发生器 扩展实例以及 Java 源代码已安装(以前要单独下载) 3.1.5 版 (2007 年 12 月) • • • • • • 安装包支持 Windows Vista 重写并扩展了教学#3 新的声音扩展命令play-note-later 用于播放乐句 不需要附加 jar 的扩展能在 applet 工作 sort-by主体集合时相等主体随机排序 修正了 bug 3.1 版 ( 2006 年 4 月) • • • • • • 拓扑 (在世界边界上回绕是可选的) 对主体集合自动随机排序 为种类指定单数形式和复数形式名称 现在sort 和sort-by 可用于主体集合 对网络和几何增加了 link 原语 (实验性的) __tie 和 __untie 原语 (实验性的) 3.0 版 (2005 年 9 月) • • • • • • • • • • 3D 视图(用于 2D 模型) 系统动力学建模工具 跟踪特定主体的follow, ride 和 watch 命令 "drawing layer" 用于主体做出的标记 更多的颜色 更好的信息页 GoGo 扩展用于连接 NetLogo 与物理设备 Color Swatches 对话框用来选择颜色 导入图像文件 按钮有次序(而不是代码相互交叉) 18 NetLogo 4.0.2 用户手册 2.1 版 ( 2004 年 12 月) • • • • • • • • 无头模式用于命令行操作 编辑器加亮括号和方括号的配对 "action keys" 让按钮可以通过按键激活 制作模型的 QuickTime 电影 模型增加"output area" 改进图形编辑器和内置图形 新的原语let 和carefully 计算机 HubNet: o 现在更可靠 o 客户自动寻找服务器 o 改进客户界面和控制中心 2.0.2 版( 2004 年 8 月) • • • 扩展 API ,使用 Java 编写命令和报告器 控制 API,从外部 Java 代码控制 NetLogo 声音扩展制作声音和音乐 2.0 版( 2003 年 12 月) • • • • • • • • • 全部支持 Mac OS X 和 Linux 不再支持 Windows 95, MacOS 8/9 改进观感 更快、无闪烁,非基于网格的图形 读写外部文件的原语 在不同的平台上数学结果完全相同 将视图或界面页以图像文件输出 改进行为空间 计算机 HubNet (不再是 alpha) 1.3 版 ( 2003 年 6 月) • • • • 视图控制条 选择器 新的原语run, runresult, map, foreach, filter, reduce 有些原语接受可变数量输入 19 NetLogo 4.0.2 用户手册 1.2 版 ( 2003 年 3 月) • • 速度更快 计算机 HubNet (alpha) 1.1 版 ( 2002 年 7 月) • • • • "Save as Applet" 将模型嵌入网页 支持打印机 例程菜单 界面页可滚转 1.0 版( 2002 年 4 月) • 第一次发行 (经过一系列 beta 版) 20 NetLogo 4.0.2 用户手册 系统需求(System Requirements) NetLogo 可以运行在目前几乎所有计算机上。 如果你的 NetLogo 不能正常运行,发送错误报告到 bugs@ccl.northwestern.edu 系统需求:应用程序 Windows NetLogo 可以运行在 Windows Vista,XP,2000,NT,ME 和 98 上 NetLogo 安装程序安装 Java 1.5.0,由 NetLogo 独占使用,不影响计算机上的其他程序。 Mac OS X 强烈推荐 Mac OS X 10.4(或以上),10.3 或 10.2 也支持。 请运行软件更新以确保有最新的 Java。 其他平台 NetLogo 可以运行在安装了 Java 虚拟机 1.4.1 以上的任何平台上。1.5.0_13 以上更好。 通过运行提供的脚本程序 netlogo.sh 启动 NetLogo 系统需求:保存 Applets NetLogo 模型存为 Java Applet 后,可以运行在任何安装了 Java 1.4.1 以上的浏览器 中。 系统需求:3 维视图 少数情况下一些老的、性能差的系统不能成功使用 3 维视图。试试看。 一些系统能使用 3 维视图但不能切换到全屏模式,这与图形卡有关。例如 ATI Radeon IGP 345 和 Intel 82845 可能不能工作。 Windows 用户关于 Java 的技术细节 多数 Windows 用户应选择捆绑了 Java 的 NetLogo 下载包。 有两个可能的原因使用没有捆绑 Java 的其他下载包: 1. 希望下载包较小,少占用硬盘空间 2. 因为某些特别的技术原因,你需要使用其他 Java 版本 如果你认为其他下载包适合你,请阅读下面的详细技术信息。 即使你已经安装了 Java,它也可能不能与 NetLogo 一起工作。 21 NetLogo 4.0.2 用户手册 为了获得最佳性能,NetLogo 使用了 Java 虚拟机的一个特别选项“server”。JRE 默认 安装时没有这个选项,只有 JDK 有这个选项。 如果你不是 Java 开发人员,你可能使用的是 JRE,而非 JDK。 因此,如果你要用自己的 Java 虚拟机运行 NetLogo,你有两种选择: 1.确保你有完全的 JDK 而非 JRE。 2.或者你能编辑一个配置文件,让 NetLogo 与 JRE 一起工作。 我们不推荐选项 2,因为没有“server”选项使 NetLogo 运行特别慢。 如果你非要用选项 2,你就应这样做。你必须告诉 NetLogo 不要使用“server”虚拟机 选项。首先,使用本页的下载包安装 NetLogo,然后使用文本编辑器如 NotePad 打开 NetLogo.4.0.2.lax,这个文件在 NetLogon 安装目录里。在附加 java 选项里去掉-server 选项。将这一部分: # LAX.NL.JAVA.OPTION.ADDITIONAL # −−−−−−−−−−−−−−−−−−−−−−−−−−−−− # don't load native libs from user dirs, only ours, also run server not client VM lax.nl.java.option.additional=−Djava.ext.dirs= −server −Dsun.java2d.noddraw=true 改为: # LAX.NL.JAVA.OPTION.ADDITIONAL # −−−−−−−−−−−−−−−−−−−−−−−−−−−−− # don't load native libs from user dirs, only ours, also run server not client VM lax.nl.java.option.additional=−Djava.ext.dirs= −Dsun.java2d.noddraw=true 再说一次,使用这种方法,NetLogo 性能会变差。 22 NetLogo 4.0.2 用户手册 已知问题(Known Issues) 如果NetLogo有问题,请将bug报告发给我们。具体方法见"联系我们" 部分。 已知 bug (所有系统) 语言/引擎 bug • • • 数组和表扩展与输入世界功能仅部分兼容。当输出世界时(使用export-world命令 或Export World菜单项),数组和表“按值”输出。这意味着如果相同的表或数组存 储在多个位置,当输出然后再次输入时,在原始数组或表的每个原始位置上有不同 的数组或表。这些复制品初始时包括相同的值,但当一个复制品变化时,其他的不 变。 "Export World"不保存用文件原语打开的文件状态。如果有文件打开,输出世界,然 后将世界输入到 NetLogo,需要在恢复运行前重新打开文件。 如果原始图形文件有灰度调色板,Java的一个bug使得用import-pcolors输入的瓦片 颜色变得浅一些。要解决这个问题,将图像文件转换为RGB调色板。 其他 bug • • • • • • 内存溢出没有得到完美处理 当缩放时,"Snap to Grid"功能不可用 在画图层画出然后擦除一条线,不会精确的擦掉每个像素 需要附加外部 jar 的扩展在保存为 applet 的模型里不能工作(我们已经着手解决这个 问题) 在某些图形配置(some graphics configurations)下,3D视图不能工作;其他配置下 3D视图能工作,但全屏模式不行 当以无头模式(从命令行)运行模型时,如果模型是使用早期 NetLogo 版本创建的, 则可能不能正常工作。在以无头方式运行前,使用当前版本的 NetLogo 以 GUI 模式 打开然后重新保存模型。 Windows 上的 bug • • 不是在每台计算机上 Help 的"User Manual" 项都能用 (Windows 98 和 ME 最可能 受影响,Windows 版本越新越少受影响) 在某些笔记本上,当滚转时例程页和信息页可能混乱。要避免这个bug,减小NetLogo 窗口,和/或减少监视器的颜色深度。(例如从 32-bit 减为 16 或 8-bit )。这是Java本 身的一个bug,不是NetLogo的问题。关于这个bug的技术细节,见 23 NetLogo 4.0.2 用户手册 http://developer.java.sun.com/developer/bugParade/bugs/4763448.html (需要免费注册)。 鼓励NetLogo用户访问此站点投票,让Sun修正此bug。 Macintosh 上的 bug • • • 当在 Finder 打开一个模型时 (在上面双击,或把它拖到 NetLogo 图标), 如果 NetLogo 还没有运行,这个模型可能或不能打开。这个 bug 是偶发的。(如果 NetLogo 已运行,模型总能打开) 仅在 Mac OS X 10.4 上, "Copy View" 和 "Copy Interface"项不工作:结果图像失真。 解决方法是使用"Export View"和 "Export Interface"项。如果使用软件更新从 Apple 得到最新的 Java,这个问题消失。 在 10.4 以前的 Mac OS X,NetLogo 的菜单可能出问题,"Quit"项不工作。如果出现 这个问题,可以按下 NetLogo 标题栏左侧的红色关闭按钮退出 NetLogo。 Linux/UNIX 上的 bug • • • • 用户手册总是在 Mozilla 里打开,而不是默认浏览器。一个可能的解决方法是在你喜 欢的浏览器里收藏 docs/index.html 做为书签。另一个方法是制作一个符号连接,叫 做"mozilla"(这是 NetLogo 尝试运行的命令名),但实际运行另一个浏览器。 在Linux上我们发现了一个问题,"exp"对相同的值有时返回略有不同的结果(最后 一位不同)。根据Sun的一个工程师的说法,该问题仅发生在Linux内核 2.4.19 上,但 我们发现在很多内核新版本上也有。我们假设这个问题是Linux特有的,不会发生在 其他Unix上。我们不确知这个问题是否会在实际运行NetLogo时发生,还是只发生在 测试情形下。这个bug是Sun的Java VM的,不是NetLogo的。我们希望只是"exp"报告 器受影响,但我们不能完全确认。鼓励NetLogo用户访问此站点 http://developer.java.sun.com/developer/bugParade/bugs/5023712.html (需要免费注册), 投票让Sun修正此bug。 如果 NetLogo 找不到 Lucida 字体,菜单会模糊不清。这已知发生在 Fedora Core 3 升级后。重启 X Font Server (xfs)解决了这个问题。 Sun's 1.5.0 Java runtime 对 GTK 2.0 和 NetLogo 有显示问题。问题可能包括窗口不能 正常更新,界面元素的大小不对劲,菜单底部截去,视图上出现奇怪字符等。要避 免这个问题,升级到 Java 1.6。 计算机 HubNet 的已知问题 参见HubNet 指南 ,在那儿列出了已知问题。 24 NetLogo 4.0.2 用户手册 联系我们(Contacting Us) 用户反馈对我们设计和改进 NetLogo 非常有价值。我们很高兴听到你的反馈。 网站 我们的网站 ccl.northwestern.edu 包括我们的邮件地址和电话号码。也有我们的人员 信息和研究活动信息。 反馈、问题等 如 果 你 的 模 型 需 要 帮 助 , 考 虑 在 NetLogo 用 户 组 发 帖 http://groups.yahoo.com/group/netlogo-users/ 。 还 有 一 个 专 门 针 对 教 育 人 员 的 组 http://groups.yahoo.com/group/netlogo-educators/ 。 如果有反馈、建议、问题,发邮件到feedback@ccl.northwestern.edu 。 报告 Bug 如果发现NetLogo有bug,想告诉我们,请写信到bugs@ccl.northwestern.edu 。当报告 bug时,尽量包括下面的信息: • • • • 问题的完整描述以及它怎样发生 有问题的 NetLogo 模型或代码。可能的话,附上完整的模型。 系统信息: NetLogo 版本, 操作系统版本,Java 版本等。 (这些信息可以在 NetLogo 的"About NetLogo"菜单项,然后单击 System 标签。在保存的 applet 里,ctrl+单击 (Mac)或在 applet 白色背景右击,可以得到该信息。) 所显示的任何错误信息。 25 NetLogo 4.0.2 用户手册 模型实例:聚会(Sample Model:Party) 这一部分让你思考什么是计算机建模以及如何使用它,也让你对 NetLogo 软件有所了 解。我们推荐初学者从这里开始。 聚会 你是否参加过聚会,注意过人们是怎样聚集成小组的吗?你也可能注意到人们并非一直 呆在一个小组里,而是走来走去。当个人走来走去时,小组就发生变化。如果你长期观察这 种变化,你应该注意到模式的形成。 例如,在社交场合人们倾向于展示出与工作或家庭中不同的行为。那些在工作中信心满 满的人可能在社交场合变得羞怯,而那些在工作中安静保守的人却可能与朋友发起聚会。 聚集模式也取决于聚会的性质。在某些场合,人们接受训练组织成混合小组,例如聚会 游戏或校园活动。但在非结构化的气氛里,人们以更加随机的方式形成小组。 这种分组行为有没有什么模式呢? 让我们使用计算机对聚会中人们的行为建模,更详细的考察这个问题。NetLogo 的 “Party”模型从性别这个特殊角度考察这个问题:为什么这些小组多数是男性,或多数是 女性? 我们使用 NetLogo 研究这个问题。 操作步骤: 1. 启动 NetLogo 2. 在 File 菜单中选择 "Models Library" 3. 4. 5. 6. 7. 打开文件夹 "Social Science" 点击模型 "Party". 按下"open" 按钮 等待模型加载 (可选)放大 NetLogo 窗口,这样能看多更多内容 26 NetLogo 4.0.2 用户手册 8. 按下”Setup" 按钮 在视图中你可以看到粉线和蓝线,还有数字。 这些线表示聚会上男女混合的小组。男性用蓝色表示,女性用粉色。数字是每个小组的 人数。 所有小组的人数相同吗? 所有小组的每种性别的人数相同吗? 例如你邀请了 150 人参加聚会,你想知道人们怎样扎堆。假设人们分成了 10 组。 你怎么思考分组情况? 这里我们使用计算机仿真,而不是去问你那 150 个亲密朋友。 操作步骤 1. 按下 "go" 按钮 (再次按下 "go" 会停止模型运行) 2. 观察人们的移动直到模型停止 3. 看图形输出了解发生了什么 现在每组有多少人? 开始时你可能认为将 150 人分成 10 组的结果是每组大约 15 人。从模型运行得知,人们 并没有均等的分成 10 组 — 相反,有些组人数特别少,而有些组人数却特别多。另外,随 着时间发展,从所有小组男女都有转变为所有小组均由同性组成。 这怎么解释? 对这个问题有很多可能的回答。本模型的设计者认为聚会上的小组不是完全按随机方式 形成的,小组如何形成取决于个体的行为。模型设计者关注一个特殊变量“tolerance”(容 忍度): 这里将容忍度定义为个体感到舒服的异性的比例。如果小组中异性比例超过容忍度,他 们就觉得不舒服,因此离开这一组去寻找别的小组。 例如,如果容忍度水平设为 25%,那么一个男性只有在女性比例少于 25%的小组里才感 到舒服。同样女性只有在男性少于 25%的小组里才感到舒服。 当个体变得不舒服时选择离开,移动到别的小组,这可能又让这个组中的某些人不舒服。 这种链式反应不断进行,直到聚会上的所有人都感到舒服。 27 NetLogo 4.0.2 用户手册 注意这个模型中,容忍度不是固定的。用户可以用滑动条改变容忍度,重新运行模型, 看看结果如何。 怎样重新启动模型: 1. 2. 3. 4. 如果 "go" 按钮已按下 (黑色),说明模型还在运行。再次按下该按钮停止运行。 通过拖动红色手柄调整 "tolerance" 滑动条,设置新值 按下"setup" 按钮重设模型 按下"go" 按钮再次启动模型 挑战 作为聚会的主人,你希望看到各组里都是男女混合。调整容忍度滑动条,让每组都男女 混合。 为保证 10 个小组都是男女混合,容忍度水平要设成多少? 看看你的预测结果吧。 你能想到可能影响每组中男女比例的其他因素或变量吗? 进行预测,用模型检验你的想法。放开手脚同时操作多个变量。 当你检验假设的时候,你会从数据中注意到模式的涌现。例如,如果保持聚会人数不变, 但逐渐增加容忍度水平,更多的组会成为男女混合组。 容忍度水平必须是多少才能得到混合组? 容忍度水平与混合组的比例有什么关系? 用模型思考 用 NetLogo 对聚会这样的情景建模使你可以对系统进行快速、灵活的试验,而在现实情 况下这是很困难的。建模也给了你少受偏见的影响去观察各种情景的机会,因为你可以检查 系统内部的动态。你会发现随着你建模越来越多,对许多现象的原有的想法会遇到挑战。例 如 Party 模型一个令人惊讶的结果是:即使容忍度水平相对较高,大量性别分离仍然会发生。 这是关于“涌现”现象的一个经典例子,这里小组模式是许多个体交互的结果。“涌现” 思想可以应用在几乎任何领域。 你能想到别的涌现现象吗? 要想获得更多的例子,对这个概念有更深的理解,你可以探索 NetLogo 模型库,里面有 许多模型,演示了各种系统中的这类思想。 要更详细了解关于涌现的讨论以及NetLogo如何帮助学习者进行探索,参见"Modeling Nature's Emergent Patterns with Multi-agent Languages" (Wilensky, 2001). 下一步? 用户手册的 教学 1:运行模型 讲述模型库的更多细节。 28 NetLogo 4.0.2 用户手册 如果你想学习怎样在更深的层次上探索模型,教学 2:命令 将引导你了解NetLogo建模 语言。 最后,你将学习 教学 3:过程,你将学习怎样替换、扩展模型,增加新行为,以及如 何建造自己的模型。 29 NetLogo 4.0.2 用户手册 教学# 1:模型(Tutorial #1 :Models) 如果你已经读过 模型实例:聚会 部分,你应该简单了解了怎么与 NetLogo 模型交互。 这一部分更深入了解一些功能,这些功能在你探索模型库时会用到。 在整个教学过程中我们会请你做一些预测,预测修改模型后会出现什么后果。记住,后 果往往令你惊讶。我们认为这种惊讶非常令人激动,提供了特棒的学习机会。 有些人发现把这些教学材料打印出来放在手边,对学习很用帮助。打印出来后,你的计 算机屏幕上有更大的空间显示你要查看的 NetLogo 模型。 模型实例:狼吃羊( Wolf Sheep Predation) 我们要打开一个模型实例详细探索。我们试试一个生物模型:狼吃羊,这是一个捕食者 -猎物种群模型。 • 从文件菜单打开模型库 • 从 Biology 部分选择"Wolf Sheep Predation" 按下"Open" 界面标签页填满了许多按钮、开关、滑动条和监视器。这些界面元素使你可以与模型交 互。按钮是蓝色的,用它们设置、启动、停止模型。滑动条和开关是绿色的,它们用来修改 模型配置。监视器和绘图是浅褐色的,它们用来显示数据。 如果你想让窗口大一些,让所有元素都能容易的看到,你可以使用窗口顶部的 zoom 菜 单。 当你第一次打开模型时,你会看到视图是空的(全黑)。要让模型开始,你需要先进行 初始设置。 • 按下 "setup" 按钮 视图中出现什么? 30 NetLogo 4.0.2 用户手册 • 按下 "go" 按钮开始仿真 模型运行时,狼群和羊群发生什么? • 按下"go" 按钮停止运行 控制模型:按钮 按钮按下后模型就会通过执行一个动作做出响应。按钮分为“一次性”(once)和“永 久性”(forever)两种,可以通过按钮上的一个符号区分二者。永久性按钮的右下角有两个 箭头,就像这样: 一次性按钮没有箭头,就像这样: 一次性按钮执行动作一次然后停止。当动作完成后,按钮弹起。 永久性按钮不断的执行一个动作。当你想让动作停止时,再次按下按钮,它会完成当前 动作,然后弹起。 大多数模型,包括狼吃羊模型,有一个一次性按钮称为“setup”和一个永久性按钮称 为“go”。许多模型还有一个一次性按钮称作“go once”或“step once”,它们很像 go 按钮,但区别在于它们只执行一步(时间步长)。使用这样的一次性按钮能让你更仔细的查 看模型的运行过程。 停掉永久按钮是终止模型的正常方式。通过停止永久性按钮暂停模型运行,然后再次按 下按钮让模型继续,这非常安全。你也可以使用 Tools 菜单的“Halt”停止模型运行,但是 只有当模型因某种原因卡住时才应该这样做。使用“Halt”可能会让模型在某次行动的中间 停住,这可能导致模型乱套。 • 如果你愿意的话,试试狼吃羊模型的 "setup" 和 "go" 按钮 如果使用同样的设置多次运行模型,结果会有不同吗? 控制速度:速度滑动条 速度滑动条控制模型运行速度,就是海龟的移动速度、瓦片颜色改变的速度,等等。 31 NetLogo 4.0.2 用户手册 滑块左移使模型速度变慢,每个时间步之间的暂停时间更长,这样更容易观察发生了什 么。你甚至可以让模型运行的极慢,能看到每个海龟做什么。 滑块右移使模型速度变快。NetLogo 可能会跳帧,意思是说不再是每个时间步都进行视 图刷新。显示世界状态要耗费时间,因此少显示这些一般意味着运行更快。 注意如果滑块太靠右的话,视图更新太频繁,看起来却好像变慢了。实际并没有变慢, 你可以根据时钟显示确认这一点,只是视图更新频率降低了。 调整设置:滑动条和开关 模型的配置给了你尝试不同场景或假设的机会。修改配置,运行模型,观察这些改变所 引起的反应,使你能更深入的了解所模拟的现象。开关和滑动条用来修改模型配置。 下面是狼吃羊模型中的开关和滑动条: 我们来试试这些行为的效果。 • • • 如果狼吃羊模型还没打开,现在打开它 按下"setup" 和 "go" ,运行大约 100 时间步 (注意:图的右上有时钟读数) 按下"go" 停止 羊群怎么变化? 我们看看如果改变下面的设置的话,羊群怎么变化。 • • 打开"grass?" 开关 按下"setup" 和 "go" ,运行与上次差不多相同的时间 32 NetLogo 4.0.2 用户手册 这个开关对模型有什么作用?结果和上次一样吗? 像按钮一样,开关也有与它相连的信息,这些信息采用开/关格式。开关发出特别的指 令,这些指令对模型并非必要,但为模型增加了附加的维度。打开"grass?"影响模型结果。 本次运行之前,草的增长率为常数。在掠食-食饵关系中这是不真实的,因此通过设置和打 开草的增长率,我们能够对三个因素建模:羊、狼和草。 另一种配置类型是滑动条。 滑动条是不同于开关的一种配置类型。开关有两个值:开或关。滑动条是一个可调的数 值范围。例如"initial-number-sheep"滑动条最小值为 0,最大值为 250。模型运行时可以 有 0 只羊,也可以有 250 只羊,或者中间的任何一个数值。试试看。当你从左到右移动滑块 时,滑动条右侧的数字变化,这就是当前值。 我们研究一下狼吃羊模型的滑动条。 • 阅读信息标签页中的说明,了解每个滑动条表示什么. 信息标签页提供了模型的指导和洞察。在这一页你会找到模型的解释,尝试建议以及其 他信息。你可以在运行模型前读它,也可以先试试模型,再返回来读它。 如果仿真开始时羊更多而狼更少,会怎么样? • • • • • 关掉"grass?" 开关 设置"initial-number-sheep" 滑动条为 100. 设置"initial-number-wolves" 滑动条为 20. 按下 "setup" 和 "go". 模型运行约 100 时间步 尝试重复运行模型几次。 羊群数量发生了什么变化? 结果令你惊讶吗?调整哪些其他开关、滑动条能帮助羊群? • • • • 设置 "initial-number-sheep" 为 80 ,"initial-number-wolves" 为 50. (这与你第一次打 开模型时接近) 设置"sheep-reproduce" 为 10.0%. 按下"setup" 和 "go". 模型运行约 100 时间步 本次运行狼群怎么样? 当你打开模型时,所有的滑动条和开关采用默认配置。如果你打开一个新模型或退出程 序,你的更改不会保存,除非你选择保存它们。 (注意:除了滑动条和开关,一些模型还有第三类配置元素,选择器(Chooser)。但本 模型没有。) 33 NetLogo 4.0.2 用户手册 收集信息:绘图和监视器 建模的一个目的是对那些难以在实验室中进行研究的问题收集数据。NetLogo 主要有两 个显示数据的方式:绘图和监视器。 绘图(Plots) 狼吃羊中的图有三条线:羊、狼和草/4(草除以 4 的原因是为了别使图形太高)。这些 线显示了随着时间推进模型中发生了什么。要想知道每条线代表什么,在图形窗口的右上角 单击”Pens”,打开画笔图例。一个关键字说明了每条线是什么。在本例中就是种群数量。 当图快被充满时,水平轴增加,以前的数据被压缩只占一部分空间,更多的空间用来绘 制将来的图形。 如果你想保存图上数据以备查看,或在另一个程序里进行分析,使用 File 菜单的 "Export Plot"。这些数据就被保存,数据格式可以被电子表格,如 Excel,或数据库程序识 别。也可以通过 Ctr+单击(Mac)或右击(Windows)弹出快捷菜单,然后选择"Export..."。 监视器(Monitors) 监视器是模型显示信息的另一种方法。下面是狼吃羊模型中的监视器: 监视器"time-ticks"告诉我们仿真时间。其他的监视器告诉我们狼、羊、草的数量。 (记 住,草的数量除以 4,为了别使图形太高) 当模型运行时监视器中的数值不断更新,而图形能显示模型整个运行过程中的数据。 注意 NetLogo 还有另一种监视器,叫做"agent monitors",在教学 2 里介绍。 控制视图 如果观察界面标签页,会看到沿工具条上边缘有一条控件。这些控件改变视图的不同方 面。 试试这些控件的效果。 • • 按下 "setup" 和 "go" 启动模型 模型运行时,将速度滑动条向左移动 发生什么? 如果模型运行的太快,你可以使用它看清细节。 34 NetLogo 4.0.2 用户手册 • • • 移动速度滑动条到中间 右移速度滑动条 现在试试勾选或不勾选“view updates”选择框 发生什么? 如果你不耐烦,想让模型运行的更快,可以快进也可以关闭视图更新。快进(速度滑动 条右移)关闭视图更新,因此模型运行的更快,这是因为更新视图需要时间。 当视图更新完全关闭后,模型继续在后台运行,绘图和监视器也一直在更新。如果你想 看看在发生什么,你需要重新勾选视图更新选项。当视图更新关闭后,多数模型运行速度更 快。 视图的尺寸由 5 个设置共同决定:最小 X、最大 X,最小 Y、最大 Y 和瓦片尺寸。现在 让我们看看当我们改变狼吃羊模型视图的尺寸时发生什么。 有更多的关于世界和视图的设置,因为工具条面积有限,没有放上。"Settings..."按 钮可以让你获得其他设置。 • 按下工具条上的"Settings..." 按钮 会打开一个对话框,其中包括所有视图设置: 35 NetLogo 4.0.2 用户手册 当前的 max-pxcor, min-pxcor, max-pycor, min-pycor 和 Patch size 是多少? • • 按下 "cancel" 按钮取消所做的改变。 将鼠标指针靠近视图,但不要进入视图窗口 注意到鼠标指针变成了十字型 • 按着鼠标按钮在视图上拖动 现在视图被选中,看到视图被灰框环绕,你可以确知这一点。 • • • 拖动黑色方块型“手柄” 。手柄在视图的边上和角上。 在界面标签页的白色背景的任何地方单击,反选视图 再次按下"Settings..." 按钮,看看设置 哪些数字改变了? 哪些数字没有改变? 36 NetLogo 4.0.2 用户手册 NetLogo 世界是由“瓦片”构成的二维网格,瓦片是网格中的一个方格。 在狼吃羊模型中,当"grass?"开关打开时瓦片很容易看到,因为一些瓦片是绿色的,一 些是褐色的。 可以把瓦片想象成地板上铺的方形瓷砖。默认情况下房子正中的一片瓷砖标记为(0,0), 意味着如果我们在水平和垂直方向画等分线,交叉点这在此处。这样我们就有了一个在房间 中定位对象的坐标系统: 瓷砖(0,0)与房间最右边之间有多少瓷砖? 瓷砖(0,0)与房间最左边之间有多少瓷砖? 在 NetLogo 中,从右到左的瓷砖数称为世界宽度(world-width)。从顶到低的瓷砖数 称为世界高度(world-height)。这些数字由顶、低、左、右边界(top, bottom, left and right)来定义。 37 NetLogo 4.0.2 用户手册 在这些图中,max-pxcor 是 3 , min-pxcor 是 -3, max-pycor 是 2 ,min-pycor 是 -2. 当你改变瓦片大小时,瓦片(瓷砖)的数量不变,只是屏幕上瓦片的大小变化了。 让我们看看改变世界的最小、最大坐标的效果。 • 使用仍在打开的 Settings 对话框, 改变 max-pxcor 为 30,max-pycor 为 10。注意 min-pxcor 和 min-pycor 也变了,这是因为默认原点 (0,0)在世界的中心。 视图的形状发生了什么变化? • 按下 "setup" 按钮 现在可以看到你创建的新瓦片 • • 再次按下"Settings..." 按钮 将瓦片大小设为 20,按下"OK". 视图的大小发生了什么变化? 它的形状变了吗? 编辑视图也可以让你改变其他设置,包括标签字体大小\视图是否使用形状(shape)。 随便试试这些设置吧。 当你探索完狼吃羊模型后,你可能想花点时间探索一下模型库中的其他模型。 模型库 模型库包括五部分: Sample Models, Perspective Demos, Curricular Models, Code Examples, HubNet Computer Activities. 模型样例(Sample Models) Sample Models 部分是分科目组织的,目前有 210 多个模型。我们一直在增加模型,因 此过段时间后能看到新加的模型。 有些文件夹下包含"(unverified)"子文件夹。这些模型是完整、可用的,但模型的内容、 38 NetLogo 4.0.2 用户手册 精度、代码质量等仍在评审之中。 视角演示(Perspective Demos) 这些模型在 Sample Models 中也有。但是略作修改,用来演示 NetLogo 的视角功能。 课程模型(Curricular Models) 这些模型是西北大学 CCL 开发的在学校使用的课程。有些模型在 Sample Models 中也有, 有些没有。看看信息标签页,了解更多的信息。 代码例子(Code Examples ) 这是 NetLogo 特别功能的一些简单演示。当你以后扩展现存模型或新建模型时很有用。 例如,你想在模型中增加直方图,可以看看"Histogram Example",看看怎么做。 HubNet 计算机活动(HubNet Computer Activities) 这一部分包括教室中使用的参与式仿真。要了解HubNet的更多信息,参见 HubNet Guide. 下一步? 如果想在更深的层次上探索模型,教学 2:命令 将引导你了解 NetLogo 建模语言。 在 教学 3:例程 中,你学习怎样替换现有模型,以及如何构建你自己的模型。 39 NetLogo 4.0.2 用户手册 教学# 2: 命令(Tutorial #2:Commands) 在教学#1,你有机会查看了一些 NetLogo 模型,我们引导你打开、运行模型、按下按钮、 改变滑动条和开关值,以及使用绘图和监视器从模型收集信息。在这一部分,焦点从观察模 型转换到操纵模型。你将开始看模型的内部运转,能够改变它们的样子。 模型实例: 基本交通模型(Traffic Basic) • • • • 到模型库去 (File 菜单). 在"Social Science"部分,找到并打开 Traffic Basic 运行模型两分钟,感受一下 如果有什么问题,去信息标签页查查 在这个模型里,你会注意到一系列蓝车里有一辆红车,车流同向移动。这些车时不时的 会挤成一堆,无法移动。这是关于幽灵式阻塞的模型,即有时交通流会出现阻塞,但却找不 到任何明显的原因,例如事故、断桥、侧翻的卡车等。要形成交通阻塞,没有“明显原因” (centralized cause)是需要的。 你可以改变配置运行几次,对模型有个全面理解。 当你使用这个 Traffic Basic 模型时,有没有注意到需要给模型增加什么? 看看这个模型,你会注意到环境太简单了,就是黑色背景、白色街道、一些蓝车和一辆 红车。需要对模型做点改变:改变车的形状和颜色、加上房子或路灯、新建信号灯、或者再 创建一条车道。这些建议有些是装饰性的,只是改善模型的观感,另外一些是行为性的。在 本教程里我们主要关注较简单的、装饰性的改变。(教学#3 深入介绍行为性改变,那需要 在 Procedures 页面中进行修改) 我们使用命令中心做这些简单改变。 命令中心(The Command Center) 命令中心位于Interface Tab页,在这里你可以向模型发出命令或指令。命令就是你可以 发给NetLogo主体(海龟、瓦片、链、观察者)的指示。(参见界面指南Interface Guide, 了解命令中心的各个部分) 在 Traffic Basic 中: • • • • 按下"setup" 按钮 找到命令中心 在命令中心底部的白框里按一下鼠标 输入下面所示的文本 40 NetLogo 4.0.2 用户手册 • 按回车键 视图发生什么变化? 你注意到视图背景变成了黄色,街道消失了。 为什么车没有变成黄色? 回头看看刚才输入的命令,我们只是请求瓦片改变颜色。在这个模型里,车辆用另外一 种称为”海龟”的主体表示。因此车辆并没有接收指令,也就没有改变。 命令中心发生了什么? 你可能没注意到你刚才输入的命令现在显示在命令中心的中间部分白框里,就像下面这 样: • 在命令中心底部的白框中输入下面的文本: 结果和你想的一样吗? 视图里是黄色背景,中间是一串灰色的车: 41 NetLogo 4.0.2 用户手册 NetLogo是由海龟、瓦片和观察者组成的二维世界。瓦片构成背景,海龟在背景上移动, 观察者(observer)是观察着所有事情的一个主体。(关于世界的细节,参考 NetLogo编程 指南NetLogo Programming Guide) 在命令中心,我们可以给海龟、瓦片和观察者发出命令。我们通过命令中心左下角的弹 出式菜单进行选择,也可以用 Tab 键在选项之间循环。 • 在命令中心,单击左下角的"observer>": • 在弹出菜单中选 "turtles" 输入 set color pink ,回车 按下 tab 键直到在左下角看到"patches>" 输入 set pcolor white,回车. • • • 现在视图看起来怎么样? 你注意到这两条命令和前面的 observer 命令的区别了吗? 观察者(observer)俯视着世界,因此使用ask向瓦片或海龟发出命令。正如第一个例 子那样(observer> ask patches [set pcolor yellow]),observer必须请求(ask)瓦片把 它的颜色pcolor设为黄色。但在第二个例子中,命令直接发给了一组主体(patches> set pcolor white),你只需直接给出命令。 • 按下"setup". 发生什么? 为什么视图变回了原样,还是黑背景白路?因为按下"setup"后,模型重新按例程页中 的内容配置模型。命令中心一般不用来对模型做永久性修改,而是用来对当前模型进行定制, 让你能操纵模型,回答探究模型时冒出来的“what if”问题。(例程页(Procedures tab) 在下个教学里解释,也可参考编程指南Programming Guide.) 我们已熟悉了命令中心,再看看 NetLogo 中关于颜色的一些细节。 42 NetLogo 4.0.2 用户手册 操纵颜色 你可能注意到在上面我们使用了两个不同的词来改变颜色:color与 pcolor. color 与 pcolor 有何区别? • • 在命令中心的弹出菜单中选 "turtles" (或使用 tab 键). 输入set color blue,回车 车辆发生什么变化? 思考一下你做了什么让车变成了蓝色,试试把瓦片变成红色。 如果想让瓦片变成红色,出现一条错误信息: • 输入set pcolor red,回车. color 和pcolor是变量(variables)。有些命令和变量是海龟专用的,有些是瓦片专用 的。例如,color是一个海龟变量,而pcolor是一个瓦片变量。 继续尝试,使用set命令和这两个变量改变海龟和瓦片颜色。 为了能对海龟和瓦片做更多的颜色改变,也就是车辆和背景,我们需要了解 NetLogo 如何处理颜色。 在 NetLogo 所有颜色对应一个数值。 在这些练习里我们使用了颜色名,只是因为 NetLogo 认识 16 个不同的颜色名。这并不意味 NetLogo 只能分辨 16 种颜色,这些颜色之间的中间色 也可使用。下面是 NetLogo 颜色空间的一张图: 43 NetLogo 4.0.2 用户手册 为得到一个没有名字的颜色,你需要使用一个数值,或者在颜色名上加上或减去一个数。 例如,输入set color red与输入set color 15 效果完全一样。要得到一个更浅或更深的颜 色,只需使用一个比该颜色更小或更大的一个数。如下所示: • • 在命令中心的弹出菜单选 "patches" (或使用 tab 键). 输入 set pcolor red - 2 ("-" 两侧的空格很重要) 通过在 red 上减去一个数, 得到更深的颜色。 • 输入 set pcolor red + 2 通过在 red 上加上一个数, 得到更浅的颜色。 图上任何颜色均可采用这种方法。 主体监视器(Agent Monitors)和主体命令器(Agent Commanders) 上面我们使用 set 命令改变所有车辆的颜色。你是否记得,最初的模型中一群蓝车里有 一辆红车。现在看看怎样只改变一辆车的颜色。 44 NetLogo 4.0.2 用户手册 • • • 按下 "setup" 让红车再次出现 如果使用 Macintosh,按下 Ctrl 在红车上单击。其他操作系统的话,在红车上右击 如果有别的海龟与红车太近,你可能看到在菜单底部列出多个海龟。将鼠标移动到 海龟菜单项上,注意到菜单和视图中海龟都加亮了。在红色海龟项的子菜单中选 "inspect turtle"。 关于那辆车的一个海龟监视器出现了: 仔细看看海龟监视器,可以看到属于红车的所有变量。变量是存储数值的,可以改变。 还记得我们说过颜色在计算机里都是用数字表示的吗?对主体也一样。例如,每个主体都有 一个 ID 号,叫做"who number"。 再看看海龟监视器。 海龟的 who number 是多少? 海龟颜色是什么? 海龟形状是什么? 这个监视器显示该海龟的 who number 是 0,颜色 15(红色),形状是“ car”。 除了右击(mac 上是Ctrl+单击)外,还有两个方法打开海龟监视器。方法 1 是从Tools 菜单选择"Turtle Monitor",然后在“who”域中输入要查看的海龟的ID,回车。另一种方 法是在命令中心输入inspect turtle 0(或其他ID)。 要关闭海龟监视器,只需在窗口左上角关闭标志( Macintosh)或右上角关闭标志(其 他操作系统)上单击。 现在了解了主体监视器,有三种方式改变一个海龟的颜色。 第一种是使用主体监视器底部的主体命令器(Agent Commander)。在这输入命令,就 45 NetLogo 4.0.2 用户手册 像在命令中心一样,只是在这输入的命令只由这个海龟执行。 • 在海龟 0 主体监视器中的主体命令器 中输入set color pink. 视图发生什么变化? 海龟监视器有什么变化吗? 第二种是直接改变海龟监视器中的 color 变量 • • 在海龟监视器中选择 "color" 右侧的文本. 输入新颜色,如green + 2. 发生什么? 第三种是使用观察者(observer)改变海龟或瓦片的颜色。因为 observer 俯视着 NetLogo 世界,它可以发出命令,影响单个或一组海龟。 • • 在命令中心的弹出菜单,选择 "observer" (或使用 tab 键). 输入 ask turtle 0 [set color blue] ,回车 发生什么? 除了海龟监视器(Turtle Monitors),也有瓦片监视器(Patch Monitors)。 瓦片监 视器与海龟监视器很相似。 你能使用瓦片监视器改变单个瓦片的颜色吗? 如果你让观察者(observer )请求瓦片 0 改变颜色(ask patch 0 [set pcolor blue]) ,会出现一条错误信息。 要让某个海龟做什么,我们使用 who number。但瓦片没有 who number,需要其他方法。 记住,瓦片存在于一个坐标系统中。要在图上画个点需要两个数:x 坐标和 y 坐标。瓦 片的定位方式与此相同。 • 随便选一个瓦片,打开瓦片监视器 46 NetLogo 4.0.2 用户手册 监视器表明这个瓦片的pxcor变量是-11,pycor 是 -4。在坐标平面上,这个点处于 左下象限。 使用坐标让这个特定的瓦片改变颜色。 • 在瓦片监视器的底部,输入set pcolor blue,回车. 在海龟或瓦片的监视器中输入命令只对这个海龟或瓦片管用。 在命令中心也可操作单个瓦片: • 在命令中心输入ask patch -11 -4 [set pcolor green] ,回车 下一步? 此时也许你想打开模型库的其他模型,试试刚学的这些技术。 在 教学#3:例程 你将学习怎样替换、修改已有模型,或构建自己的模型。 47 NetLogo 4.0.2 用户手册 教学 #3: 例程(Tutorial #3:Procedures) 本教程带你一步步建立一个完整的模型,对每一步做出解释。 主体和例程 在教学#2 你学习了怎样使用命令中心和主体监视器查看和修改主体,让他们执行动作。 现在准备进入 NetLogo 模型的真正核心:例程页。 你已经使用了 NetLogo 中可以执行命令的主体类型:瓦片、海龟、链和观察者。瓦片是 静止的,组成网格。海龟在网格上移动,链链接两个海龟。观察者俯视在进行的所有事情, 做那些海龟、瓦片和链自己不能做的事情。 所有这四种主体都能执行 NetLogo 命令。前三种主体还能运行例程(procedures)。一 个例程包括一系列 NetLogo 命令,你将它们定义为一个单一的新命令。 你将学习编写例程,让海龟移动、进食、繁殖和死亡。还将学习如何制作监视器、滑动 条和绘图。我们要建立一个简单的生态系统模型,与教学#1 的狼吃羊模型部分相似。 制作 setup 按钮 要开始一个新模型,在 File 菜单中选择 New。然后从创建一个 setup 按钮开始: • • • • 在界面页上部的工具条上单击 "Button" 图标 在界面页的空白区域,定位到你想放置按钮的地方单击 编辑按钮的对话框出现了。在标签为"Commands"的文本域中输入setup 按下 OK 按钮,对话框关闭 现在有了一个 setup 按钮。按下按钮就执行一个名为"setup"的例程。例程就是一系列 的 NetLogo 指令,我们给定一个新名字。现在还没有定义例程(一会就做)。由于按钮指向 的例程现在还不存在,按钮变成了红色: 48 NetLogo 4.0.2 用户手册 要想看实际的错误信息,单击该按钮。 现在创建"setup"例程,这样错误信息就会消失。 • • 切换到 Procedures 页 输入下面的代码: to setup clear-all create-turtles 100 ask turtles [ setxy random-xcor random-ycor ] end 做完后,Procedures 页就像下面的样子: 注意每行缩进量不同。多数人觉得代码这样缩进很有用,但这不是强制的,只是使得代 码易读易改而已。例程以to开始,以end结束。所有的例程都要用这两个词开始和结束。 看看你输入了什么,每行是干什么的? • • • • • to setup 开始定义一个名为"setup"的例程 clear-all 将世界重设为初始、全空状态。所有瓦片变黑,你已经创建的海龟消失。 基本上是将过去一笔勾销,为新模型运行做好准备。 create-turtles 100 创建 100 个海龟。这些海龟都在原点,即瓦片 0,0 的中心。 ask turtles [ ... ] 告诉每个海龟独立地去运行方括号中的命令 (NetLogo中每条 命令都是由某些主体执行的。 ask 也是一条命令。在这里是observer运行这条ask 命 令,这条命令又引起海龟运行命令) setxy random-xcor random-ycor 是一条使用"reporters"的命令。reporter与命令不同, 它只报告一个结果。首先每个turtle 运行reporter random-xcor,它返回 X坐标范围 内的一个随机数,然后每个turtle运行 reporter random-ycor, 返回Y坐标范围的一个 随机数。最后每个turtle 使用前面的两个数做输入参数运行setxy 命令,这使得turtle 移动到相应的坐标处。 49 NetLogo 4.0.2 用户手册 • end 结束"setup" 例程的定义。 输入完成后,切换到界面页,按下前面制作的 setup 按钮 ,你将看到海龟分散在世界 内: 多按 setup 几次,看看海龟的散布有何不同。 注意有些海龟会叠压在一起。 稍微想想要达到这样的结果需要做哪些事情。你要在界面页里做一个按钮,还要创建该 按钮要使用的一个例程。只有这两步都做了,按钮才能工作。在本教程的剩余部分,经常需 要做类似两步或更多步,为模型增添新功能。在增加新功能时,当你觉得该做的步骤都完成 了,但就是不能正常工作时,那就继续向前读,看看是否还要其他步骤。读过几节后,返回 来看看是否遗漏了某个步骤。 制作 go 按钮 现在做个 "go"按钮。步骤与 setup 按钮的一样, 除了下面几点: • • 在命令部分输入 go,而非setup. 在编辑对话框里勾选 "forever" 50 NetLogo 4.0.2 用户手册 "forever" 勾选项使得按钮按下后保持按下状态,因此命令会不断重复执行,而不是只 执行一次。 • 在 Procedures 也增加 go 例程: to go move-turtles end move-turtles是什么? 它是一个象clear-all那样的原语(NetLogo内嵌的)吗? 非也,它 是一个需要你添加的例程。至今你已经有两个自己添加的例程了:setup 和go • 在go例程后面增加move-turtles 例程: to go move-turtles end to move-turtles ask turtles [ right random 360 forward 1 ] end 51 NetLogo 4.0.2 用户手册 注意move-turtles中间的连字符两侧没空格。教学#2 中用过的red – 2 有空格,是为 了做减法操作。此处我们要的是move-turtles,没空格。 "-" 将 "move" 和"turtles" 组 成一个词。 例程move-turtles中的命令: • • • ask turtles [ ... ] 每个turtle运行[ ]中的命令 right random 360 是使用reporter的命令。首先每个turtle 在 0 和 359 之间随机选一 个整数 (random 不会返回你给它的数) ,然后turtle 右转这个度数。 forward 1 让turtle前进 1 步。 为什么我们不把所有这些命令都写在 go 例程里,而是分为几个例程?确实可以这样做, 但是在创建你的项目的过程中,你很可能会增加更多的东西。最好保持 go 例程尽量简单, 这样更容易理解。最后还会包括许多其他的东西,比如计算,画图等。这些事情由相应的例 程完成,每个例程有各自的名字。 界面页中的 go 按钮是永久性的,意味着将不断执行命令,直到你关掉它(重新单击它)。 按下 setup 按钮,创建海龟,然后按下 go 按钮。观察模型。关闭它,你会看到所有海龟停 住了。 注意当海龟越过世界边缘时,它要回绕(wrap),即出现在另外一边。(这是默认行为, 可以改变,详情参加编程指南的Topology部分。) 试试命令 我们建议你试试其他海龟命令。 在命令中心输入命令 (如 turtles> set color red), 或在setup, go, move-turtles 中添加命令。 注意在命令 中心输入命 令时,你必 须使用弹出 菜单选择turtles>, patches>, or observer>,具体选择取决于哪个主体将执行命令。这就像ask turtles 或 ask patches一 样,只是不用打字而已。你可以使用tab键在主体类型之间切换,这比用菜单更方便。 可以试试在命令中心输入turtles> pen-down,然后按下go 按钮。 在move-turtles例程中,试试将right random 360 改为 right random 45。 玩吧。很容易,并且结果立现 —- 这是 NetLogo 许多优点之一。 试验够了吧,准备继续改进模型。 瓦片和变量 现在我们有 100 个海龟,它们漫无目的的移动,对周围的事物毫无知觉。下面我们给海 龟一个好点的背景,让模型稍微有趣一些。 • 回到setup 例程,修改例程如下: to setup 52 NetLogo 4.0.2 用户手册 clear-all setup-patches setup-turtles end • 新的 setup引用了两个新例程,定义 setup-patches : to setup-patches ask patches [ set pcolor green ] end 例程setup-patches将开始时所有瓦片颜色定义为绿色。(海龟的颜色变量是color,瓦片的 是pcolor) • 加上这个例程 to setup-turtles create-turtles 100 ask turtles [ setxy random-xcor random-ycor ] end 你是否注意到新的setup-turtles与老的setup包含许多相同的命令? • • 切换回 Interface 页 按下 setup 按钮 瞧! 由海龟和绿色瓦片构成的 NetLogo 风景 : 53 NetLogo 4.0.2 用户手册 看过新setup例程的效果后,你会发现重新读读这个例程很有帮助。 海龟变量 目前海龟在可以地表上移动,但什么都不做。现在在海龟和瓦片之间加上一些交互。 我们让海龟吃“草”(绿色瓦片),繁殖、死亡。草被吃掉后要逐渐恢复。 我们需要一种控制海龟繁殖和死亡的方式。我们通过跟踪海龟有多大能量(energy)来 决定。要这样的话需要增加一个新的海龟变量。 你已经见过一些内置的海龟变量,如color。要添加新的海龟变量,需要在例程页的顶 部加上turtles-own 声明,这个声明必须在所有例程之前,变量名为energy: turtles-own [energy] to go move-turtles eat-grass end 使用这个新定义的变量(energy),允许海龟吃草。 54 NetLogo 4.0.2 用户手册 • 切换到 Procedures 页 • 重写go 例程如下: to go move-turtles eat-grass end • 加上新例程eat-grass : to eat-grass ask turtles [ if pcolor = green [ set pcolor black set energy (energy + 10) ] ] end 我们第一次使用if 命令,仔细看看代码。当每个海龟执行这些命令时,比较它所处的 瓦片的颜色(pcolor)与绿色是否相同。(海龟能直接访问所处瓦片的变量),如果瓦片是绿 色则返回true,这时才执行[ ]中的命令(否则跳过)。这些命令让海龟将瓦片改为黑色, 海龟能量值增加 10。瓦片变黑表明该处的草被吃掉,因为吃了草,海龟能量增加。 下面,让海龟移动时消耗一些能量: • 重写move-turtles如下: to move-turtles ask turtles [ right random 360 forward 1 set energy energy - 1 ] end 当海龟移动时,每步减少 1 个单位的能量。 • 切换到 Interface 页 ,按下 setup 和 go 按钮 你将看到当海龟走到瓦片上时,瓦片变为黑色。 55 NetLogo 4.0.2 用户手册 监视器(Monitors) 下面使用工具条在 Interface 页中创建 2 个监视器。(像使用按钮、滑动条一样,使用 工具条上的监视器图标)。先做第一个监视器。 • 使用工具条上的监视器图标,在界面页空白处创建一个监视器。 出现对话框 • • 在对话框中输入: count turtles (见下图). 按 OK 关闭地对话框 56 NetLogo 4.0.2 用户手册 turtles 是一个"agentset",即所有海龟的集合。count告诉我们这个集合中有多少主体。 制作第二个监视器: • 使用工具条上的监视器图标,在界面页空白处创建一个监视器。 出现对话框。 在对话框的Reporter部分输入:count patches with [pcolor = green] (见下图). 在 Display name 部分输入: green patches 按 OK 关闭对话框 57 NetLogo 4.0.2 用户手册 此处我们再次使用count查看一个agentset中有多少主体。patches是所有瓦片的集合, 但我们并不想知道总共有多少瓦片,而是想知道有多少绿色的。这就是with要做的,它创建 一个较小的agentset,只有满足[ ]中的条件的主体才会包含进来,条件是pcolor = green, 因此得到的是绿色瓦片。 现在有两个监视器报告有多少海龟,有多少绿色瓦片,帮助我们跟踪模型运行。模型运 行时,监视器中的数字自动变化。 使用 setup 和 go 按钮,观看监视器数值的变化。 开关和标签(Switches and labels) 海龟不仅是将瓦片变黑,它们还获得、损失能量。模型运行时试试使用海龟监视器查看 一个海龟的能量变化。 如果能在任何时候看到所有海龟的能量就更好了。现在就这样做,并且增加一个开关能 控制这些额外信息显示与否。 • 在界面页 的工具条上选择开关图标,在空白处单击,创建一个开关。 出现对话框。 • 在对话框的Global variable 部分输入 show-energy? 别忘了包括问号 (见下图) 58 NetLogo 4.0.2 用户手册 • 返回 'go' 例程 • 重写 eat-grass 例程如下: to eat-grass ask turtles [ if pcolor = green [ set pcolor black set energy (energy + 10) ] ifelse show-energy? [ set label energy ] [ set label "" ] ] end 例 程 eat-grass 用 了 ifelse 命 令 , 仔 细 看 代 码 。 每 个 海 龟 当 运 行 这 些 新 命 令 时 检 查 show-energy?的值(由开关决定)。如果开关打开,比较结果为true,海龟执行第一个[ ] 中的命令。这时将能量值赋给海龟标签。如果比较结果为false(开关关闭),海龟执行第二 个[ ]中的命令,这时移去文本标签(通过将海龟标签设为空)。 (在 NetLogo 中几个字符称为字符串(string)。字符串是在双引号之间的一串字母和 字符。此处两个双引号之间什么也没有,这是一个空串。如果海龟的标签是空串,就表示没 有任何文本。) • 测试一下。在界面页中运行模型(使用setup和go),来回拨动 show-energy? 开关。 当开关打开时,能看到海龟的能量因吃草而增加,移动时减小 59 NetLogo 4.0.2 用户手册 更多例程 现在海龟在吃草,再让它们繁殖和死亡,也让草能恢复。现在增加三个例程,分别负责 这三种行为。 • • 切到 Procedures 页 重现 go 例程如下: to go move-turtles eat-grass reproduce check-death regrow-grass end • 增加例程reproduce, check-death 和regrow-grass 如下: to reproduce ask turtles [ if energy > 50 [ 60 NetLogo 4.0.2 用户手册 set energy energy - 50 hatch 1 [ set energy 50 ] ] ] end to check-death ask turtles [ if energy <= 0 [ die ] ] end to regrow-grass ask patches [ if random 100 < 3 [ set pcolor green ] ] end 这些例程都使用了if命令。当繁殖时,每个海龟检查它的energy值,如果大于 50 执行 第一个[ ]中的命令。在这里energy减少 50,然后孵出(hatches)一个energy为 50 的新海 龟。hatch命令是NetLogo的一个原语,形如hatch number [ commands ],海龟创建number 个新海龟,每个都与母体相同,并且请求这些新海龟执行commands,你可以使用commands 让这些新海龟有不同的颜色、方向等。这里运行一条命令,将新海龟的energy设为 50。 当每个海龟运行check-death时,它检查energy是否小于等于 0。如果是真,则海龟被 告知去死die(这是NetLogo的一个原语)。 当每个海龟运行regrow-grass 时,它检查随机产生的 0-99 之间的整数是否小于 3。如 果是,瓦片颜色设为绿。对每个瓦片来说,发生的次数(平均)是 3%,因为在 100 个可能 的数中,有三个数(0,1,2)小于 3。 • 切换到 Interface 页,按下 setup 和 go 现在能看到模型的一些有趣行为。一些海龟死掉,一些新海龟出现(孵出),一些草恢 复。这正是我们要做的。 如果继续看模型的监视器,会发现 count turtles 和 green patches 监视器都有振荡。 振荡模式能预测吗?这些变量之间有关系吗? 如果有更容易的跟踪模型行为的方式就更好了。NetLogo 可以为我们画图,这是下面要 讲的。 61 NetLogo 4.0.2 用户手册 画图(Plotting) 要想画图的话,需要在界面页创建一个 plot,做一些设置。然后在例程页增加一些例 程,这些例程为我们更新绘图。 先做例程页中的工作。 • 修改 setup,调用将要增加的新例程do-plots to setup clear-all setup-patches setup-turtles do-plots end • 还要修改 go ,调用do-plots to go move-turtles eat-grass reproduce check-death regrow-grass do-plots end • 增加新例程。我们要画的是海龟的数量和绿瓦片的数量。在每个时间步 (go 例程的 一次运行)把这些值加到图中。 to do-plots set-current-plot "Totals" set-current-plot-pen "turtles" plot count turtles set-current-plot-pen "grass" plot count patches with [pcolor = green] end 注意使用plot命令在图上增加新点。然而在这样做之前,需要告诉NetLogo两件事。第 一,需要指明要使用哪个图(因为后面的模型有多个图)。第二,要指定使用哪支笔(pen) 画图(本图使用两支笔)。 plot命令告诉画笔移动到新点,新点的X 坐标是先前的X坐标加 1,Y坐标就是plot命令中 给定的值(第一种情况是海龟数量,第二种情况是绿瓦片数量)。当画笔移动时就画出线。 62 NetLogo 4.0.2 用户手册 为了让set-current-plot "Totals"工作,必须在界面页中为你的模型增加一个图 (plot),然后进行编辑,让它的名字与例程中用到的相同。即使名字中多个空格也会出错 ---两处必须完全相同。 • • • • 在界面页上使用 plot 图标创建一个 plot 设置图名为"Totals" (见下图) 设置 X 轴标签为"time" 设置 Y 轴标签为"total" 下一步创建两支笔(pen)。 • • • • • • 在 Plot 对话框中,按下'Create' 按钮创建一支新笔 输入笔的名字"turtles",在"Enter Pen Name"对话框中按下 OK (见下图) 在 Plot 对话框中,按下'Create' 按钮创建第二支新笔 输入笔的名字"grass" ,在"Enter Pen Name"对话框中按下 OK (见下图) 选择笔的颜色,变为 green. 在 Plot 对话框中选择 OK 63 NetLogo 4.0.2 用户手册 注意在创建图的时候,也可设置 X,Y 轴的最大最小值。让"Autoplot?"勾选着,如果图 超过坐标轴的设定范围,坐标轴会自动增长,使你能看到所有数据。 • 再次按 Setup 和 go,运行模型 你会看到模型运行时就能绘图。图的样子与下图相似,尽管可能不完全一样。 记住我们让"Autoplot?"打开。这使得没有空间时,图能自动调整。 如果你忘了哪支笔是干什么的,单击图的右上角处 Pens 标签。你试试运行模型几次, 看看这些图哪些部分相同哪些不同。 时钟计数器(Tick counter) 在比较同一模型多次运行得到的图时,如果每次运行长度相同会很有用。学会怎样让模 型在特定的时刻停止或启动很有帮助,因为我们可以让模型在同一时刻停止。跟踪 go 例程 运行了多少次是实现这一技术的关键。 要跟踪这一点,使用 NetLogo 内建的时钟计数器(tick counter) • 修改 go 例程 64 NetLogo 4.0.2 用户手册 to go if ticks >= 500 [ stop ] move-turtles eat-grass reproduce check-death regrow-grass tick do-plots end • 按下 setup ,再运行模型 图形和模型不会一直运行下去,当界面页工具条上的时钟计数器达到 500 时,模型自动 停止。 tick命令将时钟计数器加 1, ticks是一个报告器,返回时钟计数器当前值。每次重新运行 时clear-all将时钟计数器清 0. 注意tick在do-plots之前。如果绘图代码使用时钟计数器就要这样,它会查看新值,而 非旧值。(本教程实际没写这样的代码,但是一般说来将tick放在主体动作之后、绘图之前 是个好做法) 现在模型使用了 ticks,你可能想使用界面页顶部的菜单从连续更新(continuous updates)变为基于时钟更新("tick-based" updates)。这意味着 NetLogo 仅在时钟点上 更新(重画)视图(主体显示区),tick 中间不更新。这样模型运行的更快一些,并保证 稳定观感(因为更新的时间间隔固定)。关于视图更新的全部讨论见编程指南。 更多细节 首先,可以有可变数量的海龟,而非总是 100 个。 • • 增加一个滑动条 'number', 改变最大最小值 在例程 setup-turtles中,不使用create-turtles 100,而是: to setup-turtles create-turtles number ask turtles [ setxy random-xcor random-ycor ] end 测试一下。比较初始时刻海龟更多或更少时图的变化. 其次,如果能调整海龟吃草获得的能量和移动时消耗的能量不是更好吗? 65 NetLogo 4.0.2 用户手册 • • • 增加滑动条energy-from-grass. 增加滑动条birth-energy 修改eat-grass例程: to eat-grass ask turtles [ if pcolor = green [ set pcolor black set energy (energy + energy-from-grass) ] ifelse show-energy? [ set label energy ] [ set label "" ] ] end • 修改 reproduce: to reproduce ask turtles [ if energy > birth-energy [ set energy energy - birth-energy hatch 1 [ set energy birth-energy ] ] ] end 最后,如果要改变草的恢复率应该增加什么滑动条?能增加什么海龟移动规则,或让孵 化只发生在特定时刻,试着写出来。 下一步? 现在有了一个简单生态系统模型。瓦片长草,海龟移动、吃草、繁殖、死亡。你创建了 界面,包括按钮、滑动条、开关、监视器和绘图。甚至写了一些例程让海龟做事。 教学到此结束。 如果要看更多的NetLogo文档,界面指南Interface Guide让你了解NetLogo所有界面元 素的功能。要写例程,看编程指南Programming Guide。所有原语在NetLogo词典NetLogo Dictionary。 如果愿意,你还可以继续试验、扩展本模型,试验主体不同的变量和行为。 另外,还可以再看教学#1 的狼吃羊模型。你看到羊走来走去,消耗资源,资源随机补 充,一定条件下繁殖,没有资源时死亡。该模型还有另一类生物—狼。增加狼需要另外的例 66 NetLogo 4.0.2 用户手册 程及新的原语。狼和羊是两种不同的物种(breeds),研究该模型,了解怎样使用 breeds。 另外,还可以查看其他模型(包括模型库中的 Code Examples),甚至继续建立自己的 模型。你甚至不必建模,只是看着瓦片和海龟形成模式就很有趣,或试着创建个游戏玩玩, 等等。 希望你学到了一些东西,包括 NetLogo 语言及如何建模。上面创建的所有例程列在下面。 附录:完整代码 这些完整代码在 NetLogo 模型库里也有,在 Code Examples 部分,名为 "Tutorial 3"。 注意代码有注释,注释由分号开始。使用注释帮助你理解模型。 在例程页,注释是灰的,容易区别。 turtles-own [energy] ;; for keeping track of when the turtle is ready ;; to reproduce and when it will die to setup clear-all setup-patches setup-turtles do-plots end to setup-patches ask patches [ set pcolor green ] end to setup-turtles create-turtles number ;; uses the value of the number slider to create turtles ask turtles [ setxy random-xcor random-ycor ] end to go if ticks >= 500 [ stop ] ;; stop after 500 ticks move-turtles eat-grass reproduce check-death regrow-grass tick ;; increase the tick counter by 1 each time through do-plots end 67 NetLogo 4.0.2 用户手册 to move-turtles ask turtles [ right random 360 forward 1 set energy energy - 1 ;; when the turtle moves it looses one unit of energy ] end to eat-grass ask turtles [ if pcolor = green [ set pcolor black ;; the value of energy-from-grass slider is added to energy set energy (energy + energy-from-grass) ] ifelse show-energy? [ set label energy ] ;; the label is set to be the value of the energy [ set label "" ] ;; the label is set to an empty text value ] end to reproduce ask turtles [ if energy > birth-energy [ set energy energy - birth-energy ;; take away birth-energy to give birth hatch 1 [ set energy birth-energy ] ;; give this birth-energy to the offspring ] ] end to check-death ask turtles [ if energy <= 0 [ die ] ;; removes the turtle if it has no energy left ] end to regrow-grass ask patches [ ;; 3 out of 100 times, the patch color is set to green if random 100 < 3 [ set pcolor green ] 68 NetLogo 4.0.2 用户手册 ] end to do-plots set-current-plot "Totals" ;; which plot we want to use next set-current-plot-pen "turtles" ;; which pen we want to use next plot count turtles ;; what will be plotted by the current pen set-current-plot-pen "grass" ;; which pen we want to use next plot count patches with [pcolor = green] ;; what will be plotted by the current pen end 69 NetLogo 4.0.2 用户手册 界面指南(Interface Guide) 手册的本部分带你依次了解 NetLogo 界面的所有要素,并解释其功能。 在 NetLogo 里你可以查看模型库中的模型,增加东西,或创建你自己的模型。NetLogo 界面设计用来满足所有需求。 界面分成两个主要部分:菜单和主窗口。主窗口分成标签页面。 • • • • • • 菜单 标签页 Interface 标签页 o 使用界面元素 o 2D 和 3D 视图 o 命令中心 o 绘图 Infomation 标签页 Procedures 标签页 Includes 菜单 菜单 在 Macs,如果运行 NetLogo 应用程序,菜单条在屏幕顶部。在其他平台,菜单条在 NetLogo 窗口的顶部。 菜单条上的各菜单的功能如下表所列。 表: NetLogo 菜单 File New 创建一个新模型 Open 在计算机上打开任何一个模型 Models Library 演示模型的集合 Save 保存当前模型 Save As 使用一个其他的名字保存当前模型 Save As Applet 用来保存一个 HTML 格式的网页,其中以 Java applet 嵌 入你的模型 Print 将当前显示的页面内容发送到打印机 70 NetLogo 4.0.2 用户手册 Export World 保存所有变量、海龟和瓦片的当前状态、画图、绘图、输 出区域和随机状态信息到一个文件 Export Plot 将绘图中的数据保存到文件 Export All Plots 将所有绘图中的数据保存到文件 Export View 将当前视图(2D 或 3D)作为图片保存到文件 (PNG 格式) Export Interface 将当前界面页作为图片保存 ( PNG 格式 ) Export Output 将输出区域的内容或命令中心的输出部分保存到文件 Import World 加载用 Export World 保存的文件 Import Patch Colors 将一个图像加载到瓦片,见import-pcolors命令 Import Patch Colors RGB 使 用 RGB 颜 色 将 一 个 图 像 加 载 到 瓦 片 ; 见 import-pcolors-rgb 命令 Import Drawing 将一个图像加载到画图层,见import-drawing 命令 Import HubNet Client Interface 将其他模型的界面加载到 HubNet Client Editor. Quit 退出 NetLogo。 (在 Mac, 这一项在 NetLogo 菜单) Cut 剪切或移除选中的文本,临时存到剪贴板 Copy 复制选中的文本 Paste 将剪贴板上的文本放到光标处 Delete 删除选择的文本 Undo 撤销上一个文本编辑操作 Redo 重做上一个 undo 操作 Select All 选择活动窗口中的所有文本 Find 在信息页或例程页查找一个词或字符序列 Find Next 查找下一处 Shift Left / Shift Right 在例程页用于改变代码缩进层次 Comment / Uncomment 在例程页使用,在代码中增加或移去分号(分号作为注释 标志) Snap To Grid 当激活时,新部件停在 5 个像素宽的网格上,这样容易对 齐。(注意:当缩放时本功能失效) Halt 停止所有代码的运行,包括按钮和命令中心。(警告:因 为代码强制中断,如果继续运行时没有用"setup"重新启 动模型,可能得到不期望的结果) Globals Monitor 显示所有全局变量的值 Turtle Monitor 显示特定海龟的所有变量值。也可编辑海龟变量的值,或 向海龟发出命令。(也可以通过视图打开海龟监视器,见 下面的视图部分) Patch Monitor 显示特定瓦片的所有变量值。也可编辑瓦片变量的值,或 向瓦片发出命令。(也可以通过视图打开瓦片监视器,见 下面的视图部分) Link Monitor 显示特定链的所有变量值。也可编辑链变量的值,或向链 Edit Tools 71 NetLogo 4.0.2 用户手册 发出命令。(也可以通过视图打开链监视器,见下面的视 图部分) Hide/Show Center Command 使命令中心可见或不可见。(注意命令中心也可以用鼠标 实现显示、隐藏、改变大小) 3D View 打开 3D 视图。见下面的视图部分。 Color Swatches 打开 Color Swatches。见编程指南的颜色部分 Turtle Editor 画海龟图形。更多信息见图形编辑器指南。 Shapes Link Shapes Editor 画链图形。更多信息见图形编辑器指南。 BehaviorSpace 使用不同的设置重复运行模型。更多信息见行为空间指南 System Modeler Dynamics 打开系统动力学建模工具。更多信息见系统动力学建模工 具指南 HubNet Editor Client 打开 HubNet Client Editor。更多信息见 HubNet 编程指 南 HubNet Center Control 如果没有 HubNet 活动则不能用。更多信息见 HubNet 指南 Zoom Larger 增加模型的屏幕大小。在大的监视器或投影上有用。 Normal Size 将模型的屏幕大小重设为正常大小 Smaller 减小模型的屏幕大小 Tabs 本菜单提供了每个页的快捷键 (Mac 上是 Command 1 到 Command 3。在 Windows,是 Control 1 到 Control 3.) Help About NetLogo Look Up Dictionary 显 示 关 于 当 前 NetLogo 的 版 本 信 息 ( 在 Mac, 该 项 在 NetLogo 菜单) In 对命令或报告器在浏览器中打开相应词典条目 NetLogo User Manual 在浏览器中打开本手册 NetLogo Dictionary 在浏览器中打开词典 标签页 在 NetLogo 主窗口的顶部是三个标签页:Interface(界面)、Information(信息)和 Procedures(例程),任一时刻只有其中之一可见,但可以通过单击窗口顶部的标签进行切换。 在这些标签下方是一个工具条,上面有一排按钮,当切换标签时会显示不同的按钮。 72 NetLogo 4.0.2 用户手册 界面页 在界面页查看模型的运行,其中有工具用来监视和更改模型内部的运行情况。 当首次打开 NetLogo 时,界面页只有主视图和命令中心,主视图显示海龟和瓦片,命令 中心用来发出 NetLogo 命令。 使用界面元素 界面页的工具条包括按钮,按钮用来编辑、删除、创建界面项,还有一个菜单用来选择 不同的界面项(例如按钮和滑动条)。 工具条上的按钮如下所述。 添加:要添加界面元素,首先在下拉菜单中选择所需元素,注意 Add 按钮呈按下状态, 然后在工具条下方的空白区单击。(如果菜单项已经显示所需的类型,只需按下 Add 按钮, 不用使用菜单) 选择:要选择一个界面元素,用鼠标拖出一个矩形包围它。该元素会出现灰色边框,表 明被选中了。 选择多项:通过用拖出的矩形同时包围多个界面元素,可以选中多项。如果选择了多项, 其中一项是"key"项,含义是如果使用界面页工具条上的"Edit" 或 "Delete",则只影响 "key"项。"key"项上是一个深灰色边框,以示区别。 取消选择:要取消所选的所有元素,在界面页的空白处单击。要取消选择某个元素,Ctrl单击(Macintosh)或右击(其他系统)该元素并在弹出菜单中选择"Unselect"。 编辑:要改变一个界面元素的特性,选择该元素,按下界面页工具条的"Edit"按钮。也 可以选择该元素后双击。 移动:选中界面元素,用鼠标将它拖到新位置。如果拖动时按下 Shift 键,则只能做水 平会或垂直移动。 改变大小:选中界面元素,用鼠标拖动选择边框的黑色“手柄”。 删除:选中要删除的一个或多个界面元素,然后按下界面工具条的"Delete"按钮。也可 73 NetLogo 4.0.2 用户手册 以通过 Ctrl+单击(Macintosh)或右击(其他系统),然后在弹出菜单中选择"Delete"。 如果使用后面这种方法,不必先选中元素。 要对各种界面元素有更多了解,参考下表。 表: 界面工具条 图标 & 名字 描述 按钮可以是一次性的或永久性的。在一次性按钮上单击,将执行命令 一次。永久性按钮则不断重复执行命令,直到再次按下按钮。如果为 按钮分配了快捷键,则当按钮有焦点时,按下相应的键就等同于按下 按钮。如果按钮有快捷键则在右上角显示快捷键字符。如果输入光标 在另外的界面元素上,如命令中心,则按下快捷键不会触发按钮,这 种情况下按钮右上角的字符会变暗。要激活快捷键,在界面页的空白 背景上单击。 滑动条是全局变量,可以被所有主体访问。在模型中使用他们作为快 速改变变量的方式,而不需重新编程的。相反,用户移动滑动条到一 个值,观察模型发生的行为。 开关是 true/false 变量的可视化表示。通过拨动开关,用户设置变量 为 on (true) 或 off (false)。 用户使用选择器在选择列表中为一个全局变量选定值,选择列表显示 为下拉菜单。 输入框是包含字符串或数值的全局变量。编程人员选择用户可以输入 的变量类型。可以设置输入框对输入的命令或报告器字符串进行语法 检查。数值型输入框可以读取任何形式的常值表达式,这比滑动条灵 活的多。颜色输入框为用户提供了 NetLogo 颜色选择器。 监视器显示任何表达式的值。表达式可以是变量、复杂表达式,或对 报告器的调用。监视器每秒自动更新几次。 绘图实时显示模型数据图形化。 输出区是一个文本卷滚区,用来记录模型活动。一个模型只能有一个 输出区。 注释用来为界面页添加信息型文本标签。模型运行过程中注释内容不 变。 界面页工具条上的其他控件用来控制视图更新和其他模型属性。 74 NetLogo 4.0.2 用户手册 • • • • 滑动条用来控制模型运行快慢 – 这很有用,因为有些模型运行的太快,很难看出发 生的事情。也可以通过左移滑块快进模型以及减慢视图更新频率。 view updates 勾选框控制是否进行视图更新 update mode 菜单用来在 continuous 和 tick-based 更新模式之间切换 Settings 按钮用来编辑不同的模型属性 "Continuous"更新是指 NetLogo 每秒更新(即重绘)视图很多次,不管模型运行的是什 么。"Tick-based"更新是指只有滴答计算器推进时才更新视图。 (关于视图更新的完整讨论, 见编程指南) 2D 和 3D 视图 界面页中的大块黑色区域是 2D 视图,它是 NetLogo 海龟和瓦片世界的可视化表示。初 始时它是全黑的,因为瓦片是黑色的,还没有海龟。通过在视图控制条上单击"3D"按钮打开 3D 视图,这是世界的另外一个可视化表示。 左上角三组黑色箭头用来改变世界大小。当原点在世界中点时世界变化的最小增量是 2,为最大值加 1,为最小值减 1。如果某条边为 0,则世界的增量为 1,在对面增加 1,以 保持原点在边上。如果原点在自定义的位置,则黑色箭头失效。 有很多与视图相关的设置。有几种改变设置的方式:使用视图顶端的控制条,或编辑 2D 视图,如上面的“使用界面元素”部分所讲,或按下工具条的"Settings..."按钮。 注意 3D 视图中的控制条组合了来自 2D 视图控制条的滴答计数器和界面工具条右部的控 件。 下面是视图的设置(通过编辑视图,或按下界面工具条的"Settings..."按钮)。 75 NetLogo 4.0.2 用户手册 注意设置分为三组,即 world, view, ticks counter。World 部分的设置影响海龟生存 的世界的特性(改变他们后要对世界重设)。View 和 tick counter 部分仅影响表观,不会 影响模型的输出。 World 部分的设置用来定义世界的边界和拓扑。World 面板左部的顶端用来选择世界原 点的位置,有"Center", "Corner", "Edge","Custom"四种。默认世界原点是 center 型的, 即(0,0)在中心位置,用户定义从中心到左右边界和上下边界的瓦片数。例如:如果设置 Max-Pxcor = 10,则 Min-Pxcor 自动设为-10,则在瓦片 patch 0 0 的左侧有 10 个瓦片,在 右侧有 10 个瓦片。 Corner 型配置允许用户将原点定义到世界的一角,左上、右上、左下或右下。然后定 义 x 和 y 方向的远端边界。例如将原点放在左下角,定义右和上(正)边界。 Edge 型允许用户将原点放在一条边上(x 或 y),然后定义该方向的远端边界,及另一 方向的两个边界。例如沿世界底部选择了 edge 模式,则必须定义顶边界和左右边界。 最后,Custom 模式允许用户将原点放在世界的任何位置,但瓦片 patch 0 0 必须存在。 当改变设置时,面板右部的预览区反映出你的选择,显示原点和边界。世界的宽度和高 度显示在预览区下方。 在预览区下方还有两个勾选框,是 world wrap 设置,用于控制世界的拓扑。注意当点 76 NetLogo 4.0.2 用户手册 击勾选框时,预览区显示哪个方向是回绕的,拓扑的名字显示在世界尺寸的旁边。更多信息 参见编程指南的拓扑部分。 View 部分的设置用来定制视图观感而不改变世界。改变 view 设置不会强迫世界重设。 要改变 2D 视图的大小,调整"Patch Size",单位是像素。这不会改变瓦片的数量,只改变 2D 视图瓦片显示的大小。(注意 patch size 不影响 3D 视图,因为只需让窗口变大就可以 使 3D 视图变大 ) "Turtle Shapes"勾选框用来打开或关闭海龟“图形”,如果关闭则海龟显示为彩色方 块,没有特别的形状。方块容易绘制,因此模型运行的会快一点。 "Smooth edges"仅出现在 3D 视图中,用来控制 3D 视图的反锯齿设置。使得直线看起来 不太参差,但模型运行会慢一些。 Tick counter 部分的设置控制滴答计数器的显示,在视图控制条中出现与否。 在视图中容易调出turtle, patch,link监视器,只需在要查看的海龟或瓦片上Ctrl单击(Macintosh)或右击(其他系统),并在弹出菜单中选择inspect turtle ..." 或"inspect patch ..."。通过在turtle子菜单中选择合适的选项,实现对海龟的观察、跟随和乘骑。 (turtle, patch,link监视器也可在Tools菜单中打开,或使用inspect命令) 有些模型让你在视图中通过鼠标点击或拖动实现与海龟或瓦片的交互。 操纵 3D 视图 在窗口的底部有一些按钮用来移动观察者或改变观察世界的视角。 当你调整这些设置时,在当前焦点出现一个蓝色十字。小蓝三角形总是指向正 y 轴方向, 如果迷失方向时用它帮你确定方向。很容易! 要从不同的角度看世界,按下"rotate"按钮,单击后上、下、左、右拖动鼠标。观察者 持续面向与以前一样的点(蓝十字所在处),但与 xy-平面的关系变了。 要靠近或远离世界或正在观看、跟随或乘骑的主体,按下"zoom"按钮并上下拖动鼠标。 (注意当在跟随或乘骑模式时,缩放将导致乘骑和跟随之间的切换,因为乘骑是跟随的一个 特例,只是跟随距离为 0) 如果不改变观察者的方向而改变它的位置,选择"move"按钮并保持鼠标按下,在 3D 视 图中上下左右拖动鼠标。 要允许鼠标位置和状态传给模型,选择"interact"按钮,则它的功能就像鼠标在 2D 视 图中一样。 77 NetLogo 4.0.2 用户手册 要 将 观 察 者 和 焦 点 返 回 默 认 位 置 , 按 下 "Reset Perspective" 按 钮 ( 或 使 用 reset-perspective命令) 全屏模式 要进入全屏模式,按下"Full Screen"按钮,要退出全屏模式,按下 Esc 键。 注意: 全屏模式在某些计算机上不能用,取决于所有的图形卡,见系统需求部分。 3D 图形 有些图形在 3D 视图中有 3D 对应物(3D 圆实际是一个球),因此自动映射图形。 图形名称 3D 图形 default 3D turtle shape circle sphere dot small sphere square cube triangle cone line 3D line cylinder 3D cylinder line-half 3D line-half car 3D car 所有其他图形解释为 2D 图形。如果图形可旋转,则假设是顶视图,像是从甜饼切割器 中挤出的,与 xy 平面平行,就像 Ants 中那样。 如果图形不能旋转,则假设是侧视图,总是面对观察者画出(没有厚度),就像 Wolf Sheep Predation 中那样。 78 NetLogo 4.0.2 用户手册 命令中心 命令中心用来直接发出命令,而不需将这些命令加入模型的例程。(命令是给模型中的 主体发出的指令)。这对运行时监视和操纵主体很有用。 (教学#2:命令介绍如何在命令中心使用命令) 看看命令中心的设计。 大框下面的小框用来输入命令,输入后按下回车键运行命令。 在输入文本的左侧是一个弹出菜单,初始是"observer>",可以在 observer, turtles, patches 之中选择,指定哪个主体运行你输入的命令。 提示:使用 tab 键快速切换 observer, turtles, patches。 访问先前的命令 你输入的命令出现在命令行上方的滚转框中。可以用 Edit 菜单中的 Copy 命令拷贝该处 的命令粘贴到其他地方,如例程页。 也可使用历史弹出菜单访问先前输入的命令,在输入命令框的右边有个小三角。单击这 个小三角,出现弹出菜单,包含以前输入的命令,选择某项重用。 提示:可以使用键盘上的上下光标键更快速的访问先前的命令。 清除 单击右上角的"clear",清除包含以前输入命令和输出的大滚转区。 79 NetLogo 4.0.2 用户手册 要清除弹出式菜单上的历史命令,选择该菜单的"Clear History"。 安排 使用 Tools 菜单的 Hide Command Center 和 Show Command Center,隐藏或显示命令 中心。 要改变命令中心的大小,拖动分隔命令中心和模型界面的边界,或者单击边界左部的小 箭头使得命令中心很大或完全隐藏。 要在垂直和水平布局之间切换,单击画有双端箭头的按钮,它就在"Clear"的左方。 绘图 在绘图右上角的单词"Pens"上单击,将隐藏或显示画笔图例。 如果在绘图的白色区域上移动鼠标,鼠标的 x 和 y 坐标会显示。(注意鼠标位置可能和 数据点不是精确对应,如果想知道绘图点的精确坐标,使用 Export Plot 菜单项,在其他程 序中查看输出文件) 当创建一个绘图时,就像其他小部件一样,编辑对话框自动出现。 上面许多域是自明的,如绘图的 name, x 和 y 轴的 label,坐标范围等。 如果 Autoplot?选中,如果新增的点超出当前范围,则 x,y 自动调整。 在 plot pens 部分可以创建和定制不同的画笔,每个绘图至少有一个画笔。开始时有一 个名为"default"的画笔,可以进行重命名,与模型的实际意义一致。 在画笔名下方的子面板部分是与该画笔相关的属性。 • • • • 设置画笔的颜色为 NetLogo 的某个基色,或使用 color swatches 定制颜色 Mode 用来设定画笔的外观,包括 line, bar (像棒图), point (虚线) Interval 是每次绘制新点时 x 的增量 如果 Show in Legend 选中,则选择的画笔是绘图右上角图例的一部分(在绘图上单 击"Pens"就出现) 80 NetLogo 4.0.2 用户手册 要了解这些特性的作用,参见编程指南的绘图部分。 滑动条 滑动条定义全局变量,用来方便的改变变量值,而不需改变底层代码。将滑动条放置 到界面页时,自动出现编辑对话框,就像其他部件一样。多数域很熟悉,但要重点注意minimum, maximum 和 increment域可以接受任何报告器表达式,而不是只是常量。例如可以令minimum 为min-pxcor ,maximum 为max-pxcor,则当世界大小改变时,滑动条的边界自动调整。 信息页 信息页用来介绍模型、解释如何使用、说明要探索的事情、可能的扩展、NetLogo 特征 等。首次探索模型时很有用。 推荐在运行模型前阅读信息页。信息页解释建模原理和模型如何创建。显示的信息页不 可编辑,要进行编辑单击"Edit"按钮,或在单词上双击,会自动滚转到该位置并加亮单词。 81 NetLogo 4.0.2 用户手册 可以像任何文本编辑器一样在此视图中编辑文本,然而,当切换出编辑视图后会特别显 示几个不同的形式。 信息页标记 描述 编辑模式 视图模式 空行后面全大写的行成 为节标题 WHAT IS IT 破折号组成的行被忽略 ------------------- 以 http://开 头的 成 为 可 点击的超链接 http://ccl.northwestern.edu http://ccl.northwestern.edu E-mail 地址成为可点击 的"mailto:" 链接 bugs@ccl.northwestern.edu bugs@ccl.northwestern.edu WHAT IS IT 以管道'|' ( shift + 反斜 线'\' )开始的行成为等 | this is preformatted text 宽文本。这对图和复杂 | you can put spaces in it 公式等有用。 单击 edit 按钮返回正常视图。 82 this is preformatted text you can spaces in put it NetLogo 4.0.2 用户手册 例程页 该页是模型代码存放的地方。对于马上想用的命令,可以在命令中心键入;对于要保存 且以后会不断使用的则放在例程页。 要知道代码是否有错误,按下"Check"按钮。如果有语法错误,例程页标签会变红,有 错的代码加亮,在顶部显示注释。切换标签页也会先进行语法检查,显示错误,因此切换前 不需按 Check 按钮。 83 NetLogo 4.0.2 用户手册 要查找代码片段,在例程工具条上单击"Find"按钮,出现 Find 对话框。 可以输入单词或短语进行查找或替换。"Ignore case"勾选框用来决定查找时是否大小 写敏感。"Wrap around"选中后,将在整个例程页中查找,从光标位置查到底部,然后返回 头部再查到光标处,否则只从光标处到底部。"Next" 和"Previous" 上下翻滚短语出现的位 置。"Replace"将当前选择的短语替换,"Replace & Find"替换然后寻找下一个。"Replace all"替换搜索范围内所有匹配短语。 要寻找特定的例程定义,使用例程工具条的"Procedures"弹出菜单,菜单以字母顺序列 出所有例程。 Edit 菜单的 Shift Left", "Shift Right", "Comment", "Uncomment" 用来对例程页改 变代码的缩进层次,增加或去除分号,分号表示注释。 要了解编程的更多信息,阅读教学#3:例程和编程指南。 Includes 菜单 如果模型中加上__includes关键词,procedures菜单的右侧会出现includes菜单,列出 本文件(.nlogo 或 .nls)包含的所有NetLogo源文件(.nls) 在该菜单的文件名上单击,会打开一个新页包含该文件,或者使用 New Source File 和 Open Source File 分别打开新文件或打开文件系统中已有的一个或多个文件。 84 NetLogo 4.0.2 用户手册 一旦打开新页,就可以与其他页一样进行导航。可以通过 Tabs 菜单访问它们,也可使 用键盘从一个页切换到另一个页(Mac 上使用 Command +数字,其他操作系统使用 Control+ 数字)。 85 NetLogo 4.0.2 用户手册 编程指南(Programming Guide) 下面的材料解释 NetLogo 编程的一些重要特征。 材料中经常提及的代码实例(Code Example)在模型库的 Code Example 部分。 • • • • • • • • • • • • • • • • • • • • • • • • • • • • Agents Procedures Variables Colors Ask Agentsets Breeds Buttons Lists Math Random Numbers Turtle Shapes Link Shapes Tick Counter View Updates Plotting Strings Output File I/O Movies Perspective Drawing Topology Links Ask-Concurrent Tie Multiple source files Syntax 主体(Agents) NetLogo 世界由主体(agent)构成,主体是能执行指令的个体。每个主体都同时执行各 自的行为。 NetLogo 中有四类主体:海龟、瓦片、链和观察者。海龟是在世界中移动的主体,世界 是 2 维的,是由瓦片组成的网格。每个瓦片是一块正方形的“地面”(ground),海龟在它 上面移动。链是连接两个海龟的主体。观察者没有具体位置 — 想象成它俯视着整个由海龟 86 NetLogo 4.0.2 用户手册 和瓦片组成的世界。 当 NetLogo 启动后没有任何海龟。观察者可以创建新海龟,瓦片也可以创建新海龟。 (瓦 片不能移动,除此之外与海龟和观察者一样,也是“活的”)。 瓦片有坐标。坐标(0,0)处的瓦片称为原点(origin),其他瓦片的坐标就是与原点 的水平和垂直距离。瓦片的坐标用pxcor和pycor表示,像标准坐标平面一样,向右移动pxcor 增加,向上移动pycor增加。 瓦片的总数由min-pxcor, max-pxcor, min-pycor, 和 max-pycor的设置决定。NetLogo 启动后,min-pxcor, max-pxcor, min-pycor和max-pycor分别是-16,16,-16 和 16。也就 是说pxcor 和 pycor的范围都是从-16 到 16,因此共有 33*33=1089 个瓦片。(通过Setting 按钮,可以改变瓦片数)。 海龟也有坐标:xcor 和 ycor。瓦片的坐标总是整数,但海龟的坐标可以有小数,这意 味着海龟可以位于瓦片上的任何一点,不一定恰好在瓦片的中心。 链只有两个端点(每个端点是一个海龟),没有坐标。链出现在两个端点之间,沿着可 能的最短路连接,这意味着有时候甚至要沿世界回绕。 瓦片世界的连接方式可以改变。默认情况下,世界是一个环面(torus),无边,但回 绕 -- 因此当海龟移出边界时消失了,又出现在对面的边界,这也使得每个瓦片都有相同数 目的“邻元”瓦片。一个位于世界边缘的瓦片,它的有些邻元在对面的边上。可以使用Settings 按钮改变回绕设置。如果禁止某方向(x或y)的回绕,世界就是有界的。边界上的瓦片邻元 少于 8 个,海龟也移不出边界。要详细了解参见Topology部分。 例程(Procedures) NetLogo 命令和报告器告诉主体做什么。命令(command)是主体执行的行动。报告器 (reporter)计算并返回结果。 多数命令由动词开头("create", "die", "jump", "inspect", "clear"),而多数报 告器是名称或名词短语。 NetLogo 内 建 的 命 令 和 报 告 器 叫 做 原 语 (primitive) 。 NetLogo 词 典 ( The NetLogo Dictionary)完整列出了内置命令和报告器。 你自己定义的命令和报告器称为例程。每个例程有一个名字,前面加上关键词to 。关 键词end 标志例程的结束。定义了例程后,就可以在程序的其他任何地方使用它。 许多命令和报告器有输入参数(inputs),就是命令或报告器执行动作所需的一些值。 例子:两个命令例程: to setup clear-all ;; clear the world crt 10 ;; make 10 new turtles end to go ask turtles [ fd 1 ;; all turtles move forward one step 87 NetLogo 4.0.2 用户手册 rt random 10 ;; ...and turn a random amount lt random 10 ] end 使用分号给程序增加注释,注释让程序更容易阅读和理解。 在这个程序中, • • • setup 和 go 是用户定义的命令. clear-all, crt ("create turtles"), ask, lt ("left turn") 和 rt ("right turn") 是命令原 语。 random和 turtles是报告器原语, random 使用一个输入参数,返回小于等于该参 数的一个随机整数 (此处是 0 和 9 之间)。 turtles 返回所有海龟组成的agentset (agentsets 后面再解释.) setup和go可以被其他例程或按钮调用。许多NetLogo模型有一个一次性按钮调用一个名为 setup的例程,还有一个永久性按钮调用一个名为go的例程。 在NetLogo里必须指定每条命令由哪个/哪些主体执行,包括海龟、瓦片、链和观察者。 (如果不指定,则由观察者执行)。在上面的代码中,观察者使用ask 让所有海龟执行[ ] 中 的命令。 clear-all and crt只能由观察者执行。fd只能由海龟执行。其他一些命令和报告器,例如 set,可以由不同类型的主体执行。 定义例程时还有一些高级特征可以使用。 带输入的例程,Procedures with inputs 你的例程也可以像原语一样有输入参数。要定义接受输入的例程,需要在例程名后面的 [ ]中列出输入参数名。例如: to draw-polygon [num-sides len] pen-down repeat num-sides [ fd len rt 360 / num-sides ] end 在程序的其他地方,你可以让每个海龟以自己的 who number 为边长画出一个正 8 边形。 ask turtles [ draw-polygon 8 who ] 报告器例程,Reporter procedures 就像命令一样,也可定义自己的报告器。这需要做两件特别的事情,一是使用to-report, 而不是to,开始例程定义;二是在例程体中,使用report返回你要报告的值。 to-report absolute-value [number] 88 NetLogo 4.0.2 用户手册 ifelse number >= 0 [ report number ] [ report (- number) ] end 变量(Variables) 变量用来存储值(例如数字)。变量可以是全局变量、海龟变量或瓦片变量。 一个全局变量只有一个值,任何主体都可访问它。对于海龟变量,每个海龟都有一个自 己的值。对于瓦片变量,每个瓦片都有一个自己的值。 有些变量是NetLogo内置的。例如,所有海龟都有一个color变量,所有瓦片都有一个 pcolor变量。(瓦片变量以p开头,以免与海龟变量混淆)。如果你设置这些变量,海龟或 瓦片就变色。 其他内置海龟变量包括xcor, ycor和 heading,其他内置瓦片变量包括pxcor 和pycor。 (有个完整列表here) 你可以定义自己的变量。通过创建开关和滑动条创建全局变量,或者在程序的开头使用 globals关键字,像这样: globals [ score ] 使用turtles-own , patches-own 和links-own关键词,定义自己的新的海龟变量、瓦 片变量和链变量。像这样: turtles-own [energy speed] patches-own [friction] links-own [strength] 在模型里这些变量可以随便使用。使用set命令设置它们。(如果不设置的话,初值为 0) 任何主体在任何时候都可以读取、设置全局变量。海龟可以读取、设置它所处瓦片的瓦 片变量。例如代码: ask turtles [ set pcolor red ] 使得每个海龟将所处的瓦片变为红色。(由于瓦片变量以这种方式被海龟更新,因此海 龟变量和瓦片变量不能重名)。 其他情况下,当你要一个主体读取其他主体的变量时,使用of。例如: show [color] of turtle 5 ;; prints current color of turtle with who number 5 除了将变量名与of一起使用外,还可使用复杂的表达式,例如: show [xcor + ycor] of turtle 5 ;; prints the sum of the x and y coordinates of 89 NetLogo 4.0.2 用户手册 ;; turtle with who number 5 局部变量,Local variables 局部变量仅用在特定的例程或例程的一部分。使用let命令创建局部变量,该命令可在 任何地方使用。如果在例程的最前面使用,则变量在整个例程中都存在。如果在[ ]中使用, 例如在ask里面,它只在该[ ]内部存在。 to swap-colors [turtle1 turtle2] let temp [color] of turtle1 ask turtle1 [ set color [color] of turtle2 ] ask turtle2 [ set color temp ] end 颜色(Colors) NetLogo 有两种表示颜色的方式。第一种是使用 0-140(不包括 140)之间的数字。下 面是一张 NetLogo 可用颜色范围的图。 该图表明: 90 NetLogo 4.0.2 用户手册 • • • • • • 有些颜色有名字 (在代码里可以使用) 除了 black 和 white 外,有名颜色的末位数是 5 有名颜色的两侧是同一种颜色,但更深或更浅 0 是纯黑, 9.9 是纯白 10, 20, 等太深,看起来是黑的 19.9, 29.9 等太浅,看起来是白的 代码示例: 这个颜色图是用 NetLogo 的 Color Chart Example 模型生成的. 如果使用的数不在 0-140 之间,则NetLogo重复增加或减去 140 直到符合范围。例如 25 是橙色,165,305,445 等也是橙色,-115,-255,-395 也是。当你设置海龟color或瓦片pcolor 时,自动做上述计算。如果在别处你需要做这样的运算,使用wrap-color原语。 如果你要图上没有的颜色,就使用整数之间的值,例如 26.5 是 26 和 27 的中间色。这 并不是说你可以在 NetLogo 里使用任何颜色,NetLogo 的颜色空间仅是全部颜色的一个子集, 仅包括有限的固定的离散色调(hue)集合(图上每行是一个色调)。对每个色调可以减少亮 度或减少饱和度,但不能同时减少亮度和饱和度。并且只有小数点后第一位有意义,因此颜 色值四舍五入到 0.1,例如 26.5,26.52 和 26.58 视觉上无区别 Color primitives,颜色原语 有些原语与颜色打交道。 我们已经提过 wrap-color 原语。 原语scale-color将数值转换为颜色。 原语shade-of?告诉我们两个颜色是否属于同一色调。例如shade-of? orange 27 代码例子(Code Example): Scale-color 例子演示了 scale-color 原语的使用. RGB Colors,RGB 颜色 NetLogo第二种颜色表达方式是RGB(红/绿/蓝),使用RGB时所有颜色都可以得到。RGB 颜色由 3 个 0-255 之间的数组成,若数字超出 255 则重复减去 255,直到落到范围之内。可 以将RGB表示的颜色用于使用颜色变量(海龟和链使用color,瓦片使用pcolor)的任何地方。 因此下面的代码将瓦片 0 0 设为纯红: set pcolor [255 0 0] 可以在RGB和 HSB (色调/饱和度/亮度)之间转换。NetLogo 使用approximate-hsb和 approximate-rgb 将颜色从 RGB/HSB映射到NetLogo颜色。 而extract-hsb 和 extract-rgb 进行反向转换。使用rgb产生rgb颜色表,使用hsb实现从HSB到RGb 的转换。 因为NetLogo颜色空间缺很多颜色,approximate-hsb 和 approximate-rgb得到的颜色 可能不太准确,但尽量接近。 代码示例(Code Example): HSB 和 RGB 模型例子让你实验 HSB 和 RGB 颜色系统。 91 NetLogo 4.0.2 用户手册 Color Swatches dialog ,色样对话框 色样对话框让你体验、选择颜色。在 Tools 菜单选择 Color Swatches 打开对话框。 当在色样(或颜色按钮)上点击时,颜色会凸显。左下部显示当前颜色的代码(例如, red + 2),这样你可以将它复制、粘贴到程序中。右下部有三个颜色增量选项,1,0.5, 0.1。增量为 1 时,每行 10 个颜色,0.1 时每行 100 个颜色,0.5 是中间设置。 请求(Ask) NetLogo用 ask 向海龟、瓦片和链发出命令。由海龟执行的命令必须置于海龟上下文 (context)。用下面三种方式之一建立海龟上下文: • • 使用按钮时在弹出菜单选择"Turtles",放在按钮中的代码将由所有海龟执行. 在命令中心,在弹出菜单中选择"Turtles",则输入的命令由所有海龟执行. • 使用 ask turtles. 瓦片、链、观察者也一样,只是不能ask观察者。不在ask内的代码默认是由观察者执行。 这里有一个在NetLogo例程中使用ask的例子: to setup clear-all crt 100 ;; create 100 turtles ask turtles 92 NetLogo 4.0.2 用户手册 [ set color red ;; turn them red rt random-float 360 fd 50 ] ;; give them random headings ;; spread them around ask patches [ if pxcor > 0 ;; patches on the right side [ set pcolor green ] ] ;; of the view turn green end 模型库里这样的例子很多,最好先看 Code Examples 部分。 通常观察者使用ask请求所有海龟、所有瓦片或所有链执行命令。也可以使用ask让单 个海龟、瓦片或链执行命令。报告器turtle, patch, link和 patch-at是经常使用的技 术。 to setup clear-all crt 3 ;; make 3 turtles ask turtle 0 ;; tell the first one... [ fd 1 ] ask turtle 1 [ set color green ] ask turtle 2 [ rt 90 ] ask patch 2 -2 [ set pcolor blue ] ask turtle 0 [ ask patch-at 1 0 [ set pcolor red ] ] ask turtle 0 ;; ...to go forward ;; tell the second one... ;; ...to become green ;; tell the third one... ;; ...to turn right ;; ask the patch at (2,-2) ;; ...to become blue ;; ask the first turtle ;; ...to ask patch to the east ;; ...to become red ;; tell the first turtle... [ create-link-with turtle 1 ] ;; ...make a link with the second ask link 0 1 [ set color blue ] ;; tell the link between turtle 0 and 1 ;; ...to become blue end 创建的每个海龟都有who number号,第一个是 0,第二个是 1,依次类推。turtle 原语 报告器使用who number作为输入,返回该海龟。patch原语报告器使用pxcor 和pycor,返回 该处的瓦片。link原语使用两个端点海龟的who number做输入。patch-at原语使用与第一个 主体的offsets,即x,y方向的距离。上面的例子里请求 0 号海龟去获得它东面(没有北面的 瓦片)的瓦片。 也可选择某些海龟、瓦片、链等让它们执行动作。这就涉及到一个称为主体集合 (agentset)的概念,下一部分详细解释这个概念。 当你命令主体集合执行多条命令时,只有当一个主体执行完所有这些命令后,才轮到下 93 NetLogo 4.0.2 用户手册 一个主体执行。一个主体执行完,然后下一个主体,…,诸如此类。例如,写代码: ask turtles [ fd 1 set color red ] 首先一个海龟移动、变红,然后是下一个海龟移动、变红,…。 但是若写成这样: ask turtles [ fd 1 ] ask turtles [ set color red ] 首先所有海龟移动,都移动完成后,再都变红。 (还有另一种排序规则不同的ask 命令,参看下面的Ask-Concurrent。) 主体集合(Agentsets) 顾名思义,主体集合就是主体组成的集合。主体集合可以由海龟、瓦片或链组成,但只 能同时包含一种类型的主体。 主体集合内部元素没有任何特定顺序,总是随机排列。每次使用时都会是不同的随机顺 序。这使你避免对集合中的主体做任何特定处理(除非你非要这样)。因为每次的顺序都是 随机的,没有哪个主体会总是排在第一个。 你已经知道原语turtles返回所有海龟组成的主体集合,patches是所有瓦片组成的主体 集合,links是所有链组成的主体集合。 主体集合概念的作用在于你可以构造由某些海龟、某些瓦片或某些链组成的集合。例如, 所有红色海龟、或pxcor能被 5 整除的瓦片,或者站在第一象限绿色瓦片上的海龟,或者与 0 号海龟相连的链等。这些集合可以用在ask中,或者用在将主体集合作为输入的报告器中。 使用turtles-here得到一个由当前瓦片上所有海龟构成的主体集合。使用turtles-at得 到距当前位置x,y处瓦片上的海龟构成的主体集合。使用turtles-on得到给定瓦片上的海龟 集合,或者得到与给定的海龟站在同一瓦片上的海龟集合。 下面是一些构造主体集合的例子: ;; all other turtles: other turtles ;; all other turtles on this patch: other turtles-here ;; all red turtles: turtles with [color = red] ;; all red turtles on my patch turtles-here with [color = red] ;; patches on right side of view patches with [pxcor > 0] ;; all turtles less than 3 patches away 94 NetLogo 4.0.2 用户手册 turtles in-radius 3 ;; the four patches to the east, north, west, and south patches at-points [[1 0] [0 1] [-1 0] [0 -1]] ;; shorthand for those four patches neighbors4 ;; turtles in the first quadrant that are on a green patch turtles with [(xcor > 0) and (ycor > 0) and (pcolor = green)] ;; turtles standing on my neighboring four patches turtles-on neighbors4 ;; all the links connected to turtle 0 [my-links] of turtle 0 注意使用other就将调用主体排除在外。这是通用的。 创建了主体集合后,可以做一些事情,例如 使用 ask 让主体集合中的主体做事 使用 any? 查看主体集合是否为空 使用 all? 查看是否主体集合中的每个主体都满足条件 使用 count 得到主体集合中主体的数量 也可以做一些更复杂的事情: 使用one-of在集合中随机选一个主体,例如我们让一个随机选择的海龟变绿: ask one-of turtles [ set color green ] 或者让随机选定的一个瓦片生出一个新海龟: ask one-of patches [ sprout 1 ] 使用 max-one-of 或 min-one-of 报告器找出某个指标最大或最小的主体。 例如移动 最富的海龟: ask max-one-of turtles [sum assets] [ die ] 使用histogram命令做一个关于主体集合的直方图 (与of一起) 使用of得到主体集合中每个主体的一系列值。然后使用list原语做一些事情(看下面的List 部分)。例如,显示海龟平均财富, show mean [sum assets] of turtles 使用 turtle-set, patch-set和link-set 报告器从多个来源收集主体形成主体集合。 95 NetLogo 4.0.2 用户手册 使用 = 或!= 判断两个主体集合是否相等。 使用 member? 判断某个特定主体是否属于一个主体集合。 这只是隔靴搔痒。在模型库里例子很多,还可以查 NetLogo 词典获得有关主体集合原语 更多的知识。 在 NetLogo 词典里,每个原语的条目下都提供了更多的例子。在熟悉了 NetLogo 编程之 后,要进一步考虑复合命令,特别是要注意复合命令的各个构件之间如何传递信息。在这样 的概念模式里,主体集合发挥重要作用,它提供了强大而灵活的功能,并且与自然语言类似。 代码例子 Code Example: Ask Ordering 前面我们说过主体集合总是采用随机顺序,每次都不一样。如果要主体遵循固定的顺序, 你需要主体列表(list),而不是集合。参看下面 list 部分。 种类(Breeds) NetLogo允许定义不同种类(breeds)的海龟或链。定义了种类后,可以让它们有不同 的行为。例如有两个种类:羊(sheep)和狼(wolves),让狼吃羊。或者不同种类的链: 马路和人行道,人走人行道,车走马路。 在例程页使用breed关键字定义海龟种类,定义必须放在所有例程之前。 breed [wolves wolf] breed [sheep a-sheep] 用单数形式引用种类的成员,就像turtle那样。打印时,种类成员使用单数形式的标签。 有些命令或报告器使用复数形式的种类名,例如create- 。其他的使用单数形 式种类名,如 。 种类定义的顺序决定了它们在视图上分层显示的顺序。后定义的种类在先定义的种类上 面。上面狼和羊的定义决定了羊会绘制在狼的上层。 当你定义了羊这样的种类后,这个种类的主体集合自动产生了。上面叙述的主体集合的 功能,现在对关于羊的主体集合马上可用了。 一 旦 定 义 了 羊 (sheep) 这 个 种 类 , 其 他 的 一 些 新 原 语 自 动 创 建 : create-sheep, hatch-sheep, sprout-sheep, sheep-here, sheep-at, sheep-on, 和 is-a-sheep? 你也能使用sheep-own 定义属于该种类的海龟变量。 一个海龟种类主体集合存在该种类的海龟变量中(A turtle's breed agentset is stored in the breed turtle variable)。因此可以测试海龟的种类: if breed = wolves [ ... ] 注意海龟也可以改变种类。狼也不一定一辈子都是狼,随机选一个狼变成羊: ask one-of wolves [ set breed sheep ] 使用原语set-default-shape将特定形状与特定种类联系起来。参见下面的shape部分。 96 NetLogo 4.0.2 用户手册 下面是一个使用种类的小例子: breed [mice mouse] breed [frogs frog] mice-own [cheese] to setup clear-all create-mice 50 [ set color white set cheese random 10 ] create-frogs 50 [ set color green ] end 代码例子 Code Example: Breeds and Shapes 链的种类(Link Breeds) 链的种类与海龟种类很相似,但有一些区别。 声 明 链 种 类 时 , 必 须 声 明 是 有 向 还 是 无 向 , 分 别 使 用 directed-link-breed 和 undirected-link-breed 关键词。 directed-link-breed [streets street] undirected-link-breed [friendships friendship] 一旦你创建了有种类的链,就不能再创建无种类的链,反之亦然。(但是,可以同时有 有向链和无向链,但不能属于同一种类)。 与海龟种类不同,链种类需要单数形式种类名,因为许多链命令和报告器使用单数名, 如 -neighbor? 一 旦 定 义 了 上 面 的 有 向 链 种 类 , 下 面 的 原 语 就 自 动 可 用 : create-street-from create-streets-from create-street-to in-street-neighbors create-streets-to in-street-from my-in-streets in-street-neighbor? my-out-streets out-street-neighbor? out-street-neighbors out-street-to 一旦定义了上面的无向链种类,下面的原语就自动可用: create-friendship-with create-friendships-with friendship-neighbor? friendship-neighbors friendship-with my-friendships 与海龟种类一样,链种类声明的顺序决定了它们绘制的顺序,因此friendships在 streets上面(如果因某种原因,它们在一个模型里)。可以用 -own为每个链 种类分别声明变量。 像海龟一样,也可以改变链的种类。然而,不能让有种类的链变为无种类的,以免在世 界中同时出现有种类和无种类的链。 ask one-of friendships [ set breed streets ] 97 NetLogo 4.0.2 用户手册 ask one-of friendships [ set breed links ] ;; produces a runtime error 使用set-default-shape 将特定形状与特定种类的链联系起来。 代码例子 Code Example: Link Breeds 按钮(Buttons) 界面页中的按钮用来方便的控制模型。一般模型至少有一个"setup"按钮,设置世界初 始状态,还有一个"go"按钮运行模型。一些模型有更多按钮执行其他行为。 按钮包含一些 NetLogo 代码,按下按钮代码运行。 按钮可以是一次性的或永久性的,编辑按钮通过勾选/不选"Forever"项来决定。一次性 按钮执行代码一次,然后停止并弹回。永久性按钮不断重复执行代码,直到遇到stop命令, 或再次按下按钮。按下按钮,代码并不马上停止,而是直到代码执行完毕才弹回。 一般用代码名字命名按钮。例如名为"go"的按钮执行的代码就是"go",含义为“执行 go 例程”(例程在例程页定义)。但也可以编辑按钮,输入一个显示名(display name), 显示名出现在按钮上。如果你觉得实际代码不太容易搞懂的话,可以指定一个显示名。 在按钮里放入代码时,必须指定哪个主体来执行。可以选择观察者、所有海龟、所有瓦 片或所有链。(如果只想让部分海龟或部分瓦片执行的话,需要制作一个观察者按钮,然后 让观察者使用ask请求那些海龟或瓦片执行动作) 编辑按钮时,可以指定快捷键,按下快捷键等于按下按钮。如果是永久性按钮,按下快 捷键后按钮一直处于压下状态,直到再次按下快捷键(或单击该按钮)。快捷键对游戏,或 需要快速触发按钮的模型很有用。 按钮次序(Buttons take turns) 可以同时有多个按钮被按下,这种情况下按钮按顺序执行,即每次只有一个按钮在运行。 每个按钮执行完它的代码后,下一个按钮接着进行。 下面的例子中,"setup"是个一次性按钮,"go"是永久性按钮。 例子#1:按下"setup",在"setup"弹起前立即按下"go"。结果:在"go"开始前"setup" 完 成。 例子#2:当"go"处于按下状态时,按下"setup"。结果是:"go"完成本次循环,然后执 行"setup",然后"go"再次运行。 例子#3:同时有两个永久性按钮按下,结果是:首先一个按钮执行代码一遍,然后另一 个按钮执行代码一遍,如此交替执行。 注意如果一个按钮陷入死循环,则其他按钮无法执行。 海龟、瓦片和链永久性按钮,Turtle, patch, and link forever buttons 将命令置入海龟、瓦片、链的永久性按钮,与将相同的命令置入观察者按钮的 ask 中有 微妙的区别。只有所有主体执行完 ask 中的命令后,ask 才完成。因此当主体并行执行命令 98 NetLogo 4.0.2 用户手册 时,它们之间可能不同步,但当 ask 结束时又同步了。在海龟、瓦片和链的永久性按钮中并 非如此。因为没有使用 ask,每个海龟或瓦片不断重复执行各自代码,因此相互之间变得(并 保持)不同步。 目前模型库中的模型很少利用这种能力。确实使用了这个能力的模型是 Sample Models 中 Biology 部分的 Termites,其中"go"是海龟永久性按钮,因此每个白蚁(termit)相互独 立运行,没有涉及观察者。这意味着,例如,要加上一个图的话,需要增加第二个永久性按 钮(观察者永久性按钮),同时有两个永久性按钮在运行。 目前 NetLogo 没办法让一个永久性按钮启动另一个按钮,只有按下按钮启动它。 列表(Lists ) 在最简单的模型里,每个变量保存一项信息,一般是数字或字符串。列表使得一个变量 能存储多项信息,只要将它们收集在一个列表里。列表中的值可以是任何类型:数字、字符 串、主体、主体集合,甚至另一个列表。 列表使你可以方便的对信息打包。如果主体对多个变量进行重复计算,使用列表就很方 便,不用使用多个数值变量。有些原语简化了对列表中每个值进行相同计算的过程。 NetLogo词典NetLogo Dictionary列出了与列表有关的所有原语。 常数列表,Constant lists 把所需要的值都写在[ ]里就简单的创建了一个列表,像这样set mylist [2 4 6 8]。 注意每个值用空格分开。用这种方式能创建包括数值和字符串的列表,以及包含列表的列表, 如[[2 4] [3 5]]。 []中间什么都不放,就创建一个空列表,例如[ ]。 当场创建列表,Building lists on the fly 要创建由报告器返回值构成的列表,而不是常数组成的列表,要使用list报告器。list 报告器接受两个其他报告器做输入,运行这些报告器,返回作为列表。 要得到包括两个随机数的列表,使用下面的代码: set random-list list (random 10) (random 20) 每次运行时将random-list 设置为由两个随机整数形成的列表。 要得到更长或更短的列表,可以给list报告器少于或多于两个输入参数,但是必须将 整个调用用括号括起来,例如: (list random 10) (list random 10 random 20 random 30) 更多信息,见 Varying number of inputs. 有些种类的列表可以通过n-values报告器很容易的创建,它允许你重复运行某个给定的 报告器产生指定长度的列表。列表可以包括相同值,或某个范围内的所有值,许多随机值, 99 NetLogo 4.0.2 用户手册 等等。查看NetLogo词典了解详细内容。 原语of 用来从主体集合创建列表,它返回一个列表,其中包括对每个主体应用给定报 告器后的值。 (报告器可以是简单的变量名,或复杂的表达式 – 甚至可以是由to-report定 义的过程)。一种常用的形式如: max [...] of turtles sum [...] of turtles 等等。 使用sentence可以将两个列表组合成一个更大的列表。像list一样,sentence一般有两 个输入参数,但也可以有任意多个输入参数,只是整个调用要用括号括起来。 改变列表项,Changing list items 技术上讲,列表不能修改,但可以基于旧列表创建新列表。如果想用新列表替换旧列表, 使用set。例如: set mylist [2 7 5 Bob [3 0 -2]] ; mylist is now [2 7 5 Bob [3 0 -2]] set mylist replace-item 2 mylist 10 ; mylist is now [2 7 10 Bob [3 0 -2]] 报告器replace-item 有三个输入项,第一项指定列表的哪个元素要修改,0 是第 1 个, 1 是第 2 个,…。 要在列表尾部加一项,使用lput。(fput在列表首部加一项) set mylist lput 42 mylist ; mylist is now [2 7 10 Bob [3 0 -2] 42] 如果你改主意了怎么办?but-last (简写为bl)返回除最后一项外的列表。 set mylist but-last mylist ; mylist is now [2 7 10 Bob [3 0 -2]] 假设要除去项 0,即列表首部的 2, set mylist but-first mylist ; mylist is now [7 10 Bob [3 0 -2]] 假设你要将列表中的第 3 项列表的第 3 项从-2 改为 9。关键是认识到用来调用嵌入列表 [3 0 -2]的语法是item 3 mylist,然后replace-item可以嵌入改变列表中的列表。为清晰 起见,加上了括号。 set mylist (replace-item 3 mylist (replace-item 2 (item 3 mylist) 9)) ; mylist is now [7 10 Bob [3 0 9]] 列表遍历,Iterating over lists 要对列表中的每个元素依次进行某项操作,使用foreach命令和map报告器。 foreach用来对列表中的每个元素执行命令,他的输入参数包括输入列表和命令块,如下: 100 NetLogo 4.0.2 用户手册 foreach [2 4 6] [ crt ? show (word "created " ? " turtles") ] => created 2 turtles => created 4 turtles => created 6 turtles 命令块中的变量?保存输入列表中的当前值。 更多关于foreach的例子: foreach [1 2 3] [ ask turtles [ fd ? ] ] ;; turtles move forward 6 patches foreach [true false true true] [ ask turtles [ if ? [ fd 1 ] ] ] ;; turtles move forward 3 patches map与foreach相似,但它是报告器。它的输入参数包括一个输入列表和一个其他报告器。 与foreach不同,报告器在前,如下: show map [round ?] [1.2 2.2 2.7] ;; prints [1 2 3] map返回一个列表,这个列表对输入列表中的每一项应用报告器的结果。也是使用?引用列 表的当前项。 关于map的另一个例子: show map [? < 0] [1 -1 3 4 -2 -10] ;; prints [false true false false true true] 并不是在操作整个列表时都要使用foreach 和 map。有时需要使用其他技术,如repeat 或 while,以及递归等。 原语sort-by的语法与map 和 foreach相似,但由于要比较两个对象,使用了两个特殊 变量?1 和 ?2 ,而不是? 。 一个sort-by的例子: show sort-by [?1 < ?2] [4 1 3 2] ;; prints [1 2 3 4] 可变数量输入,Varying number of inputs 有些涉及列表和字符串的命令和报告器输入参数的数量可变。这种情况下,为了传给它 们一系列参数而不是默认数量的参数,原语和输入参数必须全部用括号括起来。一些例子如 下: show list 1 2 => [1 2] 101 NetLogo 4.0.2 用户手册 show (list 1 2 3 4) => [1 2 3 4] show (list) => [] 注意这些特殊命令都有默认数量输入,这时不用括号。有这种能力的原语有list, word, sentence, map和foreach 。 主体列表,Lists of agents 以前我们说过主体集合总是随机顺序,每次的顺序都不一样。如果要主体们按固定的顺 序执行动作,需要构造一个主体列表。 这样做需要两个原语sort 和 sort-by的帮助。 sort 和sort-by以主体集合为输入,结果是一个新列表,它包括主体集合中的所有主体, 但主体按特定顺序排列。 如果在海龟主体集合上应用sort,得到的是按 who number升序排列的主体列表。 如果在瓦片主体集合上应用sort,得到的是按从左到有,从上到下排列的瓦片列表。 如果在链主体集合上应用sort,得到的是先按end1再按end2升序排列的链列表,剩下的 节(ties)分解为种类,按种类的声明顺序排列。 如果要降序排列,需要将reverse 和 sort组合起来,例如reverse sort turtles。 如果要按非标准的其他准则排列,需要使用sort-by。 例子: sort-by [[size] of ?1 < [size] of ?2] turtles 得到的列表按海龟变量size升序排列。 请求主体列表,Asking a list of agents 有了主体列表后,可能要请求列表中的所有主体执行动作。方法是组合使用foreach 和 ask 命令,像这样: foreach sort turtles [ ask ? [ ... ] ] 这就按 who number 升序依次请求每个海龟。把"turtles"换成"patches"后,就从左到 右、从上到下依次请求瓦片。 如果这样使用 foreach,列表中的主体就顺序执行 ask 中的命令,而不是并行。一个主 体执行完后,下一个才开始执行。 不能直接对海龟列表应用ask,ask只能对主体集合或单个主体工作。 列表性能,Performance of lists 如果你的模型大量使用列表,特别是长列表,你需要知道 NetLogo 各种列表操作的速度, 102 NetLogo 4.0.2 用户手册 这样能帮你写出运行速度较快的代码。 NetLogo 列表是单链表。这是个计算机术语,意味着如果要查找表中的某项,必须从头 开始一个一个查找,直到找到。例如要找到第 100 项,NetLogo 必须走过前面 99 项。 这也意味着某些操作的效率特别高,就是那些在表头的操作。first, but-first 和fput 操作很快,不管表有多长,花费时间相同。因此如果通过每次增加一个新项来构建列表,则 使用fput 要快于lput。(如果表的顺序与你期望的相反,可以使用reverse反转列表)。 length报告器也很快,NetLogo总是跟踪列表的长度,因此不需计算。 长列表上的一些报告器较慢,包括item, lput, but-last, last和 one-of。 数学(Math) NetLogo 的所有数值在内部都是双精浮点数,遵循 IEEE 754 标准。每个数有 64 位,包 括 1 个符号位,11 位指数,52 位尾数。细节见 IEEE 754。 NetLogo 的整数是恰好没有小数部分的数,3 和 3.0 没区别。(这与人们日常使用一致, 但与一些编程语言不同,有些语言对整数和浮点数区别对待)。 NetLogo 打印输出整数时没有尾部的".0": show 1.5 + 1.5 observer: 3 在需要整数的部分使用带有小数部分的数,则只是简单的将小数部分丢弃。例如,crt 3.5 创建 3 个海龟,额外的0.5 忽略。 整数的范围是+/-9007199254740992 (2^53, 约 9 乘 10 的 15 次幂)。计算时超出范围 不会引起运行错误,但可能会损失精度,因为 64 位限制,最后 1 位会舍入。数太大时,会 导致不精确的结果: show 2 ^ 60 + 1 = 2 ^ 60 => true 如果有小数部分,对小一点的数的计算也会产生令人惊讶的结果,因为不是所有分数都 能精确表示,还有舍入发生。例如: show 1 / 6 + 1 / 6 + 1 / 6 + 1 / 6 + 1 / 6 + 1 / 6 => 0.9999999999999999 show 1 / 9 + 1 / 9 + 1 / 9 + 1 / 9 + 1 / 9 + 1 / 9 + 1 / 9 + 1 / 9 + 1 / 9 => 1.0000000000000002 任何产生无穷大或非数的操作会引起运行错误。 科学计数法,Scientific notation 很大或很小的数用科学计数法表示,例如: show 0.000000000001 => 1.0E-12 show 50000000000000000000 => 5.0E19 103 NetLogo 4.0.2 用户手册 科学计数法表示的数通过“E”识别,表示 10 的几次幂。例如 1.0E-12 就是 1.0 乘以 10 的-12 次幂: show 1.0 * 10 ^ -12 => 1.0E-12 在你的代码里也可使用科学计数法: show 3.0E6 => 3000000 show 8.123456789E6 => 8123456.789 show 8.123456789E7 => 8.123456789E7 show 3.0E16 => 3.0E16 show 8.0E-3 => 0.0080 show 8.0E-4 => 8.0E-4 这些例子展示了有分数部分的数当指数小于-3 或大于 6 时的科学计算法表示。超过 NetLogo 整数范围-9007199254740992 —9007199254740992 (+/-2^53)的数也可以用科学计 算法表示。 show 2 ^ 60 => 1.15292150460684698E18 输入数时,字母 E 大小写都行。打印数值时,NetLogo 总是使用大写 E: show 4.5e20 => 4.5E20 浮点精度,Floating point accuracy 因为 NetLogo 中的数值受限于浮点数的二进制表示,有时会得到不精确的结果。例如: show 0.1 + 0.1 + 0.1 => 0.30000000000000004 show cos 90 => 6.123233995736766E-17 这是浮点算术固有的问题,所有使用浮点数的编程语言都有这样的问题。 如果要处理固定精度的数,例如美元和分,一个常用技术是在内部只使用整数(分), 在显示时除以 100 得到元。 如果必须使用浮点数,有些情况下不要使用x = 1 [ ... ]这样的相等比较,而是能有 一点容限,如采用if abs (x - 1) < 0.0001 [ ... ]。 另外,使用precision可以方便的控制数字显示。NetLogo的监视器根据配置的小数位对 数字进行舍入后显示。 104 NetLogo 4.0.2 用户手册 随机数(Random Numbers) NetLogo 使用伪随机数(计算机编程基本都这样)。意思是看起来随机,实际上是由确 定性过程决定的。确定性是指如果每次从同一个随机数种子开始,你可以得到同样的结果。 一会我们解释随机数种子的含义。 在科学模型里,伪随机数实际上正是所期望的。这是因为科学实验的可重复性非常重要, 任何人都可以去尝试,得到相同的结果。因此 NetLogo 使用伪随机数,你做的“实验”可以 被别人重现。 工作原理如下。NetLogo随机数发生器从一个种子数开始,种子数可以是任何整数。通 过random-seed给定种子后,随机数发生器总是产生同样的随机数序列。例如下面的命令: random-seed 137 show random 100 show random 100 show random 100 你总是得到数列 95, 7, 54 。 注意只有 NetLogo 版本相同才能这样保证。有时我们改变 NetLogo 版本时采用了不同的 随机数发生器。(目前使用 Mersenne Twister 发生器) 使用new-seed报告器产生适合随机数发生器使用的种子值。new-seed基于当前日期和时 间产生均匀分布的种子。在同一行里它不会产生两个相同的种子。 代码例子 Code Example: Random Seed 如果没有设置随机数种子,NetLogo 基于当前日期和时间产生种子。没办法找到到底使 用了哪个种子,因此如果你想让模型可重现的话,必须自行设置随机数种子。 NetLog中包含"random"的原语(random, random-float等等)使用伪随机数,除此之外还 有其他操作也做随机选择。例如,主体集合(agentset)总是采用随机顺序,one-of 和 n-of 随机选择主体,sprout产生海龟,其颜色和方向是随机的,downhill当有多个瓦片时随机选 一个。所有这些随机选择都受随机数种子的控制,因此模型可再现。 random产生均匀分布整数,random-float产生均匀分布浮点数。此外还有几个随机分布。 在词典里查看random-normal, random-poisson, random-exponential和 random-gamma. 辅助随机数发生器,Auxiliary generator 按钮和命令中心的代码使用主随机数发生器。 监视器中的代码使用辅助随机数发生器。因此即使监视器执行使用随机数的计算,对模 型输出也没有影响。滑动条的代码也是如此。 105 NetLogo 4.0.2 用户手册 局部随机化,Local randomness 你可能要明确指定部分代码不要影响主随机数发生器的状态,使得模型输出不受影响。 使用with-local-randomness达到该目的,具体见词典。 海龟图形(Turtle shapes ) NetLogo 里海龟图形是矢量化的,它们是由基本几何形状,方、圆、线等组成的,而不 是由像素点阵构成的。矢量图形完全可缩放和旋转。NetLogo 缓存矢量图形大小为 1, 1.5, 2 的位图,这样能加快执行速度。 海龟的图形保存在变量shape中,可以用set命令设置。 新海龟有个图形"default"。set-default-shape原语可改变默认图形,或让每个海龟种 类有各自的默认图形。 shapes原语返回模型里当前可用图形的列表。这很有用,例如要给海龟分配一个随机图形: ask turtles [ set shape one-of shapes ] 使用海龟图形编辑器 Turtle Shapes Editor 创建自己的海龟图形,或从图形库里选图 形加入模型,或者在模型之间传递图形。详情参见本手册的 Shapes Editor 部分。 画矢量图形所使用的线宽由__set-line-thickness 控制。 代码例子 Code Examples: Breeds and Shapes, Shape Animation 链图形(Link Shapes) 链图形与海龟图形相似,只不过要用链图形编辑器(Link Shape Editor)创建和编辑。 1 链图形由 0-3 条线 和方向标志组成,每条线可以有不同的线型,方向标志由与海龟图形一 样的元素组成。链也有一个shape变量,可以设置为模型中的任何一个链图形。默认情况下, 链有个默认("default")图形,当然你可以使用set-default-shape做出改变。link-shapes 报告器返回当前模型中的所有链图形。 链变量thickness控制链图形中的线宽。 时钟计数器(Tick Counter ) 许多 NetLogo 模型中,时间是一个时间步一个时间步的向前推进,每个时间步称为一个 “滴答”(tick)。NetLogo 内置时钟计数器,可以跟踪已经运行了多少个滴答。 目前的滴答值显示在视图上部(可以使用 Settings 隐藏它,或者将"ticks"修改为其他 文字) 在程序中要获取当前时钟计数器的值,使用ticks报告器。tick命令将时钟计数器加 1。 1 译者注:链图形的三条线称为left,middle和right,它们并行排列。每条线可以为空,因此有 0-3 条。 106 NetLogo 4.0.2 用户手册 2 clear-all命令将时钟计数器重设为 0 。如果只想让时钟变成 0,不想清除其他事情,使用 reset-ticks命令。 如果模型设为基于时钟更新(tick-based update),tick命令通常也会更新视图。参 见下一部分视图更新View Updates。 什么时候用 tick ,When to tick 我们建议将tick命令用在所有主体移动和行为结束之后,以及绘图和统计计算之前。 这种情况下,当绘图或统计代码引用时钟时,得到的是新值,反映tick已完成。例如: to go ask turtles [ move ] ask patches [ grow ] tick do-plots end to do-plots plotxy ticks count turtles end 通过将tick放在do-plots之前,绘图代码使用ticks得到了正确的时钟计数。 非整数时钟,Fractional ticks 多数模型里时钟从 0 开始每次加 1,因此总是整数。但是时钟也可以为浮点数。 如果将时钟推进一个非整数值,需要使用tick-advance命令,该命令需要一个数值型输 入参数指明时钟推进多少。 非整数时钟值的一类典型应用是逼近连续或曲线运动。例如模型库中的 GasLab 模型(在 Chemistry & Physics 部分)。这些模型计算下一事件发生时间的精确值,将时钟推进到那 一刻。 视图更新(View Updates) 视图是用来在计算机屏幕上查看模型中的主体的。当主体移动和改变时,在视图里能看 到。 当然不是直接看到主体,视图是 NetLogo 绘制的图像,给你显现某一瞬间主体怎样的。 当 该 时 刻 过去 后 , 主 体移 动 、 改 变了 , 图 像 需要 重 新 绘 制。 图 像 的 重画 就 叫 做 更新 ("updating")视图。 视图什么时候更新?本节讨论 NetLogo 怎么决定何时更新,更新时你能怎么影响它。 NetLogo 有连续(continuous)和基于时钟(tick-based)两种更新模式。在界面页顶 2 译者注:clear-all 清除很多东西,时钟只是其中之一。 107 NetLogo 4.0.2 用户手册 部的弹出菜单里进行模式切换。 启动 NetLogo 或启动一个新模型后,默认是连续更新模式。然而模型库中的几乎所有模 型都采用基于时钟的模式。 连续更新模式最简单,而基于时钟模式让你对更新时刻及更新频率有更多的控制权。 到底什么时刻进行更新非常重要,因为更新时刻决定了屏幕显示。如果更新发生在不合 适的时刻,你可能看到不希望看到的结果 – 也许乱糟糟或误导你。 更新频率也很重要,因为更新需要花费时间。如果在更新上花费时间太多,你的模型运 行就很慢。更新越少,模型运行越快。 连续更新,Continuous updates 连续更新很简单,NetLogo 每秒更新视图确定的次数。默认情况下,当速度滑动条位于 中间时,每秒更新 50 次。 如果放慢速度滑动条,更新就多于 50 次/秒,模型显著变慢。放快速度滑动条,更新就 少于 50 次/秒。最快设置下,几秒才更新一次。 在极慢设置下,NetLogo 更新的非常频繁,能看到主体每次的移动(或变色等)。 如果要临时关闭连续更新,使用no-display命令。display命令打开更新,也强制立即 更新(除非用户使用速度滑动条快进) 基于时钟的更新,Tick-based updates 在时钟计数器部分我们说过,NetLogo 许多模型的时间是按小间隔推进的,一个小间隔 叫滴答(ticks)。一般情况下你希望每个滴答视图更新一次。这就是基于时钟更新的默认 行为。 如果需要额外的更新,可以使用display命令强制更新(如果使用速度滑动条快进,这 些更新会被跳过)。 使用基于时钟的更新时,你不必非要使用时钟计数器。如果时钟计数器不推进,视图只 在你使用display时更新。 如果将速度滑动条设快,NetLogo 会跳过正常情况下会发生的一些更新。然而将速度滑 动条设慢,却不会增加额外的更新,只是在每次更新之间插入暂停。速度设置的越慢,暂停 时间越长。 即使在基于时钟的模式下,当按钮(一次性和永久性)弹起以及在命令中心完成命令输 入时,视图也会更新。因此不必为那些不推进时钟的一次性按钮增加display命令。许多不 推进时钟的永久性按钮确实需要display命令。例如模型库中的Life 模型(在Computer Science -> Cellular Automata部分)。用户需要进行绘图的永久性按钮要使用display命 令,才能让用户看到所绘图形,尽管没有推进时钟。 108 NetLogo 4.0.2 用户手册 选择更新模式,Choosing a mode 基于时钟的模式的优点有: 1. 在不同计算机上,不同重复运行中视图更新行为都是一致的、可预测的。 2. 连续更新模式会让用户看到不想看到的内容,可能会让用户发懵或造成误导。 3. 运行更快。如果每个滴答更新一次就足够的话,使用该模式能减少花费在更新上的 时间。 4. 因为setup按钮不推进时钟,它不受速度滑动条的影响,这正是我们期望的行为。 上面已经说过,模型库中的模型多数采用基于时钟的视图更新方式。 时钟没有按小间隔推进的模型适合采用连续更新模式。例如模型库中的 Termites 模型。 (然而在 State Machine Example 模型里,显示了怎样将 Termites 重写为基于滴答的方式。) 即使那些正常情况下采用基于时钟的视图更新模型,为了调试也可以临时改为连续模 式。观察滴答之间发生了什么,而不是仅观察滴答时的情况,有助于解决麻烦。切换为连续 模式后,可能要拖慢速度滑动条,使你能看清每个主体的移动。由于模式存储在模型里,记 住切换回来。 绘图(Plotting) NetLogo 有绘图功能,你可以通过图形(plot)来了解模型中所发生的事情。 绘图前要先在界面页中创建一个或多个图形。每个图形应该有唯一的名字。在例程页编 写的代码中通过图名指定所要操作的图形 要了解关于在界面页中编辑图形的更多信息,参见界面指南(Interface Guide)。 指定图形,Specifying a plot 如果模型中只有一个图形,那么马上就可以绘图。但是如果有多个图形的话,必须指定 要在哪个图形上绘制,方法是使用set-current-plot命令,加上用双引号括起来的图名,像 这样: set-current-plot "Distance vs. Time" 所用的图名必须与创建图形时输入的图名完全一样。注意如果你以后修改了图名,则也 必须修改set-current-plot调用,以使用这个新名字。(使用复制、粘贴很方便)。 指定画笔,Specifying a pen 新建图形后只有一支画笔。如果当前的图形只有一支画笔,则马上可以开始绘图。 但是也可以让一个图形拥有多支画笔。使用图形编辑对话框下部的"Plot Pens"控件可 以增添画笔。每支画笔的名字必须唯一,在例程页的代码里使用画笔名指定画笔。 对于拥有多支画笔的图形,必须指定使用哪支画笔进行绘图。如果不指定的话,就使用 109 NetLogo 4.0.2 用户手册 第一支画笔。要用不同的画笔,需要使用set-current-plot-pen命令加上由双引号括起来的 画笔名。像这样: set-current-plot-pen "distance" 画点,Plotting points 实际画图时要使用的两个基本命令是plot 和plotxy 。 使用plot命令只需给定y值。所画第一个点的x值自动为 0,第二点为 1,…。(如果笔 的间隔(interval)是默认值时就是这样的,你也可以改变间隔值)。 当模型的每个时间步要画一个点时,使用plot命令特别方便。例如: to setup ... plot count turtles end to go ... plot count turtles end 注意此处在"setup" 和 "go"例程里都进行了绘制,这是因为我们希望该图形包含系统 初始状态。我们在 go 例程结束时绘制,而不是在开始时,这是因为当 go 按钮停止时,我们 得到的是系统的最新状态。 如果要同时指定所绘点的x值 和 y值,应该使用plotxy 。 代码实例 Code Example: Plotting Example 其他绘图种类,Other kinds of plots 默认时 NetLogo 画笔使用线形模式,所画的点用线连起来。 如果只想移动画笔而不画图,就使用plot-pen-up命令。该命令发出后,plot and plotxy 只移动画笔,不画图。当画笔移动到你希望画图的地方,再使用plot-pen-down 将画笔放下。 如果想只画点、不画线,或者想画条形(bar),那就需要改变画笔模式。共有三种画 笔模式:线、条形、点。默认模式是线。 一般通过编辑图形(plot)来改变画笔模式,这样就改变了画笔的默认模式。也可使用 set-plot-pen-mode命令临时改变画笔模式,该命令需要一个数值型参数:0 是线,1 是条, 2 是点。 直方图,Histograms 直方图是一类特殊的图,用来表示一组数值中的每个数或不同范围内的数出现的频率。 例如,假设模型里的海龟有年龄变量,可以使用histogram命令产生海龟年龄分布 histogram [age] of turtles 110 NetLogo 4.0.2 用户手册 直方图所表达的数不一定来自主体集合(agentset),也可以来自数值型列表(list of numbers)。 注意使用histogram命令并不自动将画笔模式切换为条形模式,必须自己设置画笔模式 为条形。(前面说过,可以在界面页中编辑图形,改变画笔默认模式)。 直方图中条形的宽度由画笔间隔决定。可以在界面页中编辑图形,改变画笔默认间隔。 也可使用set-plot-pen-interval 或set-histogram-num-bars命令临时改变画笔间隔。使用 set-histogram-num-bars时,NetLogo根据当前x范围内给定的条形数目计算出条形的近似宽 度。 代码实例 Code Example: Histogram Example 清除和重设,Clearing and resetting 使用clear-plot命令清除当前图形,clear-all-plots命令清除所有图形。clear-all命 令清除模型中的所有东西,当然也包括所有图形。 如果要清除当前图上已经画上的点,使用plot-pen-reset。 清除图形或重设画笔不只是清除已经画过的数据,还将图形或画笔重设为默认设置,这 些默认设置是在界面页中创建或最后编辑图形时决定的。因此像set-plot-x-range 和 set-plot-pen-color 这样的命令,其效果是临时的。 自动绘图,Autoplotting 默认情况下 NetLogo 图形的自动绘图(autoplotting)功能是激活的。自动绘图的含义 是:当要画的点超过当前显示范围时,图形的范围(一个坐标轴或两个坐标轴)自动增加, 以使新点可见。 为避免每次增加新点时图形范围都要变化,增加时留有一定的余地。增加时水平方向多 增加 25%,垂直方向多增加 10%。 若要关闭自动绘图功能,则编辑图形反选 Autoplot 项。目前不能只对一个坐标轴选择 激活/关闭,而是必须对两个坐标轴同时设定。 临时画笔,Temporary plot pens 多数图形始终有固定数目的画笔。但有些图形有更复杂的需求,需要画笔数量随条件而 变。这种情况下你可以编写代码创建临时画笔,然后使用它们。这些画笔称为“临时”的原 因在于当清除图形(使用clear-plot, clear-all-plots或clear-all)后,它们就消失了。 使用create-temporary-plot-pen命令创建临时画笔,一旦创建,使用方法与其他画笔 无异。画笔默认是放下的、黑色、间隔为 1、使用线模式,有些命令用来改变它们,参见NetLogo 词典的Plotting部分。 使用图例,Using a Legend 在图形编辑对话框中勾选 "Show legend" 显示图例。如果不想让某支笔的图例显示出 111 NetLogo 4.0.2 用户手册 来,在编辑框里反选那支笔的"Show in Legend"选项即可。 结论,Conclusion 此处对绘图的介绍并不全面,更多的信息参见 NetLogo 词典的 Plotting 部分。 模型库的模型实例演示了许多高级绘图技术。看看下面的例子: 代码实例 Code Examples: Plot Axis Example, Plot Smoothing Example, Rolling Plot Example 字符串(Strings) 要输入字符串常量,用双引号括起来。 在一对双引号内什么都没有,则是空串,即""。 大多数关于列表(list)的原语同样可用于字符串: but-first "string" => "tring" but-last "string" => "strin" empty? "" => true empty? "string" => false first "string" => "s" item 2 "string" => "r" last "string" => "g" length "string" => 6 member? "s" "string" => true member? "rin" "string" => true member? "ron" "string" => false position "s" "string" => 0 position "rin" "string" => 2 position "ron" "string" => false remove "r" "string" => "sting" remove "s" "strings" => "tring" replace-item 3 "string" "o" => "strong" reverse "string" => "gnirts" 有些字符串专用的原语,如is-string?, substring和word: is-string? "string" => true is-string? 37 => false substring "string" 2 5 => "rin" word "tur" "tle" => "turtle" 112 NetLogo 4.0.2 用户手册 字符串可以进行比较,操作符有 =, !=, <, >, <=, and >= 。 如果要嵌入特殊字符,使用转义序列: • • • • \n = 新行 \t = tab \" = 双引号 \\ = 反斜线 输出(Output) 这一部分讲屏幕输出。使用export-output命令可以将屏幕保存到文件。如果需要更灵 活的将数据输出到外部文件的方法,参见下一部分文件输入输出(File I/O)。 NetLogo中产生屏幕输出的基本命令是print, show, type 和write ,这些命令将输出 送到命令中心。 要了解这些命令的细节,参见 NetLogo 词典的条目。下面是典型用法: • • • • print show type write 多数情况下都可以使用 让你看到每个主体在输出什么 让你在一行里输出几项内容 按某种格式输出数值,这些值可以被file-read读回 NetLogo模型也可以在界面页中有一个输出区域("output area"),这个区域是与命令 中心分开的。如果要输出到这个区域而不是命令中心,使用output-print, output-show, output-type 和output-write命令。 输出区域可以使用clear-output 命令清除,也可使用export-output 存入文件。输出 区域的内容使用export-world 命令保存。import-world 命令将清除输出区域,将其内容设 为输入世界文件(imported world file)的内容。注意将太多的数据送到输出区域会导致 输出世界文件较大。 如果模型没有独立的输出区域,而使用output-print, output-show, output-type, output-write, clear-output或export-output 命令,这些命令将作用到命令中心。 文件输入输出(File I/O) NetLogo 提供了一些与外部文件进行交互的原语,这些原语的前缀都是 file- 。 主要有两种处理文件的方式:读和写,区别在数据流的方向。读是指将数据从文件中取 出,流到模型中。写是指将数据从模型输出到文件中。 当 NetLogo 模型作为 applet 在浏览器中运行时,只能从模型所在的目录文件读数据, 而不能写到任何文件。 当操作文件时,必须首先使用file-open 原语指定要操作哪个文件。除非先打开文件, 否则其他文件操作无法进行。 113 NetLogo 4.0.2 用户手册 下面的 file-原语指明文件的模式,直到关闭、读或写。要切换模式,关闭然后重新打 开文件。 读原语包括file-read, file-read-line, file-read-characters 和file-at-end? 。 注意在打开和读操作之前,这些文件必须存在。 代码实例 Code Examples: File Input Example 文件写原语与屏幕输出原语类似,只不过输出到文件,包括file-print, file-show, file-type 和 file-write 。注意不可能覆盖(overwrite)数据。也就是说,如果写入一 个已经有数据的文件,新数据只能添加在尾部。 (如果要覆盖一个文件,使用file-delete 删 除它,然后打开进行写操作) 代码实例 Code Examples: File Output Example 不再使用文件时,使用file-close 结束会话。如果要删除文件,使用file-delete 。 要关闭多个打开的文件,先用file-open选择文件,然后关闭。 ;; Open 3 files file-open "myfile1.txt" file-open "myfile2.txt" file-open "myfile3.txt" ;; Now close the 3 files file-close file-open "myfile2.txt" file-close file-open "myfile1.txt" file-close 或者,如果知道要全部关闭的话,使用file-close-all 。 有两个命令file-write 和 file-read 值得注意,它们用来方便的保存、获取NetLogo 常量,如数值、列表、布尔值等。file-write 总是以file-read 可以正确解释的方式输出 变量。 file-open "myfile.txt" ;; Opening file for writing ask turtles [ file-write xcor file-write ycor ] file-close file-open "myfile.txt" ;; Opening file for reading ask turtles [ setxy file-read file-read ] 114 NetLogo 4.0.2 用户手册 file-close 代码实例 Code Examples: File Input Example and File Output Example 用户选择,Letting the user choose 原语user-directory, user-file和 user-new-file 让用户选择一个文件或目录,你的 代码在用户选择的文件或目录上操作。 电影(Movies) 这一部分介绍将 NetLogo 模型捕获为 QuickTime 电影。 首先使用movie-start命令开始新电影,所提供的文件名后缀为.mov,这是QuickTime 电影的扩展名。 要向电影中加一帧,使用movie-grab-view或movie-grab-interface,前者只显示视图, 后者显示整个界面页。在一个电影里,必须只使用一种movie-grab-原语,不能混用。 所有帧加完后,使用movie-close 。 ;; export a 30 frame movie of the view setup movie-start "out.mov" movie-grab-view ;; show the initial state repeat 30 [ go movie-grab-view ] movie-close 电影的默认播放速度是 15 帧/秒,用movie-set-frame-rate 设定不同的帧率。你必须 在movie-start 之后和抓帧之前设定帧率。 movie-status 用来检查帧率或看看已抓了多少帧,它返回一个描述当前电影状态的字符 串。 要放弃电影或删除电影,调用movie-cancel 。 代码实例 Code Example: Movie Example NetLogo电影是无压缩QuickTime文件。从Apple下载免费播放软件QuickTime Player播 放它。 由于文件未压缩,很占磁盘空间,你可能想用第三方软件对它进行压缩。压缩时有多种 选择,有些是有损压缩,有些是无损压缩。有损是指压缩时丢弃了一些细节,文件较小但图 像质量下降。有些模型不应使用有损压缩,例如视图中包含精细的像素级的细节。 QuickTime Pro 是一款能在 Mac 和 Windows 平台上压缩 QuickTime 电影的软件。在 Mac 平台上,iMovie 也不错。 115 NetLogo 4.0.2 用户手册 视角(Perspective) 2 维和 3 维视图都采用观察者(Observer)视角。默认时,观察者在正Z轴向下俯视世 界。可以使用follow, ride 和watch这些观察者命令和 ride-me and watch-me海龟命令改 变观察者的视角。在跟随(follow)或乘骑(ride)模式,观察者和目标主体一起在世界中移 动。跟随和乘骑模式只在 3 维视图中有区别。在 3 维视图里,用户可以使用鼠标改变跟随距 离,当跟随距离为 0 时就是乘骑模式。当观察者处于观看(watch)模式,它跟踪一个海龟 的移动而自己不动。在这些模式里你会看到目标上的聚光灯,并且在 3 维视图里观察者面对 目标主体。要知道哪个主体是焦点,使用subject报告器。 代码实例 Code Example: Perspective Example 绘画(Drawing) 在绘画层,海龟可以制作可见标记。 在视图里,绘画层处于瓦片之上和海龟之下。初始时刻绘画层是空的、透明的。 你能看到绘画层,但海龟(和瓦片)察觉不到绘画层,也不能对绘画层中的对象做出反 应。绘画层只是用来给人看的。 海龟使用pen-down 和pen-erase命令在绘画层画线或擦除。如果海龟的画笔放下(或擦 除),当他移动时就在身后画出(或擦除)线,线的颜色与海龟颜色一致。要停止画图(或 擦除),使用pen-up 。 正常情况下海龟画的线 1 个像素宽。在画图(或擦除)之前,设置海龟变量pen-size 可 以改变线的粗细。新海龟该变量为 1. 当海龟没有沿固定方向移动时,例如setxy 或 move-to,所画的线就是按拓扑性质得到 的最短路线。 这里有一些在随机灰度的瓦片上移动的海龟进行绘制的例子。注意海龟如何盖住了线, 线如何盖住了瓦片。这里的pen-size 是 2 。 116 NetLogo 4.0.2 用户手册 stamp 命令让海龟在身后留下自身图像,stamp-erase擦除下面绘画层的像素。 要擦掉整个绘画层,使用观察者命令clear-drawing。(也可使用clear-all,它也清除 所有其他东西) 输入图像,Importing an image 观察者命令import-drawing 允许你从磁盘输入图像到绘画层。 import-drawing 只提供让人们观看的背景。要想实现海龟和瓦片与图像的交互,使用 import-pcolors 或 import-pcolors-rgb 。 与其他 Logo 的比较,Comparison to other Logos 绘画层在 NetLogo 里与其他 Logo 有所不同。 显著区别包括: • • • 新海龟的画笔是抬起的而不是放下的 要限制海龟绘画的边界,需要编辑世界设置,关闭回绕,而其他Logo使用fence 命 令来限制海龟绘画边界 没有screen-color, bgcolor, 或 setbg 。可以通过指定瓦片颜色设定单色背景,例 如ask patches [ set pcolor blue ] NetLogo 不支持的绘画功能: • • 没有 window命令。有些Logo使用该命令实现海龟在无限平面上的漫游 没有 flood 或fill命令着色封闭区域 拓扑(Topology) NetLogo 世界有四种拓扑类型:环面(torus)、盒子(box)、垂直柱面(vertical cylinder) 和水平柱面(horizontal cylinder)。通过打开或关闭 x,y 方向的回绕设定拓扑。世界默 认是环面,就像 NetLogo3.1 之前的设置一样。 环面在两个方向都回绕,即世界的上下边界连在一起,左右边界连在一起。因此如果海 龟移出右边界就会出现在左边界,上边界和下边界也是如此。 盒子在两个方向都不回绕,世界是有界的,因此海龟没法移出边界。注意边界上的瓦片 少于 8 个邻元,角上的只有 3 个邻元,其他的有 5 个。 水平或垂直柱面只在一个方向回绕,而另一个方向不回绕。水平柱面是垂直回绕,即上 下边界相连,而左右不连。垂直柱面与此相反,是水平回绕,即左右边界相连,但上下边界 不连。 代码示例 Code Example: Neighbors Example 从 NetLogo 3.0 以后有设置用来激活回绕的可视化,因此如果海龟图形跨越边界时,海 117 NetLogo 4.0.2 用户手册 龟的部分图形会显示在对面边界。 (海龟本身是不占空间的点,不可能处在世界的两个边界, 但海龟图形有大小,所以看起来占用空间。) 当你跟随海龟时,回绕会影响视图显示。在环面上,不管海龟走到哪里,你总是看到周 围的世界: 然而在盒子或柱面世界,世界有边,超出世界范围的部分在视图里显示为灰色。 代码例子 Code Example: Termites Perspective Demo (torus), Ants Perspective Demo (box) NetLogo 3.0 里的设置只控制回绕在视图上的显示,而在 3.1 可以控制世界是否真的回 绕,即对向边是否相连。这些新设置决定了世界拓扑,即环面(torus)、盒子(box)、垂 118 NetLogo 4.0.2 用户手册 直柱面(vertical cylinder)和水平柱面(horizontal cylinder)。这影响行为,而不仅 影响模型的显示。 过去建模人员需要使用"no-wrap"原语,编写额外的代码模拟盒子型世界,提供了 distance(xy), in-radius, in-cone, face(xy)和 towards(xy)的 No-wrap 版本。在 3.1 里不再需要这些版本,而是由世界拓扑决定这些原语是否回绕。它们总使用拓扑允许的最短 路径。例如,给定 pxcor 和 pycor 最大最小值为+/-2,那么各种拓扑下从右下角瓦片 (min-pxcor, min-pycor)中心到左上角瓦片(max-pxcor, max-pycor)中心的距离为: • • • • 环面 - sqrt(2) ~ 1.414 (不管世界规模多大,总是这个值。因为在环面上这两个瓦片 对角相邻) Box - sqrt(world-width^2 + world-height^2) ~ 7.07 垂直柱面 - sqrt(world-height^2 + 1) ~ 5.099 水平柱面 - sqrt(world-width^2 + 1) ~ 5.099 其他原语的行为和 distance 相似。如果你以前使用 no-wrap 原语,我们建议你删掉它, 改用设置世界拓扑原语。 有几点原因推荐你这么做: 第一,我们期望如果你使用 no-wrap 原语时,你实际建立的模型世界不是环面。如果你 使用适合世界性质的拓扑,NetLogo 自动进行边界检查,这样你的日子更好过,代码简单易 理解,并且有可视线索帮助用户理解你的模型。注意即使有 no-wrap 原语,也很难对柱面世 界建模,因为 no-wrap 原语只有两个方向都不回绕时才报告距离和方向。 你的模型可能有 bug。如果你混合使用了 no-wrap 和 wrap,你的模型或者没事,或者有 bug。(我们的模型就发现了几个 bug)。例如 Conductor 模型通过比较 distance-no-wrap 和 distance 判断下一个位置是否回绕,这样的话电子退出系统。这是个聪明的方法,但不幸 的是有漏洞。电子在 y 方向回绕也会退出系统,而这是不对的。唯一正确的退出方式是到达 线路左端的阴极。 如果去除 no-wrap 命令,则拓扑就不是模型的硬编码了,因此不需增加太多代码就可以 对各种类型世界下的模型进行测试。(从环面到盒子还是要加上一些检查的,这一点在怎么 转换部分解释。) 注意尽管我们把词典中的 no-wrap 删除了,但你还是可以使用它。我们这样做的目的是 保证旧模型不加修改仍然可以运行。 怎样转换模型,How to convert your model 在 NetLogo 3.1 , 当 第 一 次 打 开 模 型 时 , NetLogo 自 动 将 各 种 情 况 下 的 ( -screen-edge-x ) 3 变为min-pxcor,将screen-edge-x变为max-pxcor(对y同样 如此)。尽管这与拓扑的改变没有直接关系,但你还是要考虑原点偏离中心是否会导致模型 不合理。在 3.1 之前,世界必须是关于原点对称的,即世界的高度和宽度必须是奇数(译者: 因为中心瓦片占一个位置)。现在不需要这样了,你可以设定任何min、max组合,只要保证 (0,0)仍然在世界中。如果你的模型只需要一个或两个象限,或者只使用正坐标值以使模 3 译者注: -screen-edge-x 指世界左边界的x坐标,而screen-edge-x指右边界x坐标 119 NetLogo 4.0.2 用户手册 型更简单,你可以考虑改变模型。如果你过去使用程序实现偶数网格,现在当然可以把这些 程序去掉了。 Code Examples: Lattice Gas Automaton, Binomial Rabbits, Rugby NetLogo3.1 增加了新的原语,使用这些原语改变拓扑很方便,当然其他时候也很方便。 random-pxcor, random-pycor, random-xcor和 random-ycor返回最小最大(x和y)范围内 的随机数。过去要实现海龟随机位置要依赖回绕,使用setxy random-float screen-size-x random-float screen-size-y。如果某个方向不允许回绕,那就不行了。(产生运行错误, 原因是视图将海龟布置在世界之外)。现在使用setxy random-xcor random-ycor,不用管 拓扑,也更简单、直接。 将模型转换为使用拓扑,必须首先决定哪种设置最合适。如果基于真实世界得到的答案 不是太明显,(房间是盒子,导线是柱面),有几个线索对你有帮助。如果程序某处检查世 界边界,或者某些瓦片不是视图上对面瓦片的邻居,大概是你没有使用环面。如果在 x 和 y 方向都进行边界检查,那就是盒子,如果只检查 x 方向,那就是水平柱面,如果只检查 y 方 向,则是垂直柱面。 如果你使用了 no-wrap,可能你没有使用环面。然而如果既有 no-wrap,也有 wrap,则 使用这个准则时要谨慎。也许是仅对可视元素使用 no-wrap,而其他部分仍是环面。 在你选定了拓扑并通过编辑视图改变后,也许还要对代码做一些修改。如果世界是环面, 可能不需任何修改。如果模型只使用瓦片和扩散,可能不需任何修改。 如果模型有海龟到处移动,下一步是当它们达到边界时要决定发生什么。有几个常见的 选择:海龟反射回世界(对称或随机),海龟退出系统(死亡),或海龟隐藏。这些时候就 不需使用海龟坐标检查边界,而是判断海龟是否位于世界边界。有几个判断方法,最简单的 是使用can-move?原语。 if not can-move? distance [ rt 180 ] 仅当海龟前方distance仍在世界之内时can-move?返回true,否则返回false。这种情况 下,如果海龟位于边界,则原路返回。也可使用patch-ahead 1 != nobody 代替can-move? 。 如果要做更复杂的事情,而不是简单的返回,则使用patch-at with dx and dy 。 if patch-at dx 0 = nobody [ set heading (- heading) ] if patch-at 0 dy = nobody [ set heading (180 - heading) ] 这是测试海龟是否撞上水平或垂直墙,并且从墙上弹回。 在 一 些 模 型 里 如 果 海 龟 不 能 移 动 则 死 亡 ( 退 出 系 统 , 例 如 例 子 Conductor 或 Mousetraps) if not can-move? distance[ die ] 如果使用 setxy 而不是 forward 移动海龟,则应该测试将移动到的瓦片是否存在,因为 如果 setxy 给定的坐标不在世界之内则抛出运行错误。这常见于模拟无限平面时,超出视图 的海龟只是简单隐藏。 120 NetLogo 4.0.2 用户手册 let new-x new-value-of-xcor let new-y new-value-of-ycor ifelse patch-at (new-x - xcor) (new-y - ycor) = nobody [ hide-turtle ] [ setxy new-x new-y show-turtle ] 模型库里有几个模型使用这项技术。如 Gravitation, N-Bodies 和 Electrostatics。 通过使用不同的拓扑,你可以自由扩散(diffuse)(过去很难做到)。每个瓦片扩散将 等量的扩散变量给它的邻居,如果少于 8 个邻居(使用 diffuse4 则是 4 个)则剩余部分保 持在消散瓦片上。这意味着整个世界瓦片变量之和保持常数。如果有特殊代码处理扩散则去 掉它们。但是如果扩散物质要从边界落下,则仍然需要每一步进行边界清除,如例子 Diffuse Off Edges。 链(Links) 链是连接两个海龟的主体,这两个海龟称为节点(node),链总是画为两个海龟之间的连 线。与海龟不同,链没有位置,也不在任何瓦片之上,也不能查找链和某个点之间的距离。 有两种风格的链:无向(undirected)和有向(directed)。有向链出自(out)或源自 (from)一个节点,进入(into)或到达(to)另一个节点。如父子关系就可以用有向链表示。 无向链对两个节点看起来都一样,每个节点与另一个节点之间有链。配偶或同胞关系就是无 向链。 和 turtles 或 patches 一 样 , 所 有 链 有 全 局 主 体 集 合 。 使 用 create-link-with 和 create-links-with命令创建无向链,创建有向链则使用create-link-to, create-links-to, create-link-from 和 create-links-from 命令。一旦第一个链创建为有向或无向,则所有 未分种类(unbreeded)的链必须一致(译者:全为有向或全为无向)。(链也支持种类,后 面简短讨论)。未分种类的链不可能有的有向,有的无向。如果这样会出现运行错误。(如 果所有未分种类的链死亡了,则能创建与以前的链风格(译者:指有向,无向)不同的链)。 与有向链有关的原语名字里有"in", "out", "to", "from"。无向链原语没有这些,或 使用"with"。 链的种类,如海龟种类一样,使你可以定义不同种类的链。链种类必须设定为有向或无 向 。 使 用 关 键 词 undirected-link-breed 和 directed-link-breed 声 明 链 种 类 。 使 用 create- -with 和 create- -with 创 建 无 向 的 有 种 类 链 , 使 用 create- -to, create- -to, create- -from 和 create- -from 创建有向的有种类链。 一对主体之间的同种类的无向链不能超过 1 个(无种类的链不能超过 2 个),一对主体 之间也不能有超过 1 个的同向的同种类的有向链。在一对主体之间,可以有两个同种类(或 者两个未分种类的链)的反向的有向链。 布局,Layouts 121 NetLogo 4.0.2 用户手册 作为实验性的网络支持功能的一部分,我们也提供了几个不同的原语,帮你实现网络可 视化。最简单的原语是layout-circle,它以世界中心为中点,根据给定的半径,均匀地将 主体布局为圆形。 对某些类似树状的结构使用layout-radial 可以实现不错的布局。即使树中有一些圈, 它也可以工作,只是圈越来越多看起来不太好。layout-radial将一个根主体(root agent) 作为中心节点放在(0,0)处,按同心圆模式安排其他节点。距离根节点 1 度的节点安排在 离中心最近的圆上,2 度的在第二层,依次进行。 layout-radial试图考虑图的不均匀性,给较宽的分支分配较大的空间。layout-radial 也 可以将某个种类做输入参数,这样只使用某个种类的链对网络进行布局。 给定一组支撑(anchor)点后,layout-tutte将其他节点布置在该节点所有相连节点的 质心处。支撑点集根据用户定义的半径采用圆形布局,然后其他节点逐渐收敛到应该在的位 置。(这意味着要运行几次后才能稳定)。 122 NetLogo 4.0.2 用户手册 layout-spring 和__layout-magspring 很相似,对许多种类的网络很有用。缺点是相对较 慢,因为要循环多次才能收敛。在这两种布局里,链就像弹簧,将所连接的两个节点向一起 拉,而节点是互斥的。在磁性弹簧(magnetic spring)里,还有磁场在你选择的罗盘方向 拉动节点。这些力的强度由原语中的输入参数决定,这些值都在 0-1 之间,记住即使很小的 改变也可能影响网络形状。弹簧还有长度(用瓦片数为单位),然而因为力量并不恰好结束 在节点之间的距离上。磁性弹簧布局还有一个布尔输入参数bidirectional?,它指明弹簧是 否在两个方向产生推力,如果是的话,网络分布就更均匀。 代码例子 Code Examples:Network Example, Network Import Example, Giant Component, Small Worlds, Preferential Attachment 并发请求(Ask-Concurrent) 在以前的NetLogo里,ask默认是并发的。而在NetLogo 4.0,ask是串行的,即每次一个 主体运行所请求的命令。 下面描述ask-concurrent的行为,这些行为与老的ask一样。 ask-concurrent通过轮转(turn-taking)机制模拟并发。首先是第一个主体,然后是第二 123 NetLogo 4.0.2 用户手册 个,依次进行,直到所请求的每个主体都轮转一遍,然后返回到第一个主体。直到所有主体 执行完所有命令。 如果主体执行的行为影响世界状态,它的“次序”(turn)结束。例如创建海龟,改变全 局变量、海龟变量、瓦片变量或链变量等。(设置局部变量没关系) 命令forward (fd) 和 back (bk)受到特殊对待。当用在ask-concurrent中时,这些命 令分成多轮执行。在每一轮海龟只移动 1 步。例如fd 20 等价于repeat 20 [ fd 1 ],每个 fd后海龟的轮次就结束。如果距离不是整数,则最后的小数部分当作一个轮次。例如fd 20.3 等价于repeat 20 [ fd 1 ] fd 0.3。 不管距离是多少,jump命令总是只用 1 轮 要理解ask 和 ask-concurrent 的区别,考虑下面的两个命令: ask turtles [ fd 5 ] ask-concurrent turtles [ fd 5 ] 用ask,第一个海龟前进 5 步 ,然后第二个海龟前进 5 步,…。 4 用ask-concurrent,所有海龟前进 1 步,然后在前进 1 步,…。因此该命令等价于: repeat 5 [ ask turtles [ fd 1 ] ] 代码实例Code Example: Ask-Concurrent Example 显示了ask 和 ask-concurrent的区别。 ask-concurrent 的行为并不总能简单的由ask 产生。下面的命令: ask-concurrent turtles [ fd random 10 ] 为了使用ask 得到相同的行为,必须写成: turtles-own [steps] ask turtles [ set steps random 10 ] while [any? turtles with [steps > 0]] [ ask turtles with [steps > 0] [ fd 1 set steps steps - 1 ] ] 要延长一个主体的“轮次”,使用without-interruption命令。(有些命令包含这个命 令,如create-turtles和hatch 隐含了这条命令)。 注意ask-concurrent的行为是完全确定性的。给定相同的代码和相同的初始状态,总是 发生相同的事情。(前提是使用相同的NetLogo版本,指定相同的随机数种子) 一般我们建议你的模型不要依赖于ask-concurrent的工作细节。我们不保证它的语意在 将来的版本里仍然如此。 4 译者注:原文为 10 步,此处有误。 124 NetLogo 4.0.2 用户手册 捆绑(Tie) 捆绑将两个海龟连在一起,当一个海龟运动时另一个的位置和方向也受到影响。捆绑是 链的一个特性,因此要创建捆绑关系,两个海龟之间必须有链存在。 当链的tie-mode设为"fixed" 或"free",节点 1(end1)和节点 2( end2)就捆绑在一 起了。如果链是有向的,end1 指根主体(root agent),end2 指叶主体(leaf agent)。 当end1 移动时(使用fd, jump, setxy等),end2 也移动相同的距离和方向。然而当end2 移 动时,不影响end1 。 如果是无向链则是相互捆绑关系,即只要一个海龟移动,另一个就移动。每个节点都可 以被看作根或叶,取决于哪个移动。根海龟总是那个发起移动的海龟。 当根海龟左转或右转时,叶海龟围绕根海龟旋转相同的角度,就像二者之间有刚性连接。 如果tie-mode 设为"fixed",叶海龟的方向也改变相同的量,如果tie-mode 设为"free",叶 海龟的方向不变。 链的tie-mode 可以用tie 命令设为"fixed",或用untie 命令设为"none"(即海龟不再 连接),要设为"free",使用set tie-mode "free"。 代码实例 Code Example: Tie System Example 多个源文件(Multiple source files) 关键词__includes使得可以在一个模型里使用多个源文件。 该关键词前面是两个下划线,表明这是实验性的,以后可能会修改。 当你打开使用了__includes的模型,或将它加到模型的首部然后点击Check按钮,工具 条里就会出现includes菜单。在includes菜单里选择模型包含的文件。 当你打开include文件时,它出现在附加的例程页里。细节参见界面指南Interface Guide。 任 何 可 以 出 现 在 例 程 页 中 的 东 西 都 可 以 放 在 外 部 源 文 件 (.nls) 中 , 例 如 breed, turtles-own, patches-own, breeds-own, 例程定义等。然而注意这些声明共享同一个名字 空间。即如果在例程页声明了一个全局变量my-global,你就不能在其他文件里再次声明, my-global可以在所有include文件里访问。如果在include文件里声明了my-global,也一样。 语法(Syntax) 这一部分包括了许多读者不熟悉的技术术语。 关键词(Keywords) NetLogo语言仅有的关键词是globals, breed, turtles-own, patches-own, to, 125 NetLogo 4.0.2 用户手册 to-report, 和 end, 以及 extensions 和实验性的__includes. (内置原语不能覆盖不 能重定义,实际上也是一种关键词) 标识符(Identifiers) 所有原语、全局变量和海龟变量名、例程名共享单一的全局性的大小写不敏感名字空间。 局部名( let 变量与例程输入变量)与全局变量不会相互覆盖。标志符由字母、数字,以 及 ASCII 字符: [.?=*!<>:#+/%$_^'&-] 组成。 目前不允许非 ASCII 字母做标识符。(我们意识到这对国际用户造成麻烦,计划在未 来解决它) 那些两个下划线开始的原语名表示它们是实验性的,将来的版本里可能会改变或去掉。 问号开始的标识符是保留的。 范围(Scope) NetLogo 是范围化的。局部变量(包括例程的输入)在它所声明的命令块里可访问。但 不能被这些命令所调用的例程访问。 注释(Comments) 分号表示注释的开始,注释到行尾结束。没有多行注释语法。 结构(Structure) 程 序 可 以 包 括 一 些 可 选 的 声 明 (globals, breed, turtles-own, patches-own, -own),顺序任意。然后是 0 个或多个例程定义。可以用breed 声明多个种类,而其 他声明只能出现 1 次。 每个例程定义由to 或 to-report开始,然后是例程名,以及可选的方括号中的输入变 量列表。每个例程定义由end 结束。中间是 0 个或多个命令。 命令和报告器(Commands and reporters) 命令有 0 个或多个输入,输入是报告器,报告器也可有 0 个或多个输入。不用标点分隔 或终止命令或输入。标识符必须由空格或圆括号、方括号分开。(例如a+b是一个单一标识 符,而a(b[c]d)e包括 5 个标识符) 所有命令都是前缀式(prefix)。所有用户定义的报告器是前缀式。多数原语报告器是 前缀式,但有些(算术操作,布尔操作和一些主体集合操作)是中缀式(infix)。 126 NetLogo 4.0.2 用户手册 所有命令和报告器,不管是原语还是用户定义的,默认采用固定数量的输入。(这就是 为什么没有标点分隔或终止命令或输入,而语言却可以被解析的原因)。一些原语有可变数 量的输入,这时采用括号,例如(list 1 2 3)。(因为list默认 2 个输入)。括号也用来改 变操作符默认优先序,例如(1 + 2) * 3 。 有时原语的一个输入是一个命令块(方括号里 0 个或多个命令),或一个报告器块(方 括号中一个报告器表达式)。用户定义的命令和报告器不能使用命令或报告器块做输入。 操作符优先序,从高到低,如下: • with, at-points, in-radius, in-cone • (all other primitives and user-defined procedures) • ^ *, /, mod +, <, >, <=, >= =, != and, or, xor • • • • • 与其他 Logo 的比较(Compared to other Logos) Logo 是个松散的语言家族,没有一致接受的 Logo 标准定义。我们相信 NetLogo 与其他 Logo 有足够多的相同部分,可以配得上 Logo 之名。当然 NetLogo 与其他 Logo 有一些不同 之处。最重要的区别如下: 表面区别(Surface differences) • • • • • • 数学运算优先级不同。中缀数学操作(像+,*等)比有名报告器优先级低。例如在许 多Logo里,sin x + 1 被解释为sin (x + 1)。相反NetLogo像多数其他语言那样解 释,解释为(sin x) + 1。 and 和 or报告器是特殊形式,不是一般函数,进行“短路”计算,即如果必要的话 仅评估第 2 项输入。 例程只能在例程页定义,不能在命令中心交互输入。 报告器例程必须用to-report定义。返回值的命令是report。 定义例程时,例程输入必须用[],例如to square [x]. 变量名不使用标点. 最后三项区别由下面的例程定义演示: most Logos NetLogo to square :x to-report square [x] output :x * :x report x * x end end 127 NetLogo 4.0.2 用户手册 深层区别(Deeper differences) • • • • • NetLogo 是固定范围,而不是动态范围. NetLogo没有"word"数据类型(Lisp叫做 "symbols)。最终可能会加上,但不太常用。 我们有strings类型,有些Logo使用"word"的地方,我们使用strings。例如在Logo 里可以写[see spot run] (a list of words),但在NetLogo你必须写"see spot run" 串)或 ["see" "spot" "run"] (串列表) NetLogo's 的run 可操作strings,,但不能操作列表,不允许重新定义例程。 如if和 while的控制结构是特殊形式,你不能自己定义它们的形式,也就不同定义 自己的控制结构(NetLogo's 的run在这没用) 像多数Logo一样,不能以函数为值。多数Logo提供了相似但一般性交叉的功能,允 许以列表形式传递和操作代码片段。NetLogo这方面能力受限。一些内建的UCBLogo风格的模板实现相似目的,如 sort-by [length ?1 < length ?2] string-list。 在某些情况下使用run and runresult可以,但不像其他多数Logo那样,它们只对串 而不是列表操作。 当然 NetLogo 还包括其他多数 Logo 没有的功能,其中最重要的就是主体和主体集合。 128 NetLogo 4.0.2 用户手册 迁移指南(Transition Guide) 许多早期 NetLogo 版本创建的模型在 4.0 里能正常工作。然而,有些模型需要改动。如 果你的旧模型不能正常工作,用户手册的本部分能帮你。 你需要了解的问题与模型多旧有关,模型越旧需要了解的问题越多。 本部分没有列出 NetLogo4.0 的所有变化,只是讨论了那些对用户可能造成问题的部分。 在更新历史部分列出了所有的变动。 • • 从NetLogo 3.1 迁移 从NetLogo 3.0 迁移 从 NetLogo 3.1 迁移 海龟编号(Who numbering) 在NetLogo4.0 之前,死亡海龟的编号(存储在海龟变量who)可以重新指派给新生的海 龟。在 4.0,海龟编号不会重用,除非通过clear-all 或 clear-turtles 命令将编号重设 为 0。这一变化会对一些旧模型造成问题。 海龟创建:随机与"有序" (ordered) NetLogo 4.0 提 供 了 两 个 观 察 者 命 令 create-turtles (crt) 和 create-ordered-turtles (cro),用来创建海龟。 crt 创建的新海龟有随机颜色和随机整数方向。cro 按顺序分配颜色,按顺序等间隔分 配方向,第一个海龟的方向是正北(角度为 0)。 在 4.0 之前 crt 命令的行为与现在的 cro 一样。如果旧模型依赖“有序”行为,需要将 代码中的 crt 改为 cro。 在旧模型常用crt包含额外的命令实现海龟方向随机化,例如rt random 360 或set heading random 360。当在crt中使用时,这些命令不再需要。 增加字符串和列表 在 4.0 之前+ (加号)操作符可用于拼接字符串和连接列表,在当前版本,+ 只能用于数 值。要拼接字符串使用word原语,要连接列表使用sentence原语。这些语言变化是为了增加 使用+代码的运行速度。 旧代码: 129 NetLogo 4.0.2 用户手册 print "There are " + count turtles + " turtles." 新代码: print (word "There are " count turtles " turtles.") 同样,如果需要拼接列表,使用 SENTENCE 。 当转换旧模型时,这些变动不会自动处理,需要用户手工改变代码。 我们知道对习惯旧语法的用户来说这个变动太笨拙。我们的目的是效率和一致性。当不 是同时处理几个数据类型时,我们可以实现更高效率的数值相加运算。因为加是常见操作, 因此 NetLogo 的总体速度提高了。 -at 原语 观察者不再使用patch-at, turtles-at, BREEDS-at。相反使用patch, turtles-on, BREEDS-on。注意瓦片对输入进行舍入(以前只接受整数输入) 链 NetLogo 3.1 支持使用链来连接海龟,用于创建网络、图和几何图形。链本身是海龟。 在 NetLogo 4.0,链是观察者、海龟、瓦片之外的第四种独立的主体类型。与链有关的 原语不再是实验性的,现在是语言的一部分。 使用旧的、实验性的基于海龟的链原语需要改变为使用链主体。区别不是特别大,但需 要手工更新。 链的文档在编程指南的链部分,链原语见 NetLogo 词典的有关条目。模型库的 Networks 部分有一些例子模型,还有一些基于链的代码实例。 首先如果只用一种类型(type)的链,你需要移除任何名为"links"的种类,然后根本 不 必 使 用 种 类 。 如 果 使 用 多 种 类 型 的 链 , 参 见 undirected-link-breeds 和 directed-link-breeds 。包括单词"links" (如 __create-links-with,等)的命令和报告器 自动转换为不带下划线(create-links-with)的新形式,然而使用其他种类名(如"edges") 的原语不转换,你需要手工移去下划线。除非你的链种类名是"links",否则需要将链的种 类名改为"links"。 命令remove-link(s)-with/from/to已不存在了,相反应将所请求的链die 。 例如: ask turtle 0 [ __remove-links-with link-neighbors ] 变为 ask turtle 0 [ ask my-links [ die ] ] 几个布局命令的输入略有不同,前两项一般是海龟主体集合和需要进行布局的链主体集 合。细节见词典layout-spring, __layout-magspring layout-radial layout-tutte 。 130 NetLogo 4.0.2 用户手册 你需要重新安排海龟变量的声明,因为以前链是海龟。任何用于链的变量应转移到 links-own块。 由于链不是海龟,它们不再具有海龟的内置变量(尽管某些链变量的名字与海龟变量一 样,如color 和 label 。如果以前使用链海龟的位置,现在需要计算链的中点,在非回绕 的世界里这很简单) to-report link-xcor report mean [xcor] of both-ends end to-report link-ycor report mean [ycor] of both-ends end 在回绕世界稍微麻烦一点,但也简单 to-report link-xcor let other-guy end2 let x 0 ask end1 [ hatch 1 [ face other-guy fd [distance other-guy] of myself / 2 set x xcor die ] ] report x end 计算ycor与此相似。 如果你使用了链海龟的大小和方向,则现在使用link-length和link-heading报告器。 新 "of" 语法 我们用单一的of 结构 (没有连字符)代替了三个不同的语言结构:-of (有连字符), value-from, values-from 。 旧 新 color-of turtle 0 [color] of turtle 0 value-from turtle 0 [size * size] [size * size] of turtle 0 mean values-from turtles [size] mean [size] of turtles 对单个主体使用 of,返回单一值。对主体集合使用 of,返回值的列表(随机顺序,因为主 131 NetLogo 4.0.2 用户手册 体集合总是随机顺序)。 注意当在新版本中打开旧模型时,-of, value-from, values-from自动转换为"of"。但 某些嵌套使用这些结构的代码太复杂,不能自动转换,需要手工转换。 串行ask 现在的ask 命令是串行的而不是并行的。换句话说,每次一个主体运行。直到一个主体 运行完所请求的命令块之后,下一个主体才开始运行。 注意老的ask 也不是真正并行的,我们使用了轮转机制让主体交错执行,来模拟并行执 行,该机制见NetLogo常见问题及解答。 我们做出这一改变的原因是,有些用户因为模拟并行而写出不符合原意的代码,而没有 从 并 行 中 得到 好 处 。 如果 模 型 出 现未 期 望 的 行为 , 一 般 可以 通 过 在 正确 的 地 方 添加 without-interruption来解决,但用户很难了解是否以及在哪需要这个命令。 在NetLogo 4.0,without-interruption不再是必须的,除非模型使用ask-concurrent (或者,海龟或瓦片永久性按钮包含依赖于模拟并行的代码)。多数模型中的 without-interruption可以移除。 以前"ask"使用的模拟并行仍然可以通过以下三种方式使用: z 使用 ask-concurrent原语而不是 ask,得到旧的模拟并行方式 z 在命令中心直接向海龟、瓦片或链发出的命令隐含是ask-concurrent z 海龟、瓦片或链永久性按钮隐含是ask-concurrent 注意不管在哪,ask总是串行的。 模型库使用并行的模型很少,然而 Termites 是一个优秀的使用并行的例子,它使用海 龟永久性按钮。 滴答计数器(Tick counter) NetLogo 现在有一个内置的滴答计数器,用来表示仿真时间的流逝。 使用tick命令推进该计数器,如果需要读取它的值,则有报告器ticks 。clear-all 重 设计数器,reset-ticks 也是如此。 多数模型中滴答计数器是整数值,但如果要使用更小的时间增量,可以用tick-advance 命令推进任何正的量,可以有分数部分。模型库中使用tick-advance的是Vector Fields 和 GasLab 模型。 滴答计算器的值显示在界面页顶部的工具条上。(可以使用工具条的 Settings...按钮 隐藏滴答计数器,或将"ticks"改为任何其他单词) 视图更新模式 过去NetLogo总是试图每秒更新视图 20 次,现在称之为"连续"视图更新。它最大的问题 132 NetLogo 4.0.2 用户手册 是通常希望每个滴答视图进行更新,而不是在滴答之间更新,因此在按钮上有一个勾选框, (默认)在每个按钮循环强制进行显示更新。这确保了更新发生在滴答处,但没有去除中间 更新。必须使用no-display和 display 关掉更新。 我们仍然支持连续更新,它是启动NetLogo后的默认模式。但模型库中多数模型现在使 用基于滴答的更新。基于滴答的更新模式下,视图仅在滴答计数器推进时更新。(display可 用于强制附加更新,见下面) 我们认为基于滴答的更新的优点如下: 1. 不同计算机或不同的运行都有一致的、可预测的视图更新行为 2. 中间的更新会让用户糊涂,因为让他们看到了不应看到的事情,可能误导用户 3. 提高速度。更新视图占用时间,如果每个滴答一次更新就够的话,强制他们每个滴 答只更新一次,模型运行的更快 4. 不需像 NetLogo 3.1 那样,对每个按钮都有"force view update" 勾选框,我们只需一 个用于整个模型的选择项 5. 使用速度滑动条让模型减速只需在滴答之间插入暂停。因此在基于滴答的更新模式 下,setup 按钮不再受速度滑动条的影响,这是旧的滑动条恼人之处。(使用连续更 新的模型仍然有此困扰) 如上所述,模型库中的多数模型现在使用基于滴答的更新。 即使正常时设为基于滴答更新的模型,调试时临时设为连续更新也有用。因为能看到在 滴答中发生的事情,而不是仅看到一个滴答的结果,这样能帮助解决问题。 如果将模型转换到基于滴答的更新,你还要在代码中增加tick 命令,否则视图不更新。 (注意当按钮弹起或在命令中心输入的命令完成时,视图仍会更新,因此视图不会永远不变) 模型如何使用滴答和基于滴答的更新 下面是在 NetLogo 4.0 将模型转换为使用滴答和基于滴答更新的步骤: 1. 在界面页的工具条右部的"update view:",将设置从"continuously" 改成"on ticks" 2. 在go例程结束部分或接近结束的部分增加tick命令。模型库中的模型将tick放在主 体移动之后,绘图命令之前。这是因为绘图命令可能会包含像plotxy ticks ...这 样的东西,我们希望使用滴答计数器的新值。多数模型在绘图命令中不涉及滴答计 数器,但不管怎样,为了一致和避免错误,我们建议总是将tick放在绘图命令之前。 有些模型还要做些改变: 1. 如果模型已经有了全局变量"ticks" 或 "clock" 或"time",去掉它们。相反使用tick 命令和 ticks 报告器。(如果模型使用小数增量,使用tick-advance而不是tick)。 如果为这些变量设置了监视器,去掉它,因为工具条上已经有滴答计数器了。 2. clear-all将滴答计数器重设为 0。如果在setup例程中没有使用clear-all,你需要 增加reset-ticks将滴答计数器设为 0 3. 如果在go中间使用no-display 和 display防止视图更新,去掉它们。 133 NetLogo 4.0.2 用户手册 4. 如果模型在时钟不推进时更新视图(例如Party, Dice Stalagmite, 使用动画布局的网 络模型, 使用鼠标交互按钮的模型),使用display命令强迫附加更新,因此用户可 以看到进行的事情。 速度滑动条 以前的 NetLogo 版本有一个速度滑动条,可以让模型运行的慢一些,这样能看到模型的 运行过程。 在 NetLogo4.0,滑动条也可用来加快模型运行,它通过让视图更新的更少实现这一点。 更新视图要花时间,因此更新的更少,模型运行的更快。 滑块默认的位置在中间,当在中间时,滑动条是“正常速度”。 当滑块从中心移开时,模型逐渐加快或变慢。 在很高的速度时,视图更新变得很少,可能几秒才更新一次。因为更新太少,看起来就 像模型运行的很慢。但看着滴答计数器或绘图等,会看到模型实际运行很快。如果更新太少 令人不安,那就不要将滑块拖得太远。 如果使用基于滴答的更新,减慢模型不会引起额外的更新,相反,NetLogo 只是简单的 在滴答之间加入暂停。 当使用连续更新时,减慢模型意味着视图更新间隔更接近。如果将滑块拖过左边一半的 位置,模型运行太慢能看到一个海龟移动一步!这是 NetLogo4.0 新有的,在以前版本里不 管模型运行多慢,也不会看到一次一步,而是在一个 ask 中的所有主体同时移动。 数值 NetLogo 内部不再区分整数和浮点数。例如: 旧: observer> 3 observer> 3.0 observer> 3 observer> 3.0 observer> true print 3 print 3.0 print 1 + 2 print 1.5 + 1.5 print 3 = 3.0 (最后一行显示尽管区分整数 3 和浮点数 3.0,但这两个数仍然认为相等) 新: observer> print 3 3 observer> print 3.0 134 NetLogo 4.0.2 用户手册 3 observer> print 1 + 2 3 observer> print 1.5 + 1.5 3 observer> print 3 = 3.0 true 我们希望只有极少的模型受到这一变动的负面影响。 这一变动的好处是 NetLogo 支持的整数范围更大。旧的范围是-2,147,483,648 到 2,147,483,647 (大约 +/- 2 billion),新的范围是+/-9,007,199,254,740,992 (大约+/- 9 quadrillion)。 创建主体集合 NetLogo 3.1 (和一些早期版本)包括原语turtles-from 和 patches-from,偶尔用来创 建主体集合。在NetLogo 4.0,这些原语被新原语turtle-set 和 patch-set替换,它们更灵 活、强大。(link-set 也存在)。在NetLogo词典中查阅这些条目。使用老的turtles-from 和 patches-from的模型需要手工替换为新原语。 RGB 颜色 在NetLogo 3.1, RGB和HSB颜色可以使用rgb 和 hsb近似为NetLogo颜色。这些改名为 approximate-rgb 和 approximate-hsb,现在的输入参数范围是 0-255, 不是 0-1。 现在 NetLogo 提供完整的 RGB 色系,因此这些原语不是必须的。可以使用三个元素的列 表设置任何颜色变量,获得精确的颜色,列表项范围 0-255,。细节见编程指南的颜色部分。 捆绑(Tie) 旧版本中__tie是实验性的。在NetLogo 4.0 中,链有一个tie-mode变量,可设为"none", "free", 或 "fixed"。在4.0 tie 现在是链独有的原语,意味着要将turtle 1 捆绑到turtle 0 需要写: ask turtle 0 [ create-link-to turtle 1 [ tie ] ] 细节见编程指南的捆绑(Tie)部分。 HubNet 客户 HubNet 活动的客户界面不再存储在单独的模型文件中。要从老的模型导入客户端,选择 File -> Import -> Import HubNet Client,当请求时从界面页导入。不再需要外部的客户 135 NetLogo 4.0.2 用户手册 模型,以及当设置客户界面时不再需要像这样指向它: hubnet-set-client-interface "COMPUTER" [ "my-client.nlogo" ] 变为: hubnet-set-client-interface "COMPUTER" [] 列表性能 列表的内部实现变化了,列表的一些性能特征改变了,当前实现的细节见编程指南。注 意fput比lput快得多,简单的改为fput就能提高性能。如果性能仍然是个问题,考虑使用数 组和表扩展。 从 NetLogo 3.0 迁移 主体集合 如果模型行为怪异或不正确,也许是因为从NetLogo 3.1 开始,主体集合是随机顺序。 以前版本中主体集合总是固定顺序。如果代码依赖固定顺序,则不会正常运行。如何修改模 型能以随机主体集合工作,取决于模型细节。有时使用sort 或 sort-by 将主体集合(随机 顺序)转换为主体列表(固定顺序),会有所帮助。见编程指南列表部分的"主体列表"。 回绕 如果看到海龟片段在视图边界回绕,是因为 NetLogo 3.0 允许在视图关闭这样的回绕, 而不影响模型的行为。从 NetLogo 3.1 起,如果不想让视图回绕,则必须使用新的拓扑功能 让世界不回绕。然而这一改变可能还要对模型做出其他改变。在编程指南的拓扑部分有详细 讨论,告诉你怎样转换模型利用这一新功能的优势。 随机化海龟坐标 在 NetLogo 3.0 或 以 前 版 本 , 许 多 模 型 使 用 setxy random world-width random world-height随机散布海龟,使用random 或 random-float。只有世界回绕,它才能工作。 (为什么?因为当打开回绕时,可以设置海龟坐标超过世界边界,NetLogo 将对海龟进 行回绕。但在不回绕的世界,设置 x 或 y 坐标超过世界边界会引起运行错误。在 NetLogo3.1 增加了回绕设置。更多信息见编程指南的拓扑部分) 要修改模型使它不管拓扑设置如何都能工作,使用下面的两个命令之一: setxy random-xcor random-ycor 136 NetLogo 4.0.2 用户手册 setxy random-pxcor random-pycor 这两个命令略有不同。第一个将海龟放置在世界的一个随机点,第二个将海龟放置到一 个随机瓦片的中心。一种更简洁的将海龟放置到随机瓦片中心的方式是: move-to one-of patches 137 NetLogo 4.0.2 用户手册 NetLogo 词典(NetLogo Dictionary) 字母顺序: A B C D E F G H I J L M N O P R S T U V W X Y ? 分类: Turtle - Patch - Agentset - Color - Control/Logic - World - Perspective Input/Output - Files - List - String - Math - Plotting - Links - Movie - System - HubNet 特殊: Variables - Keywords - Constants 分类(Categories) 下面是近似分组。记住海龟相关的原语也可能被瓦片或观察者使用,反之亦然。要知 道哪类主体(海龟、瓦片、链,观察者)实际使用哪个原语,请查找词典中的相应词条。 海龟相关(Turtle-related) back (bk) -at -here -on can-move? clear-turtles (ct) create- create-ordered- create-ordered-turtles (cro) create-turtles (crt) die distance distancexy downhill downhill4 dx dy face facexy forward (fd) hatch hatch- hide-turtle (ht) home inspect is- ? is-turtle? jump left (lt) move-to myself nobody no-turtles of other patch-ahead patch-at patch-at-heading-and-distance patch-here patch-left-and-ahead patch-right-and-ahead pen-down (pd) pen-erase (pe) pen-up (pu) random-xcor random-ycor right (rt) self set-default-shape __set-line-thickness setxy shapes show-turtle (st) sprout sprout- stamp stamp-erase subject subtract-headings tie towards towardsxy turtle turtle-set turtles turtles-at turtles-here turtles-on turtles-own untie uphill uphill4 瓦片相关(Patch-related) clear-patches (cp) diffuse diffuse4 distance distancexy import-pcolors import-pcolors-rgb inspect is-patch? myself neighbors neighbors4 nobody no-patches of other patch patch-at patch-ahead patch-at-heading-and-distance patch-here patch-left-and-ahead patch-right-and-ahead patch-set patches patches-own random-pxcor random-pycor self sprout sprout- subject 138 NetLogo 4.0.2 用户手册 主体集合(Agentset) all? any? ask ask-concurrent at-points -at -here -on count in-cone in-radius is-agent? is-agentset? is-patch-set? is-turtle-set? link-heading link-length link-set link-shapes max-n-of max-one-of min-n-of min-one-of n-of neighbors neighbors4 no-patches no-turtles of one-of other patch-set patches sort sort-by turtle-set turtles with with-max with-min turtles-at turtles-here turtles-on 颜色(Color) approximate-hsb approximate-rgb base-colors color extract-hsb extract-rgb hsb import-pcolors import-pcolors-rgb pcolor rgb scale-color shade-of? wrap-color 控制流和逻辑(Control flow and logic) and ask ask-concurrent carefully end error-message foreach if ifelse ifelse-value let loop map not or repeat report run runresult ; (semicolon) set stop startup to to-report wait while with-local-randomness without-interruption xor 世界(World) clear-all (ca) clear-drawing (cd) clear-patches (cp) clear-turtles (ct) display import-drawing import-pcolors import-pcolors-rgb no-display max-pxcor max-pycor min-pxcor min-pycor reset-ticks tick tick-advance ticks world-width world-height 视角(Perspective) follow follow-me reset-perspective (rp) ride ride-me subject watch watch-me HubNet hubnet-broadcast hubnet-broadcast-view hubnet-enter-message? hubnet-exit-message? hubnet-fetch-message hubnet-message hubnet-message-source hubnet-message-tag hubnet-message-waiting? hubnet-reset hubnet-send hubnet-send-view hubnet-set-client-interface 139 NetLogo 4.0.2 用户手册 输入/输出(Input/output) beep clear-output date-and-time export-view export-interface export-output export-plot export-all-plots export-world import-drawing import-pcolors import-pcolors-rgb import-world mouse-down? mouse-inside? mouse-patch mouse-xcor mouse-ycor output-print output-show output-type output-write print read-from-string reset-timer set-current-directory show timer type user-directory user-file user-new-file user-input user-message user-one-of user-yes-or-no? write 文件(File) file-at-end? file-close file-close-all file-delete file-exists? file-flush file-open file-print file-read file-read-characters file-read-line file-show file-type file-write user-directory user-file user-new-file 列表(List) but-first but-last empty? filter first foreach fput histogram is-list? item last length list lput map member? modes n-of n-values of position one-of reduce remove remove-duplicates remove-item replace-item reverse sentence shuffle sort sort-by sublist 字符串(String) Operators (<, >, =, !=, <=, >=) but-first but-last empty? first is-string? item last length member? position remove remove-item read-from-string replace-item reverse substring word 数学(Mathematical) Arithmetic Operators (+, *, -, /, ^, <, >, =, !=, <=, >=) abs acos asin atan ceiling cos e exp floor int ln log max mean median min mod modes new-seed pi precision random random-exponential random-float random-gamma random-normal random-poisson random-seed remainder round sin sqrt standard-deviation subtract-headings sum tan variance 140 NetLogo 4.0.2 用户手册 绘图(Plotting) autoplot? auto-plot-off auto-plot-on clear-all-plots clear-plot create-temporary-plot-pen export-plot export-all-plots histogram plot plot-name plot-pen-exists? plot-pen-down plot-pen-reset plot-pen-up plot-x-max plot-x-min plot-y-max plot-y-min plotxy set-current-plot set-current-plot-pen set-histogram-num-bars set-plot-pen-color set-plot-pen-interval set-plot-pen-mode set-plot-x-range set-plot-y-range 链(Links) both-ends clear-links create- -from create- -from create- -to create- -to create- -with create- -with create-link-from create-links-from create-link-to create-links-to create-link-with create-links-with in- -neighbor? in- -neighbors in- -from in-link-neighbor? in-link-neighbors in-link-from is-directed-link? is-link? is-undirected-link? layout-circle __layout-magspring layout-radial layout-spring layout-tutte -neighbor? -neighbors -with link-heading link-length link-neighbor? link links links-own -own link-neighbors link-with my- my-in- my-in-links my-links my-out- my-out-links no-links other-end out- -neighbor? out- -neighbors out- -to out-link-neighbor? out-link-neighbors out-link-to show-link tie untie 电影(Movie) movie-cancel movie-close movie-grab-view movie-grab-interface movie-set-frame-rate movie-start movie-status 系统(System) netlogo-applet? netlogo-version 内建变量(Built-In Variables) 海龟(Turtles) breed color heading hidden? label label-color pen-mode pen-size shape size who xcor ycor 141 NetLogo 4.0.2 用户手册 瓦片(Patches) pcolor plabel plabel-color pxcor pycor 链(Links) breed color end1 end2 hidden? label label-color shape thickness tie-mode 其他(Other) ? 关键词(Keywords) breed directed-link-breed end extensions globals __includes patches-own to to-report turtles-own undirected-link-breed 常量(Constants) 数学常量(Mathematical Constants) e = 2.718281828459045 pi = 3.141592653589793 布尔常量(Boolean Constants) false true 颜色常量(Color Constants) black = 0 gray = 5 white = 9.9 red = 15 orange = 25 brown = 35 yellow = 45 142 NetLogo 4.0.2 用户手册 green = 55 lime = 65 turquoise = 75 cyan = 85 sky = 95 blue = 105 violet = 115 magenta = 125 pink = 135 细节参见编程指南的颜色部分( Colors) 。 A abs abs number 返回 number 的绝对值。 show abs -7 => 7 show abs 5 => 5 acos acos number 返回给定数的反余弦值。输入数值必须在-1 到 1 之间。结果是度数,范围在 0 到 180 之间。 all? all? agentset [reporter] 如果主体集合(agentset)中的所有主体对给定的报告器(reporter)都返回 true,则返 回 true。否则返回 false。 给定的报告器必须对每个主体都返回布尔值(true 或 false),否则发生错误。 if all? turtles [color = red] 143 NetLogo 4.0.2 用户手册 [ show "every turtle is red!" ] 另外见 any?. and condition1 and condition2 如果 condition1 与 condition2 为 true,则返回 true。 注意如果 condition1 为 false,则不再检查 condition2(因为对结果没影响) if (pxcor > 0) and (pycor > 0) [ set pcolor blue ] ;; the upper-right quadrant of ;; patches turn blue any? any? agentset 如果给定主体集合非空,返回 true,否则返回 false。 等价于"count agentset > 0",但效率更高(也更易读)。 if any? turtles with [color = red] [ show "at least one turtle is red!" ] 注意 nobody 不是一个主体集合。只能在希望得到单个主体而不是整个主体集合的地方得到 nobody。(You only get nobody back in situations where you were expecting a single agent, not a whole agentset)。如果将 nobody 做为 any?的输入,会导致错误。 另见 all, nobody. approximate-hsb approximate-hsb hue saturation brightness 返回 0-140(不包括 140)之间的一个数,表示 NetLogo 颜色空间中 HSB 色谱的某个颜色 三个输入值必须在 0-255 范围内。 144 NetLogo 4.0.2 用户手册 返回的颜色可能只是一个近似,因为 NetLogo 颜色空间没有包括所有可能颜色。(只包括 某些离散的色调(hue),对每个色调,饱和度或亮度可以变化,但二者不能同时变化 — 至 少二者之一总是 255) show approximate-hsb 0 0 0 => 0 ;; (black) show approximate-hsb 127.5 255 255 => 85.2 ;; (cyan) 另见 extract-hsb, approximate-rgb, extract-rgb. approximate-rgb approximate-rgb red green blue 返回 0-140(不包括 140)之间的一个数,表示 NetLogo 的 RGB 颜色空间中的某个颜色 三个输入值必须在 0-255 范围内。 返回的颜色可能只是一个近似,因为NetLogo 颜色空间没有包括所有可能颜色。(参见 approximate-hsb的说明,很难用RGB术语表达) show approximate-rgb 0 0 0 => 0 ;; black show approximate-rgb 0 255 255 => 85.2 ;; cyan 另见 extract-rgb, approximate-hsb, and extract-hsb. 算子,Arithmetic Operators (+, *, -, /, ^, <, >, =, !=, <=, >=) 这些运算符都是中缀运算符(infix operators),都有两个输入参数。(把它置于两个输 入参数之间,就像标准数学那样)。NetLogo 实现正确的中缀运算顺序。 运算符含义: + 加, * 乘, - 减, / 除, ^ 幂, < 小于, > 大于, = 等于, != 不等于, <= 小于等于, >= 大于等于。 注意减法运算符一般采用两个输入,但是如果用括号括起来可以只有一个输入。例如对 x 取负,写为(- x),要有括号。 可以对字符串运用比较操作。 145 NetLogo 4.0.2 用户手册 比较操作可以用于主体。对海龟比较 who number,对瓦片从上到下、从左到右比较,因此 瓦片 0 10 小于 0 9,瓦片 9 0 小于 10 0。链通过端点排序,如果是捆绑的话,则通过种类 比较。因此,link 0 9 在 link 1 10 之前,因为 end1 较小,link 0 8 小于 link 0 9。如 果链有多个种类,则具有相同端点的无种类链在有种类链之前,而有种类的链根据在例程页 中声明顺序进行排序。 可以对主体集合测试相等或不等。如果两个主体集合是同一类型(海龟或瓦片)且包含相同 的主体,则相等。 如果不太确定 NetLogo 怎样解释你的代码,应加上括号。 show 5 * 6 + 6 / 3 => 32 show 5 * (6 + 6) / 3 => 20 asin asin number 返回给定数值的反正弦值。输入参数必须在-1 到 1 之间。结果是度数,在-90 到 90 范围。 ask ask agentset [commands] ask agent [commands] 指定的主体(agent)或主体集合(agentset)执行给定的命令。 ask turtles [ fd 1 ] ;; all turtles move forward one step ask patches [ set pcolor red ] ;; all patches turn red ask turtle 4 [ rt 90 ] ;; only the turtle with id 4 turns right 注意:只有观察者可以请求所有海龟或所有瓦片。这可以防止你因不小心而让所有海龟请求 所有海龟,或所有瓦片请求所有瓦片,当你不太清楚哪个主体运行你的代码时,容易犯这个 错误。 注意:仅有那些在 ask 开始时刻的主体集合中的主体运行这些命令。 146 NetLogo 4.0.2 用户手册 ask-concurrent ask-concurrent agentset [commands] 给定主体集合中的主体以轮换(turn-taking)机制运行给定命令,模拟并发执行。参见编 程指南的Ask-Concurrent部分。 注意:仅有那些在 ask 开始时刻的主体集合中的主体运行这些命令。 另见 without-interruption. at-points agentset at-points [[x1 y1] [x2 y2] ...] 返回给定主体集合的一个子集,该子集只包括那些离调用主体给定距离处的瓦片上的主体。 距离以列表形式给出,列表的每个元素有两项,即 x 和 y 偏移。 如果调用主体是观察者,则距离是指到原点的距离,换句话说,就是瓦片的绝对坐标。 如果调用主体是海龟,距离是指到该海龟的精确距离,而不是到该海龟所在瓦片中心的距离 ask turtles at-points [[2 4] [1 2] [10 15]] [ fd 1 ] ;; only the turtles on the patches at the ;; distances (2,4), (1,2) and (10,15), ;; relative to the caller, move atan atan x y 返回 x 除以 y 的反正切值,是度数值(0-360)。 当 y 为 0 时,如果 x 为正,返回 90;如果 x 为负,返回 270;如果 x 为 0,出错。 注意这个版本的 atan 设计用来与 NetLogo 世界的几何一致。在 NetLogo 世界,0 方向是上, 90 是右,顺时针旋转。(在一般几何里,0 是右,90 是上,逆时针旋转,atan 需要一致的 实现) show atan 1 -1 => 135 show atan -1 1 147 NetLogo 4.0.2 用户手册 => 315 autoplot? autoplot? 如果当前绘图的 auto-plotting 打开,则返回 true,否则返回 false. auto-plot-off auto-plot-on auto-plot-off auto-plot-on 这对命令控制当前绘图的自动绘图(auto-plotting)功能。当画笔超出当前边界时,自动 绘图功能自动更新 x 和 y 轴。当要显示所有绘制点而不管图形范围时,会用到命令。 B back bk back number 海龟后退 number 步。(如果 number 为负,则海龟前进) 海龟使用这个原语每个时间步最大移动 1 个单位。因此bk 0.5和 bk 1 都使用一个时间步, 但bk 3 用三个时间步。 如果因为当前拓扑的原因不能后退 number 步,则海龟尽可能移动整数步,停下。 另见 forward, jump, can-move?. base-colors base-colors 返回由 14 个 NetLogo 基本色调构成的列表。 148 NetLogo 4.0.2 用户手册 print base-colors => [5 15 25 35 45 55 65 75 85 95 105 115 125 135] ask turtles [ set color one-of base-colors ] ;; each turtle turns a random base color ask turtles [ set color one-of remove gray base-colors ] ;; each turtle turns a random base color except for gray beep beep 发出蜂鸣声。注意蜂鸣声很迅速,几个非常靠近的蜂鸣命令听起来就像一条声音。 例如: beep ;; emits one beep repeat 3 [ beep ] ;; emits 3 beeps at once, ;; so you only hear one sound repeat 3 [ beep wait 0.1 ] ;; produces 3 beeps in succession, ;; separated by 1/10th of a second both-ends both-ends 返回由该链的两个端点组成的主体集合。 crt 2 ask turtle 0 [ create-link-with turtle 1 ] ask link 0 1 [ ask both-ends [ set color red ] ;; turtles 0 and 1 both turn red ] breed breed 149 NetLogo 4.0.2 用户手册 这是一个内建的海龟和链变量。它保存着所有与该海龟(链)同一种类的海龟(链)构成的 主体集合。(对于没有特定种类的海龟或链,这个变量就是所有海龟的主体集合turtles 或 所有链的主体集合links)。可以设置这个变量改变海龟或链的种类。 另见 breed, directed-link-breed, undirected-link-breed 例子: breed [cats cat] breed [dogs dog] ;; turtle code: if breed = cats [ show "meow!" ] set breed dogs show "woof!" directed-link-breed [ roads road ] ;; link code if breed = roads [ set color gray ] breed breed [ ] 这个关键词只能在例程页的首部使用,就像 globals,turtles-own 和 patches-own 一样。 它定义一个种类。第一个输入参数定义该种类主体集合的名字,第二个参数定义该种类单个 主体的名字。 给定种类的任何海龟: • • 都是由种类名命名的主体集合的一部分 拥有主体集合定义的种类内建变量 主体集合最常与 ask 一起,给特定种类的海龟发出命令。 breed [mice mouse] breed [frogs frog] to setup clear-all create-mice 50 ask mice [ set color white ] create-frogs 50 ask frogs [ set color green ] show [breed] of one-of mice ;; prints mice show [breed] of one-of frogs ;; prints frogs 150 NetLogo 4.0.2 用户手册 end show mouse 1 ;; prints (mouse 1) show frog 51 ;; prints (frog 51) show turtle 51 ;; prints (frog 51) 另见 globals, patches-own, turtles-own, -own, create- , -at, -here. but-first bf but-last bl but-first list but-first string but-last list but-last string 与列表一起使用时,but-first 返回 list 中除第一项外的所有项。but-last 返回 list 中除 最后一项外的所有项。 与字符串一起使用时,but-first 和 but-last 返回忽略了原始字符串第一个或最后一个字 符的字符串。 ;; mylist is [2 4 6 5 8 12] set mylist but-first mylist ;; mylist is now [4 6 5 8 12] set mylist but-last mylist ;; mylist is now [4 6 5 8] show but-first "string" ;; prints "tring" show but-last "string" ;; prints "strin" 151 NetLogo 4.0.2 用户手册 C can-move? can-move? distance 如果调用主体能够沿所面向的方向前进 distance 而不与拓扑冲突,则返回 true,否则返回 false。 它等价于: patch-ahead distance != nobody carefully carefully [ commands1 ] [ commands2 ] 运行 commands1,如果出错,NetLogo 不停下来报警,而是抑制错误运行 commands2。 在commands2 可以使用error-message报告器,找出在commands1 中被抑制的错误信息。见 error-message。 注意:两组命令都不受中断的运行(与使用 without-interruption 一样)。 carefully [ show 1 / 1 ] [ print error-message ] => 1 carefully [ show 1 / 0 ] [ print error-message ] => division by zero ceiling ceiling number 返回大于等于 number 的最小整数。 show ceiling 4.5 => 5 show ceiling -4.5 => -4 152 NetLogo 4.0.2 用户手册 clear-all ca clear-all 将所有全局变量清 0,调用 reset-ticks, clear-turtles, clear-patches, clear-drawing, clear-all-plots, and clear-output clear-all-plots clear-all-plots 清除模型中所有绘图(plot)。更多信息参见clear-plot。 clear-drawing cd clear-drawing 清除海龟画出的所有线和图案。 clear-links clear-links 删除所有链。 另见 die. clear-output clear-output 如果模型有输出区域,则清除所有文本。否则什么都不做。 153 NetLogo 4.0.2 用户手册 clear-patches cp clear-patches 将所有瓦片变量重设为默认初始值,包括将颜色设为黑。 clear-plot clear-plot 对当前绘图,重设所有画笔,删除所有临时画笔,将绘图设为默认值(x,y 的范围等),将 所有永久画笔设为默认值。绘图和永久画笔的默认值在绘图编辑对话框里设置。如果删除所 有临时画笔后没有画笔了,也就是说没有永久性画笔,则使用下面的设置自动生成一个默认 画笔: • • • • • Pen: down Color: black Mode: 0 (line mode) Name: "default" Interval: 1 另见clear-all-plots. clear-turtles ct clear-turtles 删除所有海龟. 也重设 who number,因此下一个创建的海龟号为 0。 另见 die. 154 NetLogo 4.0.2 用户手册 color color 这是一个内建海龟或链变量,保存海龟或链的颜色,设置该变量则海龟或链改变颜色。颜色 可用NetLogo颜色(一个数字),或RGB颜色(有 3 个数的列表)。细节见编程指南的颜色部 分(Colors section)。 另见 pcolor. cos cos number 返回给定角的余弦值。角的单位是度。 show cos 180 => -1 count count agentset 返回给定主体集合的主体数量。 show count turtles ;; prints the total number of turtles show count patches with [pcolor = red] ;; prints the total number of red patches create-ordered-turtles cro create-ordered- create-ordered-turtles number create-ordered-turtles number [ commands ] create-ordered number 155 NetLogo 4.0.2 用户手册 create-ordered number [ commands ] 创建 number 个新海龟。新海龟位于(0, 0)处,用 14 个主要颜色分别设定颜色,方向在 0-360 均匀设置。 如果采用 create-ordered- 形式,则创建属于该种类的新海龟。 如果提供了 commands,新海龟立即运行这些命令。使用这些命令可以给新海龟不同的颜色、 方向或任何其他东西。 (新海龟一次全部创建,然后以随机顺序每次选择一个海龟运行命令) cro 100 [ fd 10 ] ;; makes an evenly spaced circle 注意:当命令运行时,其他主体不能运行任何代码(就像使用了without-interrupt命令)。 这就确保了如果正在使用ask-concurrent,则新海龟在完全初始化之前不能与任何其他海龟 交互。 create- -to create- -to create- -from create- -from create- -with create- -with create-link-to create-links-to create-link-from create-links-from create-link-with create-links-with create- -to turtle create- -to turtle [ commands ] create- -from turtle 156 NetLogo 4.0.2 用户手册 create- -from turtle [ commands ] create- -with turtle create- -with turtle [ commands ] create- -to turtleset create- -to turtleset [ commands ] create- -from turtleset create- -from turtleset [ commands ] create- -with turtleset create- -with turtleset [ commands ] create-link-to turtle create-link-to turtle [ commands ] create-link-from turtle create-link-from turtle [ commands ] create-link-with turtle create-link-with turtle [ commands ] create-links-to turtleset create-links-to turtleset [ commands ] create-links-from turtleset create-links-from turtleset [ commands ] create-links-with turtleset create-links-with turtleset [ commands ] 用来在海龟之间创建有种类或无种类的链。 create-link-with 在调用者和 agent 之间创建一个无向链。 create-link-to 创建一个从调用者到 agent 的一个有向链。 create-link-from 创建一个从 agent 到调用者的一个有向链。. 当使用复数形式的种类名时,需要给一个主体集合,在调用者和主体集合中的所有主体之间 创建链。 可选的命令块是每个新构建的链要运行的命令。(所有链一次全部创建,然后以随机顺序每 次运行一个)。 节点不能自连。在两个节点之间不能有多条同种类的无向链,在两个节点之间也不能有多个 同向的同种类的有向链。 如果试图创建一条已存在的链(同种类),什么也不发生。如果试图创建一个海龟自连的链, 则出现运行错误。 to setup crt 5 157 NetLogo 4.0.2 用户手册 ;; turtle 1 creates links with all other turtles ;; the link between the turtle and itself is ignored ask turtle 0 [ create-links-with other turtles ] show count links ;; shows 4 ;; this does nothing since the link already exists ask turtle 0 [ create-link-with turtle 1 ] show count links ;; shows 4 since the previous link already existed ask turtle 2 [ create-link-with turtle 1 ] show count links ;; shows 5 end directed-link-breed [red-links red-link] undirected-link-breed [blue-links blue-link] to setup crt 5 ;; create links in both directions between turtle 0 ;; and all other turtles ask turtle 0 [ create-red-links-to turtles ] ask turtle 0 [ create-red-links-from turtles ] show count links ;; shows 8 ;; now create undirected links between turtle 0 and other turtles ask turtle 0 [ create-blue-links-with turtles ] show count links ;; shows 12 end create-turtles crt create- create-turtles number create-turtles number [ commands ] create- number create- number [ commands ] 创建 number 个新海龟。新海龟的方向是随机整数,颜色从 14 个主色中随机选取。 如果使用 create- 形式,新海龟就是给定种类的成员。 158 NetLogo 4.0.2 用户手册 如果提供了 commands,新海龟立即执行这些命令。使用这些命令可以给新海龟不同的颜色、 方向或任何其他东西。 (新海龟一次全部创建,然后以随机顺序每次选择一个海龟运行命令) crt 100 [ fd 10 ] ;; makes a randomly spaced circle breed [canaries canary] breed [snakes snake] to setup clear-all create-canaries 50 [ set color yellow ] create-snakes 50 [ set color green ] end 注意:当命令运行时,其他主体不能运行任何代码(就像使用了without-interrupt命令)。 这就确保了如果正在使用ask-concurrent,则新海龟在完全初始化之前不能与任何其他海龟 交互。 另见 hatch, sprout. create-temporary-plot-pen create-temporary-plot-pen string 使用给定名称为当前绘图创建一个临时画笔,该画笔设为当前画笔。 很少有模型使用这一原语,因为当调用 clear-plot 或 clear-all-plots 后,所有临时画笔 都消失。创建画笔的正常方式是在绘图的编辑对话框中创建永久画笔。 如果当前绘图中存在同名的临时画笔,则不再创建新画笔,将已存在的画笔设为当前画笔。 如果有一个同名的永久画笔,则出现运行错误。 新的临时画笔的初始设置如下: • • • • Pen: down Color: black Mode: 0 (line mode) Interval: 1 见: clear-plot, clear-all-plots 和 set-current-plot-pen 。 159 NetLogo 4.0.2 用户手册 D date-and-time date-and-time 返回包含当前日期和时间的字符串。格式如下,所有的域(field)都是固定长度的,因此 某个域总是出现在字符串的相同位置。时钟可能的精度是毫秒。(在不同的系统上得到的精 度可能会不同,这取决于底层的 Java 虚拟机) show date-and-time => "01:19:36.685 PM 19-Sep-2002" die die 海龟死亡。 if xcor > 20 [ die ] ;; all turtles with xcor greater than 20 die 另见: ct diffuse diffuse patch-variable number 告诉每个瓦片将瓦片变量 patch-variable 的(number * 100)% 均等的分配到它的 8 个相邻 瓦片上去。Number 在 0-1 之间。不管拓扑如何,整个世界的 patch-variable 之和守恒。(如 果一个瓦片的邻元少于 8 个,每个邻元仍然得到 1/8 的份额,剩余的该瓦片自己保留) 注意这是一个观察者命令,尽管你希望这是一个瓦片命令。(原因是该命令同时对所有瓦片 起作用—而瓦片命令只能作用到单个瓦片) diffuse chemical 0.5 ;; each patch diffuses 50% of its variable ;; chemical to its neighboring 8 patches. Thus, ;; each patch gets 1/8 of 50% of the chemical 160 NetLogo 4.0.2 用户手册 ;; from each neighboring patch.) diffuse4 diffuse4 patch-variable number 与 diffuse 类似,区别是对四个相邻瓦片进行扩散(北、南、东、西),而不包括对角邻元。 diffuse4 chemical 0.5 ;; each patch diffuses 50% of its variable ;; chemical to its neighboring 4 patches. Thus, ;; each patch gets 1/4 of 50% of the chemical ;; from each neighboring patch.) directed-link-breed directed-link-breed [ ] 与globals 和breeds关键词一样,这个关键词只能在例程页的首部使用,位于所有例程定义 之前。它定义一个有向链种类。某个种类的链必须都是有向的或都是无向的。第一个参数定 义该种类链的主体集合名,第二个参数定义单个成员名。创建有向链时使用 create-link(s)-to 和 create-link(s)-from,而不使用create-link(s)-with 。 任何一个属于指定链种类的链: • • • 是链种类名所定义的主体集合的一部分 有设定到该主体集合的内建变量breed 由关键词决定是有向还是无向 最常见的用法是主体集合和 ask 命令组合在一起,向只属于特定种类的链发出命令。 directed-link-breed [streets street] directed-link-breed [highways highway] to setup clear-all crt 2 ;; create a link from turtle 0 to turtle 1 ask turtle 0 [ create-street-to turtle 1 ] ;; create a link from turtle 1 to turtle 0 ask turtle 0 [ create-highway-from turtle 1 ] end 161 NetLogo 4.0.2 用户手册 ask turtle 0 [ show one-of in-links ] ;; prints (street 0 1) ask turtle 0 [ show one-of out-links ] ;; prints (highway 1 0) 另见 breed, undirected-link-breed display display 引起视图立刻更新。(例外:如果用户使用速度滑动条快进模型,更新可能被跳过) 另外,撤销 no-display 命令的效果,如果视图更新被 no-display 挂起,则恢复。 no-display ask turtles [ jump 10 set color blue set size 5 ] display ;; turtles move, change color, and grow, with none of ;; their intermediate states visible to the user, only ;; their final state 即使没有使用 no-display 命令,"display"也有用。因为正常情况下 NetLogo 会逃过一些视 图更新,由于总的更新变少,模型会运行的快一些。该命令强迫视图更新,因此世界发生的 一切都能被用户看到。 ask turtles [ set color red ] display ask turtles [ set color blue] ;; turtles turn red, then blue; use of "display" forces ;; red turtles to appear briefly 注意 display 和 no-display 与视图控制条上冻结视图的开关无关。 另见 no-display. distance distance agent 162 NetLogo 4.0.2 用户手册 返回本主体与给定的海龟或瓦片的距离。 离或到一个瓦片的距离是根据瓦片中心得到的。如果世界拓扑允许回绕,并且回绕距离更短, 则海龟和瓦片使用回绕距离(围绕世界边缘)。 ask turtles [ show max-one-of turtles [distance myself] ] ;; each turtle prints the turtle farthest from itself distancexy distancexy xcor ycor 返回从本主体到给定点(xcor, ycor)的距离。 离开瓦片的距离根据瓦片中心计算。如果世界拓扑允许回绕,并且回绕距离更短,则海龟和 瓦片使用回绕距离(围绕世界边缘)。 if (distancexy 0 0) > 10 [ set color green ] ;; all turtles more than 10 units from ;; the center of the world turn green. downhill downhill4 downhill patch-variable downhill4 patch-variable 海龟移动到 patch-variable 最小的那个相邻瓦片上。如果没有哪个相邻瓦片变量比当前瓦 片小,则保持不动。如果有几个瓦片有相同的最小值,则随机选择一个。非数值型值忽略。 Downhill 考虑 8 个相邻瓦片,而 downhill4 考虑四个相邻瓦片。 与下面的代码等价(假设变量是数值型): move-to patch-here ;; go to patch center let p min-one-of neighbors [patch-variable] ;; or neighbors4 if [patch-variable] of p < patch-variable [ face p move-to p 163 NetLogo 4.0.2 用户手册 ] 注意海龟总是停在瓦片中心,方向角是 45(downhill)或 90(downhill4)的倍数。 另见uphill, uphill4. dx dy dx dy 返回海龟沿当前方向前进一步时的 x 增量或 y 增量(海龟的 xcor 或 ycor 的改变量)。 注意:dx 就是海龟方向角的正弦值,dy 就是余弦值。 (这可能与你想的相反,原因在于 NetLogo 的 0 方向是北,90 是东,与一般几何中的角度定义相反) 注意:在NetLogo早期版本,这些命令很常用,现在新的patch-ahead原语更合适。 E empty? empty? list empty? string 如果给定的列表或字符串为空,返回 true,否则返回 false。 注意:空列表写成[],空字符串写成""。 end end 用来结束一个例程。见to 和to-report 。 164 NetLogo 4.0.2 用户手册 end1 end1 这是一个内置链变量。它指明链的第一个端点(海龟)。对有向链是指源端点,对无向链是 指具有小的 who number 的端点。你不能设置 end1。 crt 2 ask turtle 0 [ create-link-to turtle 1 ] ask links [ show end1 ] ;; shows turtle 0 end2 end2 这是一个内置链变量。它指明链的第二个端点(海龟)。对有向链是指目的端点,对无向链 是指具有大的 who number 的端点。你不能设置 end2。 crt 2 ask turtle 1 [ create-link-with turtle 0 ] ask links [ show end2 ] ;; shows turtle 1 error-message error-message 返回被 carefully 抑制的描述错误信息的字符串。 该报告器只能用在 carefully 命令的第二部分。 另见 carefully. every every number [ commands ] 165 NetLogo 4.0.2 用户手册 仅当在同一上下文中(in this context)距离上次运行给定命令超过 number 秒,才运行该 组命令。否则命令被跳过。 Every 本身不能使命令不断重复运行。如果你想要重复运行,则需要将它放到一个循环里, 或者放到永久性按钮里。Every 只限制命令运行的频率。 上面所谓的同一上下文(in this context)指相同的ask(或按钮按下或命令中心输入的命 令)。因此如果写成ask turtles [ every 0.5 [ ... ] ]就没什么意义,因为当ask完成时 海龟就丢弃对"every"的计时器。正确的用法如下: every 0.5 [ ask turtles [ fd 1 ] ] ;; twice a second the turtles will move forward 1 every 2 [ set index index + 1 ] ;; every 2 seconds index is incremented 另见 wait. exp exp number 返回 e 的 number 次幂值。 注意: 与 e ^ number 相同。 export-view export-interface export-output export-plot export-all-plots export-world export-view filename export-interface filename export-output filename export-plot plotname filename export-all-plots filename export-world filename 166 NetLogo 4.0.2 用户手册 export-view 将当前视图的当前内容输出到由 filename 命名的外部文件。文件存为 PNG (Portable Network Graphics)格式,因此推荐文件后缀为".png"。 export-interface 相似, 只是输出的是整个界面页。 export-output 将模型的输出区域内容输出到由 filename 命名的外部文件。(如果模型没 有独立的输出区域,则输出命令中心的输出区域) export-plot 将绘图 plotname 中所有画笔绘制的所有点的 x 和 y 值输出到由 filename 命名 的外部文件。如果画笔是条型(bar)模式(mode 0),并且点的 y 值大于 0,则输出条形的左上 角点,如果 y 值小于 0,则输出左下角点。 export-all-plots 将当前模型的所有绘图输出到由 filename 命名的外部文件。每个绘图的 格式与 export-plot 输出时相同。 export-world将所有变量的值,包括内建变量和用户定义的变量,所有观察者、海龟、瓦片 变量,画图(drawing),输出区域(如果有的话),绘图(plot)内容,随机数发生器的 状态,输出到由filename命名的外部文件。(可以被import-world 读回NetLogo)。 export-world不保存打开文件的状态。 export-plot, export-all-plots和 export-world 用无格式文本(plain-text)、逗号分隔 值"comma-separated values" (.csv)格式保存文件。许多常用的电子表格、数据库程序以 及文本编辑器都能读取CSV文件。 如果文件已存在,则覆盖。 如果输出文件不在模型目录,则需给定输出文件的全路径。(使用"/"作为文件夹分隔符)。 注意这些功能可以直接在 NetLogo 的 File 菜单中使用。 export-world "fire.csv" ;; exports the state of the model to the file fire.csv ;; located in the NetLogo folder export-plot "Temperature" "c:/My Documents/plot.csv" ;; exports the plot named ;; "Temperature" to the file plot.csv located in ;; the C:\My Documents folder export-all-plots "c:/My Documents/plots.csv" ;; exports all plots to the file plots.csv ;; located in the C:\My Documents folder extensions extensions [name ...] 167 NetLogo 4.0.2 用户手册 允许模型使用给定扩展库中的原语。详情见Extensions guide。 extract-hsb extract-hsb color 返回指定 NetLogo 颜色的 HSB 值列表,指定颜色在 0-140(不包括)之间。返回的列表有三项, 每项分别是色调、饱和度、亮度,范围在 0-255. show extract-hsb red => [2.198 206.372 215] show extract-hsb cyan => [127.5 145.714 196] 另见 approximate-hsb, approximate-rgb, extract-rgb. extract-rgb extract-rgb color 返回指定 NetLogo 颜色的 RGB 值列表,指定颜色在 0-140(不包括)之间。返回的列表有三项, 每项分别是红、绿、蓝,范围在 0-255. show extract-rgb red => [215 50 41] show extract-rgb cyan => [84 196 196] 另见 approximate-rgb, approximate-hsb, extract-hsb. F face face agent 设置调用者的方向为朝向 agent 如果世界拓扑允许回绕,并且回绕距离较短,face 将使用回绕路径。 168 NetLogo 4.0.2 用户手册 如果调用者和 agent 恰好位于相同点,则调用者的方向不变。 facexy facexy number number 设置调用者的方向为朝向点(x,y)。 如果世界拓扑允许回绕,并且回绕距离较短,facexy 将使用回绕路径。 如果调用者恰好位于点(x,y),则调用者的方向不变。 file-at-end? file-at-end? 如果已达到文件(已用file-open 打开)尾,返回true,否则返回false。 file-open "my-file.txt" print file-at-end? => false ;; Can still read in more characters print file-read-line => This is the last line in file print file-at-end => true ;; We reached the end of the file 另见 file-open, file-close-all. file-close file-close 关闭已用file-open 打开的文件。 注意该命令和 file-close-all 是重新指到已打开文件的起始位置和切换文件模式的仅有方 法。 如果没有文件打开,则没有任何作用。 另见 file-close-all, file-open. 169 NetLogo 4.0.2 用户手册 file-close-all file-close-all 关闭所有以前由file-open 打开的文件(如果有的话) 另见 file-close, file-open file-delete file-delete string 删除 string 指明的文件。 String必须是一个用户有写权限的已有文件。另外文件不能打开。在删除之前用file-close 关闭打开的文件。 注意string可以是文件名,也可是绝对路径。如果是文件名,表示在当前目录。可以使用 set-current-directory改变当前目录,默认是模型目录。 file-exists? file-exists? string 如果文件 string 存在则返回 true,否则返回 false。 注意string可以是文件名,也可是绝对路径。如果是文件名,表示在当前目录。可以使用 set-current-directory改变当前目录,默认是模型目录。 file-flush file-flush 强迫文件刷新到磁盘。当使用写操作或其他输出命令时,可能不会立即写到磁盘,这样是为 提高文件输出性能。关闭文件能确保所有输出写入到磁盘。 有时需要在不关闭文件的前提下确保数据写入磁盘。例如你使用文件与计算机上的其他程序 进行通信,想要其他程序立即看到输出。 170 NetLogo 4.0.2 用户手册 file-open file-open string 该命令将string解释为路径名并且打开文件。你可以使用 file-read,file-read-line 和 file-read-characters 读取文件,也可使用file-write, file-print, file-type, file-show 写入文件。 注意你可以打开文件进行读或写,但不能既读又写。接下来的文件输入输出命令决定了文件 的打开模式。要切换模式需要使用file-close关闭文件。 另外,如果打开文件进行读的话,文件必须已经存在。 当打开文件进行写操作,所有新数据会追加到原始文件尾。如果没有原始文件,则在原位新 建一个空文件(必须对该目录有写权限)。(如果不想追加,而是要替换现有内容,先使用 file-delete删除它,如果不确定它是否存在的话,最好使用carefully)。 注意string可以是文件名,也可是绝对路径。如果是文件名,表示在当前目录。可以使用 set-current-directory 改变当前目录,默认是模型目录。 file-open "my-file-in.txt" print file-read-line => First line in file ;; File is in reading mode file-open "C:\\NetLogo\\my-file-out.txt" ;; assuming Windows machine file-print "Hello World" ;; File is in writing mode 另见 file-close. file-print file-print value 将 value 打印到一个打开的文件中,后面跟一个回车。 在value前不打印调用主体,这一点与file-show不同。 注意这是与print 等价的文件i/o命令,在使用该命令前要先使用file-open 。 另见 file-show, file-type, and file-write. 171 NetLogo 4.0.2 用户手册 file-read file-read 这个报告器从打开的文件中读取一个常数,就像在命令中心输入它一样,执行它,返回结果。 结果可能是数值、列表、字符串、布尔值、或者特殊值 nobody 。 常数由空格分隔,file-read 调用时跳过前后空格。 注意字符串需要用引号,在使用file-write 时包括引号。 还要注意在使用该报告器之前要先使用file-open 命令,并且文件里还有数据。使用报告器 file-at-end? 测试是否达到文件尾。 file-open "my-file.data" print file-read + 5 ;; Next value is the number 1 => 6 print length file-read ;; Next value is the list [1 2 3 4] => 4 另见 file-open 和 file-write. file-read-characters file-read-characters number 将打开文件中的 number 个字符作为一个字符串返回。如果剩余的字符数量不足,则返回所 有剩下的字符。 注意它返回包括新行和空格在内的所有字符。 还要注意在使用该命令之前要先使用file-open 命令,并且文件里还有数据。使用报告器 file-at-end? 测试是否达到文件尾。 file-open "my-file.txt" print file-read-characters 5 ;; Current line in file is "Hello World" => Hello 另见 file-open. 172 NetLogo 4.0.2 用户手册 file-read-line file-read-line 读取文件中的下一行,作为字符串返回。通过回车、文件结束字符或者二者都在一行判定文 件是否结束。(It determines the end of the file by a carriage return, an end of file character or both in a row.) 还要注意在使用该命令之前要先使用file-open 命令,并且文件里还有数据。使用报告器 file-at-end? 测试是否达到文件尾。 file-open "my-file.txt" print file-read-line => Hello World 另见 file-open. file-show file-show value 将value打印到文件中,前面是调用主体,后面是一个回车。(包含调用主体用来帮你跟踪 输出的每一行是哪个主体产生的)。与file-write 类似,字符串要有引号。 注意这是与show 等价的文件i/o命令。在使用该命令前,要先使用file-open 。 另见 file-print, file-type和 file-write. file-type file-type value 将value打印到一个打开的文件中,后面不跟回车(与file-print 和 不用回车使你能在一行打印几个值。 file-show 不同)。 与file-show 不同,前面没有调用主体。 注意这是与type 等价的文件i/o 命令,在使用该命令前,要先使用file-open 。 另见 file-print, file-show 和file-write. 173 NetLogo 4.0.2 用户手册 file-write file-write value 将一个值输出到一个打开的文件,可以是数值、字符串、列表、布尔值、或nobody,后面不 跟回车(与file-print 和 file-show不同)。 与file-show不同,前面没有调用主体。输出的字符串有引号,前面加一个空格。用这种方 式输出,这样file-read 能解释它。 注意这是与write等价的文件i/o 命令,在使用该命令前,要先使用file-open 。 file-open "locations.txt" ask turtles [ file-write xcor file-write ycor ] 另见 file-print, file-show 和file-type 。 filter filter [reporter] list 返回 list 中由布尔型 reporter 为真的项组成的列表 — 也就是说,满足给定条件的项。 在reporter中,用 ? 引用列表list的当前项。 show filter [? < 3] [1 3 2] => [1 2] show filter [first ? != "t"] ["hi" "there" "everyone"] => ["hi" "everyone"] 另见 map, reduce, ?. first first list first string 对列表,返回列表的第一(0th)项。 对字符串,返回仅包含原始字符串中第一个字符的字符串。 174 NetLogo 4.0.2 用户手册 floor floor number 返回小于等于 number 的最大整数。 show floor 4.5 => 4 show floor -4.5 => -5 follow follow turtle 与 ride 相似,但在 3 维视图中,观察者的位置是在 turtle 的后上方。 另见 follow-me, ride, reset-perspective, watch, subject. follow-me follow-me 请求观察者跟随调用主体。 另见 follow. foreach foreach list [ commands ] (foreach list1 ... [ commands ]) 对单个列表,让列表中的每一项运行commands。在commands中用 ? 引用列表当前项。 foreach [1.1 2.2 2.6] [ show (word ? " -> " round ?) ] => 1.1 -> 1 => 2.2 -> 2 => 2.6 -> 3 175 NetLogo 4.0.2 用户手册 对多个列表,对每个列表中的每一组项运行commands。因此第一项运行一次,第二项运行一 次,等等。所有列表长度必须相同。在commands里使用?1 到?n 引用每个列表的当前项。 下面的几个例子使得含义清楚一点: (foreach [1 2 3] [2 4 6] [ show word "the sum is: " (?1 + ?2) ]) => "the sum is: 3" => "the sum is: 6" => "the sum is: 9" (foreach list (turtle 1) (turtle 2) [3 4] [ ask ?1 [ fd ?2 ] ]) ;; turtle 1 moves forward 3 patches ;; turtle 2 moves forward 4 patches 另见 map, ?. forward fd forward number 海龟前进 number 步,每次 1 步。(如果 number 为负则后退) fd 10 等价于repeat 10 [ jump 1 ]。fd 10.5 等价于repeat 10 [ jump 1 ] jump 0.5。 如果海龟因当前拓扑的限制不能前进 number 步,则前进尽可能大的整数步,然后停下。 另见 jump, can-move?. fput fput item list 将 item 加到列表首,返回新列表。 ;; suppose mylist is [5 7 10] set mylist fput 2 mylist ;; mylist is now [2 5 7 10] 176 NetLogo 4.0.2 用户手册 G globals globals [var1 ...] 这个关键词和 breed, -own, patches-own, turtles-own 一样,只能用在程序首部, 位于任何例程定义之前。它定义新的全局变量。全局变量是“全局”的,因为能被任何主体 访问,能在模型中的任何地方使用。 一般全局变量用于定义在程序多个部分使用的变量或常量。 H hatch hatch- hatch number [ commands ] hatch- number [ commands ] 本海龟创建 number 个新海龟。每个新海龟与母体相同,处在同一个位置。然后新海龟运行 commands。可以使用 commands 给新海龟不同的颜色、方向、位置等任何东西。(新海龟同 时创建,然后以随机顺序每次运行一个) 如果使用 hatch- 形式,则新海龟是给定种类的成员。否则,新海龟与母体种类相 同。 注意:当这个命令运行时,其他主体不能运行任何代码(就像使用without-interruption 命令)。这确保如果使用ask-concurrent,在新海龟全部初始化之前,新海龟不能与任何其 他主体交互。 hatch 1 [ lt 45 fd 1 ] ;; this turtle creates one new turtle, ;; and the child turns and moves away hatch-sheep 1 [ set color black ] ;; this turtle creates a new turtle ;; of the sheep breed 另见 create-turtles, sprout. 177 NetLogo 4.0.2 用户手册 heading heading 这是一个内置海龟变量,指明海龟面向的方向,该值在[0,360)。0 是北,90 是东,等等。 设置这个变量实现海龟转动。 另见 right, left, dx, dy. 例子: set heading 45 ;; turtle is now facing northeast set heading heading + 10 ;; same effect as "rt 10" hidden? hidden? 这是一个内置的海龟或链变量,是一个布尔值(true 或 false),指明海龟或链当前是否 隐藏(即不可见)。设置这个变量使海龟或链消失或出现。 另见 hide-turtle, show-turtle, hide-link, show-link 例子: set hidden? not hidden? ;; if turtle was showing, it hides, and if it was hiding, ;; it reappears hide-link hide-link 链使自己不可见。 注意:该命令等价于设置链变量"hidden?"为 true 。 另见 show-link. 178 NetLogo 4.0.2 用户手册 hide-turtle ht hide-turtle 海龟使自己不可见。 注意:该命令等价于设置海龟变量"hidden?"为 true 。 另见 show-turtle. histogram histogram list 将给定列表中的值表达为直方图。 直方图显示列表值的频率分布。柱形的高度表示落到每个区间的数值数量。 在绘制直方图之前,首先以前所有当前画笔画出的点被删除。 列表中的非数值型值忽略。 直方图由当前画笔和当前画笔颜色在当前绘图上画出。使用 set-plot-x-range 控制要画成 直方图的数值范围,设置画笔间隔(直接使用 set-plot-pen-interval,或用 set-histogram-num-bars 间接设置)控制要分成多少个区间。 确认如果要用柱形绘制,当前画笔应在 bar 模式(模式 1). 对直方图,绘图的 X 范围不包括最大 X 值,等于最大 X 值的数落在直方图范围之外。 histogram [color] of turtles ;; draws a histogram showing how many turtles there are ;; of each color home home 调用海龟移动到原点(0,0),等价于setxy 0 0。 179 NetLogo 4.0.2 用户手册 hsb hsb hue saturation brightness 返回用 HSB 格式给定颜色的 RGB 列表。Hue, saturation, brightness 是 0-255 范围内的整 数。RGB 列表包含处于相同范围的三个整数。 另见rgb hubnet-broadcast hubnet-broadcast tag-name value 从 NetLogo 广播 value,在计算器 HubNet 是到变量,在计算机 HubNet 是到界面元素,带着 客户端的名字 tag-name。 详情和教学见 HubNet Authoring Guide. hubnet-broadcast-view hubnet-broadcast-view 将 NetLogo 模型 2 维视图的当前状态广播到所有计算机 HubNet 客户。对计算器 HubNet 无 效果。 注意:这是一个实验性原语,未来版本中行为可能有变。 详情和教学见 HubNet Authoring Guide. hubnet-enter-message? hubnet-enter-message? 如果有一个新的计算机客户进入仿真,返回true,否则返回false。hubnet-message-source 将包含刚登录客户的用户名。 详情和教学见 HubNet Authoring Guide. hubnet-exit-message? hubnet-exit-message? 180 NetLogo 4.0.2 用户手册 如果有一个计算机客户退出仿真,返回true,否则返回false。hubnet-message-source 将 包含刚退出客户的用户名 详情和教学见 HubNet Authoring Guide. hubnet-fetch-message hubnet-fetch-message 如果有客户发来的新数据,则取出下一条数据,这样就可以被hubnet-message, hubnet-message-source, hubnet-message-tag访问。如果没有来自客户的新数据则出错。 细节见 HubNet Authoring Guide. hubnet-message hubnet-message 返回hubnet-fetch-message取得的消息。 细节见 HubNet Authoring Guide. hubnet-message-source hubnet-message-source 返回由hubnet-fetch-message所获得消息的发送客户名。 细节见 HubNet Authoring Guide. hubnet-message-tag hubnet-message-tag 返回hubnet-fetch-message取得数据相关联的标志( tag)。对计算器HubNet,返回由 hubnet-set-client-interface设置的一个变量名。对计算机HubNet,返回客户界面上界面 元素的一个显示名。 细节见 HubNet Authoring Guide. 181 NetLogo 4.0.2 用户手册 hubnet-message-waiting? hubnet-message-waiting? 查看客户发送的新消息。如果有新消息,返回 true,否则返回 false. 细节见 HubNet Authoring Guide. hubnet-reset hubnet-reset 启动HubNet系统。除了hubnet-set-client-interface外,HubNet必须启动才能使用其他的 Hubnet原语。 细节见 HubNet Authoring Guide. hubnet-send hubnet-send string tag-name value hubnet-send list-of-strings tag-name value 对计算器HubNet,该原语与hubnet-broadcast完全一样。(将来NetLogo版本计划改变) 对计算机 HubNet,是这样的: 对字符串 string,从 NetLogo 发送 value 到具有用户名 string 的客户上的 tag tag-name。 对字符串列表 list-of-strings,从 NetLogo 发送 value 到所有列表中用户名客户上。 如果发送到不存在的客户,则产生hubnet-exit-message消息。 细节见 HubNet Authoring Guide. hubnet-send-view hubnet-send-view string hubnet-send-view list-of-strings 对计算器 HubNet 无任何效果。 182 NetLogo 4.0.2 用户手册 对计算机 HubNet,是这样的: 对 string,将 2 维视图当前状态发送到具有用户名 string 的客户。 对 list-of-strings,将 2 维视图当前状态发送到 list-of-strings 中各用户名的客户 将 2 维视图发送到不存在的客户,则产生hubnet-exit-message消息 注意:这是一个实验性原语,未来版本中行为可能有变。 细节见 HubNet Authoring Guide. hubnet-set-client-interface hubnet-set-client-interface client-type client-info 如果 client-type 是 "COMPUTER", client-info 是对计算机 HubNet 的一个空列表。 hubnet-set-client-interface "COMPUTER"[] 未来的 HubNet 会支持其他客户类型。即使是计算机 HubNet,第 2 个输入项的含义也可能改 变。 细节见HubNet Authoring Guide. I if if condition [ commands ] 报告器必须返回一个布尔值(true 或 false)。 如果 condition 为 true,运行 commands。 报告器可能对不同的主体返回不同的值,因此有些主体会执行 commands,有些则不会。 if xcor > 0[ set color blue ] ;; turtles in the right half of the world ;; turn blue 另见 ifelse, ifelse-value. 183 NetLogo 4.0.2 用户手册 ifelse ifelse reporter [ commands1 ] [ commands2 ] 报告器必须返回一个布尔值(true 或 false)。 如果 reporter 返回 true,运行 commands1;如果 reporter 返回 false,运行 commands2。 报告器可能对不同的主体返回不同的值,因此有些主体会执行 commands1,有些会执行 commands2。 ask patches [ ifelse pxcor > 0 [ set pcolor blue ] [ set pcolor red ] ] ;; the left half of the world turns red and ;; the right half turns blue 另见 if, ifelse-value 。 ifelse-value ifelse-value reporter [reporter1] [reporter2] 报告器必须返回一个布尔值(true 或 false)。 如果 reporter 返回 true,结果是 reporter1 的值。 如果 reporter 返回 false,结果是 reporter2 的值。 当报告器需要条件项,而不允许使用命令(如ifelse)时,该原语可以用上。 ask patches [ set pcolor ifelse-value (pxcor > 0) [blue] [red] ] ;; the left half of the world turns red and ;; the right half turns blue show n-values 10 [ifelse-value (? < 5) [0] [1]] => [0 0 0 0 0 1 1 1 1 1] show reduce [ifelse-value (?1 > ?2) [?1] [?2]] [1 3 2 5 3 8 3 2 1] => 8 184 NetLogo 4.0.2 用户手册 另见if, ifelse. import-drawing import-drawing filename 将一个图像文件读到画图层(drawing),对图像进行缩放使它的尺寸与世界一致,维持原 来的长宽比。图像在画图层的中心。以前的画图不清除。 主体感知不到画图层的存在,因此不能处理由import-drawing读入的图像,也不能与图像交 互。如果需要主体感知图像,使用import-pcolors 或 import-pcolors-rgb 。 支持的图像文件格式有:BMP, JPG, GIF, PNG。如果图像格式支持透明(alpha),这些信 息也会输入。 import-pcolors import-pcolors filename 读入图像文件,将它缩放到与瓦片网格尺寸一致,维持原来的长宽比,将所得的像素颜色传 递给瓦片。图像位于瓦片网格的中心。因为 NetLogo 的颜色空间没有包括所有颜色,所以最 后得到的瓦片颜色可能有失真。(参见编程指南的颜色部分)。对有些图像 import-pcolors 可能较慢,特别是当瓦片很多、图像包括很多颜色时。 因为import-pcolors设置了瓦片的pcolor,因此主体可以感知到图像。如果主体需要分析、 处理图像或以其他方式与图像交互,该命令很有用。如果只想简单的显示没有颜色失真的背 景图像,则使用import-drawing。 支持的图像文件格式有:BMP, JPG, GIF, PNG。如果图像格式支持透明(alpha),则所有 的透明像素被忽略。(部分透明像素被作为不透明处理) import-pcolors-rgb import-pcolors-rgb filename 读入图像文件,将它缩放到与瓦片网格尺寸一致,维持原来的长宽比,将所得的像素颜色传 递给瓦片。图像位于瓦片网格的中心。与import-pcolors不同,该命令能得到准确的原图像 颜色。所有瓦片的pcolor是一个RGB列表,而不是 (近似的)NetLogo颜色。 185 NetLogo 4.0.2 用户手册 支持的图像文件格式有:BMP, JPG, GIF, PNG。如果图像格式支持透明(alpha),则所有 的透明像素被忽略。(部分透明像素被作为不透明处理) import-world import-world filename 从给定名字的外部文件读所有变量到模型之中,包括内置变量和用户定义变量,所有的观察 者、海龟、瓦片变量。外部文件的格式应与export-world产生的格式一致。 注意该原语的功能也可在 NetLogo 的文件菜单直接得到。 在使用 import-world 时,为避免出错,应按顺序执行下面几步: 1. 2. 3. 4. 5. 打开创建了输出文件的模型. 按下 Setup 按钮,让模型处于可运行状态. 输入文件. 再次打开所有模型里使用file-open命令打开的文件 如果需要,按下 Go 按钮让模型在中断处开始继续运行. 如果要输入的文件不在模型目录,则使用全路径名。参见export-world的例子。 in-cone agentset in-cone distance angle 5 这个报告器让海龟在它前方形成锥形视场 ("cone of vision")。用两个输入参数定义锥 形,即视距(半径)和视角。视角的中心是海龟的当前方向,大小从 0-360.(如果是 360, 则等价于圆形视场in-radius) in-cone 返回一个主体集合,该集合仅包含原集合中落在锥形之内的主体。(可能包含调用 者自身) 到瓦片的距离从瓦片中心算起。 ask turtles [ ask patches in-cone 3 60 [ set pcolor red ] ] ;; each turtle makes a red "splotch" of patches in a 60 degree ;; cone of radius 3 ahead of itself 5 译者注:在 2 维视图里,实际是扇形视场。 186 NetLogo 4.0.2 用户手册 in- -neighbor? in-link-neighbor? in- -neighbor? agent in-link-neighbor? turtle 如果从 turtle 到调用者有一条有向链,则返回 true。 crt 2 ask turtle 0 [ create-link-to turtle 1 show in-link-neighbor? turtle 1 ;; prints false show out-link-neighbor? turtle 1 ;; prints true ] ask turtle 1 [ show in-link-neighbor? turtle 0 ;; prints true show out-link-neighbor? turtle 0 ;; prints false ] in- -neighbors in-link-neighbors in- -neighbors in-link-neighbors 返回一个海龟主体集合,如果存在从该海龟到调用者的有向链,则该海龟进入主体集合。 crt 4 ask turtle 0 [ create-links-to other turtles ] ask turtle 1 [ ask in-link-neighbors [ set color blue ] ] ;; turtle 0 turns blue 187 NetLogo 4.0.2 用户手册 in- -from in-link-from in- -from turtle in-link-from turtle 返回从 turtle 到调用者的链。如果没有链存在则返回 nobody 。 crt 2 ask turtle 0 [ create-link-to turtle 1 ] ask turtle 1 [ show in-link-from turtle 0 ] ;; shows link 0 1 ask turtle 0 [ show in-link-from turtle 1 ] ;; shows nobody __includes __includes [ filename ... ] 将外部NetLogo源文件(后缀为.nls)包含到模型之中。外部文件可以包括种类、变量、例 程定义。每个文件只能使用一次__includes 。 in-radius agentset in-radius number 返回原主体集合中那些与调用者距离小于等于 number 的主体形成的集合。(可能包含调用 者自身) 与瓦片的距离根据瓦片中心计算。 ask turtles [ ask patches in-radius 3 [ set pcolor red ] ] ;; each turtle makes a red "splotch" around itself inspect inspect agent 188 NetLogo 4.0.2 用户手册 对给定的主体(海龟或瓦片)打开主体监视器(monitor)。 inspect patch 2 4 ;; an agent monitor opens for that patch inspect one-of sheep ;; an agent monitor opens for a random turtle from ;; the "sheep" breed int int number 返回数值的整数部分---小数部分丢弃。 show int 4.7 => 4 show int -3.5 => -3 189 NetLogo 4.0.2 用户手册 is-agent? is-agentset? is-boolean? is- ? is-directed-link? is-link? is-link-set? is-list? is-number? is-patch? is-patch-set? is-string? is-turtle? is-turtle-set? is-undirected-link? is-agent? value is-agentset? value is-boolean? value is- ? value is-directed-link? value is-link? value is-link-set? value is-list? value is-number? value is-patch? value is-patch-set? value is-string? value is-turtle? value 190 NetLogo 4.0.2 用户手册 is-turtle-set? value is-directed-link? value 如果 value 是给定的类型,返回 true,否则返回 false。 item item index list item index string 对列表,返回列表某索引项的值。 对字符串,返回字符串某索引项的字符。 注意索引从 0 开始,而不是从 1 开始。(第一项索引为 0,第二项索引为 1,…) ;; suppose mylist is [2 4 6 8 10] show item 2 mylist => 6 show item 3 "my-shoe" => "s" J jump jump number 海龟立即前进number单位(而不是像forward命令那样每次 1 步) 如果因拓扑限制无法跳 number 步,则海龟根本不动。 另见 forward, can-move?. L label label 191 NetLogo 4.0.2 用户手册 这是一个内置的海龟或链变量,它可以保存任何类型的值。给定的值将以文本形式与海龟附 着在一起,出现在视图中。通过设置变量值来增加、改变或去除海龟或链的标签。 另见 label-color, plabel, plabel-color 。 例子: ask turtles [ set label who ] ;; all the turtles now are labeled with their ;; who numbers ask turtles [ set label "" ] ;; all turtles now are not labeled label-color label-color 这是一个内置的海龟或链变量,它保存一个大于等于 0 小于 140 的值。这个数值决定了海龟 或链标签的颜色(如果有标签的话)。通过设置该变量的值改变海龟或链标签的颜色。 另见 label, plabel, plabel-color. 例子: ask turtles [ set label-color red ] ;; all the turtles now have red labels last last list last string 对列表,返回最后一项。 对字符串,返回仅包含原字符串最后一个字符的单字符字符串。 layout-circle layout-circle agentset radius layout-circle list-of-turtles radius 192 NetLogo 4.0.2 用户手册 以给定的半径将给定的海龟集合按圆形排列,圆心是世界中心处的瓦片。(如果世界尺寸是 偶数,则圆心四舍五入到最近瓦片),海龟指向外部。 如果第一个输入参数是主体集合,则海龟以随机顺序排列。 如果第一个输入参数是列表,则从圆形的顶部开始,海龟们按给定的顺序顺时针排列。(列 表中不是海龟的项被忽略) ;; in random order layout-circle turtles 10 ;; in order by who number layout-circle sort turtles 10 ;; in order by size layout-circle sort-by [[size] of ?1 < [size] of ?2] turtles 10 __layout-magspring __layout-magspring turtle-set link-set spring-constant spring-length repulsion-constant magnetic-field-strength magnetic-field-type bidirectional? 该命令与layout-spring 很相似,但增加了一层复杂性。turtle-set中的海龟相互吸引和排 斥,吸力和斥力取决于他们之间的链(在link-set中)。仍然有磁场存在,而这些链试图与 磁力线方向一致。 link-set 是链的集合,这些链对他们所连接的海龟施加力的作用。那些与链主体集合中的 链相连但不在海龟主体集合中的海龟被看作锚点(anchor)。如果没有海龟具有固定位置, 整个网络可能会坍塌。 spring-constant 弹簧紧度("tautness")的指标(见 layout-spring) spring-length 是弹簧的零力("zero-force")长度或自然长度。 (见 layout-spring) repulsion-constant 是节点间斥力的指标(见 layout-spring) 。 magnetic-field-strength 是磁场强度 (合理值在 0 到 1 之间, 但 0.05 是一个较好的默 认值) magnetic-field-type 是 0-10 之间的一个数,下表列出所有选项: magnetic-field-type 描述 NONE = 0 如果不用磁场,该命令与 layout-spring 一样。 193 NetLogo 4.0.2 用户手册 NORTH = 1 磁力线向北 NORTHEAST = 2 磁力线向东北 EAST = 3 ... SOUTHEAST= 4 ... SOUTH = 5 ... SOUTHWEST= 6 ... WEST = 7 ... NORTHWEST = 8 ... POLAR = 9 磁力线从原点向外放射 CONCENTRIC = 10 磁力线是以原点为中心的同心圆,呈顺时针方向。 如果 bidirectional?为 true,则链在磁场方向和相反方向同时推动与之相连的海龟,实现 与磁场的顺应。否则,链只在一个方向推动。 to make-a-tree set-default-shape turtles "circle" crt 5 ask turtle 0 [ create-link-with turtle 1 create-link-with turtle 2 ] ask turtle 1 [ create-link-with turtle 3 create-link-with turtle 4 ] ; layout with a fairly strong SOUTH magnetic field repeat 50 [ __layout-magspring turtles with [who != 0] links 0.3 4 1 .50 5 false ] end layout-radial layout-radial turtle-set link-set root-agent 以放射树状布局排列 turtle-set 中的海龟,这些海龟通过 link-set 的链相连。布局的中心 是 root-agent,该主体移动到世界视图的中心。 194 NetLogo 4.0.2 用户手册 仅有 link-set 中的链用来决定布局。如果链所连接的海龟没有包含在 turtle-set 中,这些 海龟将保持不动。 即使网络中有回路(cycle)并不是真正的树结构,该布局仍然可用,不过结果可能不美观。 to make-a-tree set-default-shape turtles "circle" crt 6 ask turtle 0 [ create-link-with turtle 1 create-link-with turtle 2 create-link-with turtle 3 ] ask turtle 1 [ create-link-with turtle 4 create-link-with turtle 5 ] ; do a radial tree layout, centered on turtle 0 layout-radial turtles (turtle 0) links end layout-spring layout-spring turtle-set link-set spring-constant spring-length repulsion-constant 排列 turtle-set 中的海龟,link-set 中的链就像弹簧,海龟之间互斥。与 link-set 中的 链有连接但却不在 turtle-set 中的海龟被当作锚点,保持不动。 spring-constant 是弹簧紧度("tautness")指标,是改变长度时的阻力,是弹簧长度改变 1 个单位时产生的力。 spring-length 是弹簧的零力长度("zero-force")或自然长度。这是弹簧节点受拉或受压 时弹簧试图保持的长度。 repulsion-constant 是节点间斥力指标,是相距单位长度的两个节点之间的斥力。 斥力试图将两个节点尽量分开,以免挤在一起。弹簧试图将所连接的两个节点保持一定的距 离。综合的结果就是整个网络布局突出了节点之间的关系,不太拥挤,又美观。 布局算法基于Fruchterman-Reingold算法。关于算法的详细信息参见here 。 to make-a-triangle 195 NetLogo 4.0.2 用户手册 set-default-shape turtles "circle" crt 3 ask turtle 0 [ create-links-with other turtles ] ask turtle 1 [ create-link-with turtle 2 ] repeat 30 [ layout-spring turtles links 0.2 5 1 ] ;; lays the nodes in a triangle end layout-tutte layout-tutte turtle-set link-set radius 与 link-set 中的链有连接但却不在 turtle-set 中的海龟,按给定的 radius,呈圆形布局。 主体集合中必须至少 3 个主体。 turtle-set 中的海龟以下列方式布局:每个海龟被放置到由与它相连的邻居所形成的多边 形的质心(centroid)。(质心类似 2 维上邻居坐标的平均) (锚点主体("anchor agents")形成的圆形用来防止所有海龟坍塌到一点) 经过几次迭代,布局变稳定。 该布局得名于数学家 William Thomas Tutte,是他提出了这种图布局方法。 to make-a-tree set-default-shape turtles "circle" crt 6 ask turtle 0 [ create-link-with turtle 1 create-link-with turtle 2 create-link-with turtle 3 ] ask turtle 1 [ create-link-with turtle 4 create-link-with turtle 5 ] ; place all the turtles with just one 196 NetLogo 4.0.2 用户手册 ; neighbor on the perimeter of a circle ; and then place the remaining turtles inside ; this circle, spread between their neighbors. repeat 10 [ layout-tutte turtles (turtles with [count link-neighbors = 1]) 12 ] end left lt left number 海龟左转 number 度。(如果 number 为负,则右转) length length list length string 返回给定列表的项数,或给定字符串的字符数。 let let variable value 创建一个新的局部变量并赋值。局部变量仅存在于闭合的命令块中。 如果后面要改变该局部变量的值,使用set 。 例子: let prey one-of sheep-here if prey != nobody [ ask prey [ die ] ] link link end1 end2 end1 end2 197 NetLogo 4.0.2 用户手册 给定端点的who number,返回连接这两个海龟的链。如果没有满足条件的链,则返回nobody。 要引用有种类的链,必须与端点一起使用种类的单数形式。 ask link 0 1 [ set color green ] ;; unbreeded link connecting turtle 0 and turtle 1 will turn green ask directed-link 0 1 [ set color red ] ;; directed link connecting turtle 0 and turtle 1 will turn red 另见 patch-at. link-heading link-heading 返回链从end1到 end2 所在方向的度数(至少为 0,小于 360)。如果端点在相同位置,则 抛出运行错误。 ask link 0 1 [ print link-heading ] ;; prints [[towards other-end] of end1] of link 0 1 另见link-length link-length link-length 返回链的两个端点之间的距离。 ask link 0 1 [ print link-length ] ;; prints [[distance other-end] of end1] of link 0 1 另见link-heading link-set link-set value (link-set value1 value2 ...) 返回输入参数中的所有链组成的集合。输入可以是单个链、链主体集合、nobody,或者是包 括上面所有类型的列表(或嵌套列表)。 198 NetLogo 4.0.2 用户手册 link-set self link-set [my-links] of nodes with [color = red] 另见 turtle-set, patch-set. link-shapes link-shapes 返回一个字符串列表,该列表包含模型中的所有链图形。 可以创建新图形,或从其他模型输入。在链图形编辑器(Link Shapes Editor)中操作。 show link-shapes => ["default"] links links 返回由所有链组成的主体集合。 show count links ;; prints the number of links links-own -own links-own [var1 ...] -own [var1 ...] 该关键词与 globals, breed, -own, turtles-own, patches-own 一样,只能在程 序的首部使用,位于所有例程定义之前。它定义属于每个链的变量。 如果指定了种类,只有那个种类的链具有所定义的链变量。(多个种类可能有相同的变量) undirected-link-breed [sidewalks sidewalk] directed-link-breed [streets street] links-own [traffic] ;; applies to all breeds sidewalks-own [pedestrians] streets-own [cars bikes] 199 NetLogo 4.0.2 用户手册 list list value1 value2 (list value1 ...) 返回包含给定项的列表。列表项可以是任何类型,可以由任何种类的报告器生成。 show list (random 10) (random 10) => [4 9] ;; or similar list show (list 5) => [5] show (list (random 10) 1 2 3 (random 10)) => [4 1 2 3 9] ;; or similar list ln ln number 返回 number 的自然对数,即以 e (2.71828...)为底的对数。 另见 e, log. log log number base 返回以 base 为底 number 的对数。 show log 64 2 => 6 另见 ln. loop loop [ commands ] 不断重复运行命令块,或者一直运行,直到通过使用stop或report使当前例程退出。 注意:一般应使用永久性按钮实现重复运行,其优点在于可以通过点击按钮停止循环。 200 NetLogo 4.0.2 用户手册 lput lput value list 在列表尾部增加一项 value,并返回新列表。 ;; suppose mylist is [2 7 10 "Bob"] set mylist lput 42 mylist ;; mylist now is [2 7 10 "Bob" 42] M map map [reporter] list (map [reporter] list1 ...) 如果给定一个列表,则对列表的每一项运行给定的报告器,运行结果收集到一个列表中并返 回。 在报告器reporter, 使用 ? 引用列表list的当前项。 show map [round ?] [1.1 2.2 2.7] => [1 2 3] show map [? * ?] [1 2 3] => [1 4 9] 如果给定多个列表,则对所有列表形成的每一组运行给定的报告器。因此对所有列表的第一 项运行一次,第二项运行一次,等等。所有列表必须有相同的项数。 在报告器reporter, 使用 ?1 到 ?n 引用每个列表的当前项。 下面的例子帮你弄的明白一些: show (map [?1 + ?2] [1 2 3] [2 4 6]) => [3 6 9] show (map [?1 + ?2 = ?3] [1 2 3] [2 4 6] [3 5 9]) => [true false true] 另见 foreach, ? 。 201 NetLogo 4.0.2 用户手册 max max list 返回列表中的最大数值,忽略其他非数值型项。 show max [xcor] of turtles ;; prints the x coordinate of the turtle which is ;; farthest right in the world max-n-of max-n-of number agentset [reporter] 返回一个包含 number 个主体的主体集合,该集合由 agentset 中具有最高 reporter 值的主 体组成。主体集合的构造方法是:找出具有最高 reporter 值的主体,如果不足 number 个, 则继续寻找次高值,依次进行。最后,如果具有同一数值的主体有多个,如果都选入导致总 数超过 number,则随机选出所需个数的主体。 ;; assume the world is 11 x 11 show max-n-of 5 patches [pxcor] ;; shows 5 patches with pxcor = max-pxcor show max-n-of 5 patches with [pycor = 0] [pxcor] ;; shows an agentset containing: ;; (patch 1 0) (patch 2 0) (patch 3 0) (patch 4 0) (patch 5 0) 另见 max-one-of, with-max 。 max-one-of max-one-of agentset [reporter] 返回主体集合中具有最高 reporter 返回值的主体。如果具有最高值的主体有多个,则随机 选出一个。如果想得到所有具有最高值的主体,使用 with-max 。 show max-one-of patches [count turtles-here] ;; prints the first patch with the most turtles on it 另见 max-n-of, with-max 。 202 NetLogo 4.0.2 用户手册 max-pxcor max-pycor max-pxcor max-pycor 返回瓦片的最大 x 坐标和最大 y 坐标,它们决定世界的大小。 与老版本 NetLogo 不同,当前版本中原点不一定位于世界中心。然而,最大 x 坐标和最大 y 坐标必须大于等于 0。 注意: 仅通过编辑视图就能设置世界大小-- these are reporters which cannot be set. crt 100 [ setxy random-float max-pxcor random-float max-pycor ] ;; distributes 100 turtles randomly in the ;; first quadrant 另见 min-pxcor, min-pycor, world-width, world-height mean mean list 返回给定列表各项的统计平均值,忽略非数值项。均值即各项之和除以项数。 show mean [xcor] of turtles ;; prints the average of all the turtles' x coordinates median median list 返回给定列表中各数值项的中位数,忽略非数值项。中位数就是将各项按顺序排列后的中间 项。(如果中间是两项,则取二者的平均) show median [xcor] of turtles ;; prints the median of all the turtles' x coordinates 203 NetLogo 4.0.2 用户手册 member? member? value list member? string1 string2 member? agent agentset 对列表,如果给定的 value 在列表中则返回 true,否则返回 false 。 对字符串,判断 string1 是否是 string2 的子串。 对主体集合,判断给定的主体是否在主体集合之中。 show member? 2 [1 2 3] => true show member? 4 [1 2 3] => false show member? "bat" "abate" => true show member? turtle 0 turtles => true show member? turtle 0 patches => false 另见 position 。 min min list 返回列表中的最小数值,忽略其他类型的项。 show min [xcor] of turtles ;; prints the lowest x-coordinate of all the turtles min-n-of min-n-of number agentset [reporter] 返回一个包含 number 个主体的主体集合,该集合由 agentset 中具有最小 reporter 值的主 体组成。主体集合的构造方法是:找出具有最小 reporter 值的主体,如果不足 number 个, 204 NetLogo 4.0.2 用户手册 则继续寻找次小值,依次进行。最后,如果具有同一数值的主体有多个,如果都选入导致总 数超过 number,则随机选出所需个数的主体。 ;; assume the world is 11 x 11 show min-n-of 5 patches [pxcor] ;; shows 5 patches with pxcor = min-pxcor show min-n-of 5 patches with [pycor = 0] [pxcor] ;; shows an agentset containing: ;; (patch -5 0) (patch -4 0) (patch -3 0) (patch -2 0) (patch -1 0) 另见 min-one-of, with-min 。 min-one-of min-one-of agentset [reporter] 返回主体集合中具有最小 reporter 返回值的主体。如果具有最小值的主体有多个,则随机 选出一个。如果想得到所有具有最小值的主体,使用 with-min 。 show min-one-of turtles [xcor + ycor] ;; reports the first turtle with the smallest sum of ;; coordinates 另见 with-min, min-n-of 。 min-pxcor min-pycor min-pxcor min-pycor 返回瓦片的最小 x 坐标和最小 y 坐标,它们决定世界的大小。 与老版本 NetLogo 不同,当前版本中原点不一定位于世界中心。然而,最小 x 坐标和最小 y 坐标必须小于等于 0。 注意: 仅通过编辑视图就能设置世界大小-- these are reporters which cannot be set. crt 100 [ setxy random-float min-pxcor random-float min-pycor ] ;; distributes 100 turtles randomly in the 205 NetLogo 4.0.2 用户手册 ;; third quadrant 另见 max-pxcor, max-pycor, world-width, world-height mod number1 mod number2 返回 number1 模除 number2:即 number1 (mod number2)的余数。与下面的代码等价: number1 - (floor (number1 / number2)) * number2 注意 mod 是中缀运算,在两个输入参数之间。 show 62 mod 5 => 2 show -8 mod 3 => 1 另见 remainder。mod 和 remainder对正数一样,但对负数不一样。 modes modes list 6 返回list中出现次数最多的项 (一项或多项)所组成的列表。 输入参数列表可以包括任何类型 NetLogo 值。 如果输入列表是空列表,则返回空列表。 show modes [1 2 2 3 4] => [2] show modes [1 2 2 3 3 4] => [2 3] show modes [ [1 2 [3]] [1 2 [3]] [2 3 4] ] => [[1 2 [3]] show modes [pxcor] of turtles ;; shows which columns of patches have the most ;; turtles on them 6 译者注:统计学上的众数。 206 NetLogo 4.0.2 用户手册 mouse-down? mouse-down? 如果鼠标按钮按下则返回 true,否则返回 false。 注意:如果鼠标指针在当前视图之外,mouse-down?总返回 false。 mouse-inside? mouse-inside? 如果鼠标指针在当前视图之内则返回 true,否则返回 false。 mouse-patch mouse-patch 如果鼠标指针指向一个瓦片则返回该瓦片,否则返回nobody 。 mouse-xcor mouse-ycor mouse-xcor mouse-ycor 返回 2 维视图中鼠标的x或y坐标。坐标值采用海龟坐标,因此不必是整数。如果想得到瓦片 坐标,使用round mouse-xcor 和 round mouse-ycor 。 注意:如果鼠标不在 2 维视图中,返回它最后一刻在视图中的坐标值。 ;; to make the mouse "draw" in red: if mouse-down? [ ask patch mouse-xcor mouse-ycor [ set pcolor red ] ] move-to move-to agent 207 NetLogo 4.0.2 用户手册 海龟将其 x 和 y 坐标设置为与给定主体 agent 的相同。 (如果给定主体是瓦片,则效果就是海龟移动到瓦片中心) move-to turtle 5 ;; turtle moves to same point as turtle 5 move-to one-of patches ;; turtle moves to the center of a random patch move-to max-one-of turtles [size] ;; turtle moves to same point as biggest turtle 注意海龟的方向未变。也许需要先使用face 命令将海龟的方向调整为运动方向。 另见 setxy 。 movie-cancel movie-cancel 取消当前电影。 movie-close movie-close 停止录制当前电影。 movie-grab-view movie-grab-interface movie-grab-view movie-grab-interface 将一幅当前视图或界面面板的图像添加到当前电影。 ;; make a 20-step movie of the current view setup movie-start "out.mov" repeat 20 [ movie-grab-view go 208 NetLogo 4.0.2 用户手册 ] movie-close movie-set-frame-rate movie-set-frame-rate frame-rate 设置当前电影的帧频,帧频单位是每秒多少帧。(如果不明确设置帧频,默认为 15 帧/秒) 该命令必须在movie-start 之后,movie-grab-view 或 movie-grab-interface 之前调用。 另见 movie-status 。 movie-start movie-start filename 创建一个新电影。电影保存到filename指定的QuickTime文件,该文件的后缀应为".mov" 。 另见movie-grab-view, movie-grab-interface, movie-cancel, movie-status, movie-set-frame-rate, movie-close 。 movie-status movie-status 返回一个描述当前电影的字符串。 print movie-status => No movie. movie-start print movie-status => 0 frames; frame rate = 15. movie-grab-view print movie-status 1 frames; frame rate = 15; size = 315x315. 209 NetLogo 4.0.2 用户手册 my- my-links my- my-links 返回与调用者连接的所有无向链组成的主体集合。 crt 5 ask turtle 0 [ create-links-with other turtles show my-links ;; prints the agentset containing all links ;; (since all the links we created were with turtle 0 ) ] ask turtle 1 [ show my-links ;; shows an agentset containing the link 0 1 ] end my-in- my-in-links my-in- my-in-links 返回所有从其他节点出发到达调用者的有向链组成的主体集合。 crt 5 ask turtle 0 [ create-links-to other turtles show my-in-links ;; shows an empty agentset ] ask turtle 1 [ 210 NetLogo 4.0.2 用户手册 show my-in-links ;; shows an agentset containing the link 0 1 ] my-out- my-out-links my-out- my-out-links 返回所有从调用者出发到达其他节点的有向链组成的主体集合。 crt 5 ask turtle 0 [ create-links-to other turtles show my-out-links ;; shows agentset containing all the links ] ask turtle 1 [ show my-out-links ;; shows an empty agentset ] myself myself "self" 与 "myself" 大不相同。 "self" 很简单,就是指我("me")。 "myself" 是指“请 求我做目前正在做的事情的海龟或瓦片” 。 当主体被请求运行代码时,在代码中使用 myself 返回发出请求的主体(海龟或瓦片)。 myself 经常与 of 一起使用,用来读取或设置请求发出主体的变量。 myself 不仅可以用在 ask 命令的代码块里,还可用在 hatch, sprout, of, with, all?, with-min, with-max, min-one-of, max-one-of, min-n-of, max-n-of。 ask turtles [ ask patches in-radius 3 [ set pcolor [color] of myself ] ] 211 NetLogo 4.0.2 用户手册 ;; each turtle makes a colored "splotch" around itself 在代码例子"Myself Example"里有许多实例 。 另见 self 。 N n-of n-of size agentset n-of size list 对主体集合,从输入主体集合中随机选取(不重复)size 个主体组成一个主体集合,返回 该主体集合。 对列表,从输入列表中随机选取(不重复)size 项组成一个列表,返回该列表。结果列表 中各项的顺序与原列表中的顺序一致。(如果需要随机顺序,对结果使用 shuffle) 如果 size 大于输入集合(列表)的项数,则出错。 ask n-of 50 patches [ set pcolor green ] ;; 50 randomly chosen patches turn green 另见 one-of 。 n-values n-values size [reporter] 返回一个项数为 size 的列表,其中的各项是重复运行 reporter 得到的。 在reporter中使用? 引用当前被计算过的项数,项数从 0 开始。 show n-values 5 [1] => [1 1 1 1 1] show n-values 5 [?] => [0 1 2 3 4] show n-values 3 [turtle ?] => [(turtle 0) (turtle 1) (turtle 2)] show n-values 5 [? * ?] => [0 1 4 9 16] 212 NetLogo 4.0.2 用户手册 另见 reduce, filter, ? 。 neighbors neighbors4 neighbors neighbors4 返回由 8 个相邻瓦片(邻元)或 4 个相邻瓦片(邻元)组成的主体集合。 show sum [count turtles-here] of neighbors ;; prints the total number of turtles on the eight ;; patches around the calling turtle or patch show count turtles-on neighbors ;; a shorter way to say the same thing ask neighbors4 [ set pcolor red ] ;; turns the four neighboring patches red -neighbors link-neighbors -neighbors link-neighbors 返回与调用海龟相连的所有无向链上另一端海龟组成的主体集合。 crt 3 ask turtle 0 [ create-links-with other turtles ask link-neighbors [ set color red ] ;; turtles 1 and 2 turn red ] ask turtle 1 [ ask link-neighbors [ set color blue ] ;; turtle 0 turns blue ] end 213 NetLogo 4.0.2 用户手册 -neighbor? link-neighbor? -neighbor? turtle link-neighbor? turtle 如果在 turtle 和调用者之间有无向链,则返回 true。 crt 2 ask turtle 0 [ create-link-with turtle 1 show link-neighbor? turtle 1 ;; prints true ] ask turtle 1 [ show link-neighbor? turtle 0 ;; prints true ] netlogo-applet? netlogo-applet? 如果模型以 applet 方式运行则返回 true 。 netlogo-version netlogo-version 返回包含当前运行的 NetLogo 版本号的字符串。 show netlogo-version => "4.0.2" new-seed new-seed 返回一个适合作为随机数发生器种子的数值。 214 NetLogo 4.0.2 用户手册 new-seed 产生的数值基于当前日期和时间的毫秒数,并且在 NetLogo 允许的整数范围 -9007199254740992 到 9007199254740992 内。 new-seed 相连的两个返回值不会相同。(实现方法是如果当前毫秒数产生的种子已经用过, 则再等一个毫秒) 另见 random-seed. no-display no-display 关闭当前视图的更新,直到发出 display 命令。有两个主要用途: 一、控制用户在什么时刻看到更新。你可能在视图后面改变许多东西,不想让用户看到,然 后一下子全显示出来。 二、如果关闭视图更新,则模型运行更快。如果你很忙的话,该命令能让你更快的得到结果。 (注意一般不需使用 no-display 命令,你可以使用视图控制条上的 on/off 开关) 注意 display 与 no-display 和视图控制条上的视图冻结开关相互独立。 另见 display. nobody nobody 这是一个特殊值,有些原语如 turtle, one-of, max-one-of 等用来说明没有找到主体。另 外,当主体死亡后,它也等于 nobody 。 注意:空主体集合不等于nobody ,如果要测试主体集合是否为空,使用any? 。只有预期得 到单一主体的地方才可能得到nobody。 set other one-of other turtles-here if other != nobody [ ask other [ set color red ] ] no-links no-links 返回一个空的链主体集合。 215 NetLogo 4.0.2 用户手册 no-patches no-patches 返回一个空的瓦片主体集合。 not not boolean 如果 boolean 为 false 返回 true,否则返回 false。 if not any? turtles [ crt 10 ] no-turtles no-turtles 返回一个空的海龟主体集合。 O of [reporter] of agent [reporter] of agentset 对主体,返回 agent(海龟或瓦片)的 reporter 值。 show [pxcor] of patch 3 5 ;; prints 3 show [pxcor] of one-of patches ;; prints the value of a random patch's pxcor variable show [who * who] of turtle 5 => 25 show [count turtles in-radius 3] of patch 0 0 ;; prints the number of turtles located within a ;; three-patch radius of the origin 对主体集合,返回一个列表,该列表包括主体集合中所有主体的 reporter 值(随机顺序)。 216 NetLogo 4.0.2 用户手册 crt 4 show sort [who] of turtles => [0 1 2 3] show sort [who * who] of turtles => [0 1 4 9] one-of one-of agentset one-of list 对主体集合,返回随机选择的一个主体。如果主体集合为空,返回nobody。 对列表,返回随机选择的一个列表项。如果列表为空则出错。 ask one-of patches [ set pcolor green ] ;; a random patch turns green ask patches with [any? turtles-here] [ show one-of turtles-here ] ;; for each patch containing turtles, prints one of ;; those turtles ;; suppose mylist is [1 2 3 4 5 6] show one-of mylist ;; prints a value randomly chosen from the list 另见 n-of 。 or boolean1 or boolean2 如果 boolean1 或 boolean2 之一或全部为 true,则返回 true 。 注意如果 condition1 为 true,condition2 不再执行(因为对结果无影响) if (pxcor > 0) or (pycor > 0) [ set pcolor red ] ;; patches turn red except in lower-left quadrant 217 NetLogo 4.0.2 用户手册 other other agentset 返回一个主体集合,该主体集合与输入主体集合相同,只是不包括调用主体。 show count turtles-here => 10 show count other turtles-here => 9 other-end other-end 如果由海龟执行,返回请求链另一端的海龟。 如果由链执行,返回链上不是请求海龟的另一个海龟。 这些定义很难抽象理解,下面的例子对你有所帮助: ask turtle 0 [ create-link-with turtle 1 ] ask turtle 0 [ ask link 0 1 [ show other-end ] ] ;; prints turtle 1 ask turtle 1 [ ask link 0 1 [ show other-end ] ] ;; prints turtle 0 ask link 0 1 [ ask turtle 0 [ show other-end ] ] ;; prints turtle 1 正如例子希望说明白的,另一端("other" end)是既不是请求者也不是被请求者的端点。 out- -neighbor? out-link-neighbor? out- -neighbor? turtle out-link-neighbor? turtle 如果从调用者到 turtle 有一条有向链,则返回 true 。 crt 2 ask turtle 0 [ 218 NetLogo 4.0.2 用户手册 create-link-to turtle 1 show in-link-neighbor? turtle 1 ;; prints false show out-link-neighbor? turtle 1 ;; prints true ] ask turtle 1 [ show in-link-neighbor? turtle 0 ;; prints true show out-link-neighbor? turtle 0 ;; prints false ] out- -neighbors out-link-neighbors out- -neighbors out-link-neighbors 返回一个海龟主体集合,这些海龟有从调用者出发到达它的有向链。 crt 4 ask turtle 0 [ create-links-to other turtles ask out-link-neighbors [ set color pink ] ;; turtles 1-3 turn pink ] ask turtle 1 [ ask out-link-neighbors [ set color orange ] ;; no turtles change colors ;; since turtle 1 only has in-links ] end out- -to out-link-to out- -to turtle out-link-to turtle 返回从调用者到 turtle 的链。如果没有链则返回 nobody 。 219 NetLogo 4.0.2 用户手册 crt 2 ask turtle 0 [ create-link-to turtle 1 show out-link-to turtle 1 ;; shows link 0 1 ] ask turtle 1 [ show out-link-to turtle 0 ;; shows nobody ] output-print output-show output-type output-write output-print value output-show value output-type value output-write value 这些命令与print, show, type, write相同,只不过value不是显示在命令中心,而是在模 型的输出区域。(如果模型没有独立的输出区域,则显示在命令中心) P patch patch xcor ycor 给出点的 x 和 y 坐标,返回包含该点的瓦片。(此处为绝对坐标,而不是像 patch-at 那样 基于调用主体的相对坐标) 如果 x 和 y 是整数,该点就是瓦片的中心。如果不是整数,四舍五入为整数,确定瓦片。 如果世界拓扑允许回绕,坐标会回绕到世界之内。如果不允许回绕而坐标超出世界范围,则 返回 nobody。 ask patch 3 -4 [ set pcolor green ] ;; patch with pxcor of 3 and pycor of -4 turns green 220 NetLogo 4.0.2 用户手册 show patch 1.2 3.7 ;; prints (patch 1 4); note rounding show patch 18 19 ;; supposing min-pxcor and min-pycor are -17 ;; and max-pxcor and max-pycor are 17, ;; in a wrapping topology, prints (patch -17 -16); ;; in a non-wrapping topology, prints nobody 另见 patch-at 。 patch-ahead patch-ahead distance 返回沿调用海龟当前方向前方给定距离处的单个瓦片。如果超出世界范围,瓦片不存在,则 返回 nobody 。 ask patch-ahead 1 [ set pcolor green ] ;; turns the patch 1 in front of the calling turtle ;; green; note that this might be the same patch ;; the turtle is standing on 另见 patch-at, patch-left-and-ahead, patch-right-and-ahead, patch-at-heading-and-distance patch-at patch-at dx dy 返回相对调用者(dx, dy)处的瓦片,即距离调用主体东方 dx、北方 dy 的瓦片。 如果该点超出了非回绕世界的边界,因此没有这样的瓦片,则返回 nobody 。 ask patch-at 1 -1 [ set pcolor green ] ;; if caller is a turtle or patch, turns the ;; patch just southeast of the caller green 另见 patch, patch-ahead, patch-left-and-ahead, patch-right-and-ahead, patch-at-heading-and-distance 221 NetLogo 4.0.2 用户手册 patch-at-heading-and-distance patch-at-heading-and-distance heading distance patch-at-heading-and-distance 返回沿给定绝对方向离调用海龟或瓦片给定距离处的单 个瓦片。(与 patch-left-and-ahead 和 patch-right-and-ahead 相反,此处不考虑调用主 体的当前方向)。如果因超出世界范围而瓦片不存在,则返回 nobody 。 ask patch-at-heading-and-distance -90 1 [ set pcolor green ] ;; turns the patch 1 to the west of the calling patch ;; green 另见 patch, patch-at, patch-left-and-ahead, patch-right-and-ahead patch-here patch-here 返回海龟下方的瓦片。 注意瓦片不能用该报告器,因为瓦片只能说"self"。 patch-left-and-ahead patch-right-and-ahead patch-left-and-ahead angle distance patch-right-and-ahead angle distance 返回沿调用海龟当前方左转或右转给定角度(度数),相距给定距离处的单个瓦片。如果因 超出世界范围而瓦片不存在,则返回 nobody 。 (如果想在绝对方向寻找瓦片,而不是与当前海龟方向的相对方向,则使用 patch-at-heading-and-distance) ask patch-right-and-ahead 30 1 [ set pcolor green ] ;; the calling turtle "looks" 30 degrees right of its ;; current heading at the patch 1 unit away, and turns ;; that patch green; note that this might be the same ;; patch the turtle is standing on 222 NetLogo 4.0.2 用户手册 另见 patch, patch-at, patch-at-heading-and-distance patch-set patch-set value1 (patch-set value1 value2 ...) 返回一个包含所有输入瓦片的主体集合。输入可以是单个瓦片、瓦片主体集合、nobody 以 及包含以上任何项的列表(或嵌套列表)。 patch-set self patch-set patch-here (patch-set self neighbors) (patch-set patch-here neighbors) (patch-set patch 0 0 patch 1 3 patch 4 -2) (patch-set patch-at -1 1 patch-at 0 1 patch-at 1 1) patch-set [patch-here] of turtles patch-set [neighbors] of turtles 另见 turtle-set, link-set patches patches 返回包含所有瓦片的主体集合。 patches-own patches-own [var1 ...] 该关键词与 globals, breed, -own, turtles-own 一样,只能用在程序首部,在任 何例程定义之前。它定义所有瓦片可用的变量。 所有瓦片将具有给定的变量,能够使用该变量。 所有瓦片变量可以由瓦片上方的海龟访问。 另见 globals, turtles-own, breed, -own 223 NetLogo 4.0.2 用户手册 pcolor pcolor 这是一个内置瓦片变量,保存瓦片的颜色。设置这个变量改变瓦片颜色。 所有瓦片变量可以由瓦片上方的海龟直接访问。颜色可以用NetLogo颜色(一个数值)或RGB 颜色(3 个数的列表)。细节见编程指南的颜色部分Colors section。 另见 color pen-down pd pen-erase pe pen-up pu pen-down pen-erase pen-up 海龟改变画线模式:画线、擦线、既不画也不擦。线总是显示在瓦片之上和海龟之下。要改 变笔的颜色,则使用set color改变海龟的颜色。 注意:当海龟画笔放下时,所有的移动命令导致画线,包括 jump, setxy 和 move-to 。 注意:这些命令等价于设置海龟变量"pen-mode"为"down" , "up", "erase"。 注意:在 Windows 上画线和擦线可能不会擦除所有像素。 pen-mode 224 NetLogo 4.0.2 用户手册 这是一个内置海龟变量,保存海龟画笔的状态。设置该变量进行画线、擦线或既不画也不擦, 可能的值为"up", "down", "erase"。 pen-size 这是一个内置海龟变量,保存线宽的像素数。当画笔放下(或擦除)时用来画线(擦线)。 plabel plabel 这是一个内置瓦片变量,可能保存任何类型的值。给定的值以文本形式与瓦片附着在一起, 显示在视图中。设置该变量来增加、改变、移除瓦片的标签。 所有瓦片变量可以由瓦片上方的海龟直接访问。 另见plabel-color, label, label-color plabel-color plabel-color 这是一个内置瓦片变量,保存一个大于等于 0 小于 140 的数值。该数值决定了瓦片标签的颜 色(如果有标签的话)。设置该变量改变瓦片标签的颜色。 所有瓦片变量可以由瓦片上方的海龟直接访问。 另见 plabel, label, label-color plot plot number 画笔的 x 值增加 plot-pen-interval,在新的 x 值以及 y 值为 number 处画一个点。(在绘 图上第一次使用该命令时,x 值是 0) 225 NetLogo 4.0.2 用户手册 plot-name plot-name 返回当前绘图的名字(字符串)。 plot-pen-exists? plot-pen-exists? string 如果当前绘图中存在给定名字的画笔则返回 true,否则返回 false 。 plot-pen-down plot-pen-up plot-pen-down plot-pen-up 放下(抬起)当前画笔,实现画(不画)图。(默认所有画笔初始时是放下的) plot-pen-reset plot-pen-reset 清除当前画笔画过的所有东西,移到(0,0)处,放下。如果画笔是永久画笔,则根据绘图编 辑对话框中的设置,将画笔的颜色和模式设为默认值。 plotxy plotxy number1 number2 将当前画笔移动到坐标(number1, number2)。如果画笔是放下的,则绘制线、条形、点(取 决于笔的模式)。 226 NetLogo 4.0.2 用户手册 plot-x-min plot-x-max plot-y-min plot-y-max plot-x-min plot-x-max plot-y-min plot-y-max 返回当前绘图的 x、y 轴最小、最大值。 这些值可以使用 set-plot-x-range 和 set-plot-y-range 命令设置。(它们的默认值在绘 图编辑对话框中设置) position position item list position string1 string2 对列表,返回 item 在 list 第一次出现的位置,如果没出现则返回 false。 对字符串,返回 string1 作为子串第一次在 string2 中出现的位置,如果没出现则返回 false。 注意:位置编号从 0 开始。 ;; suppose mylist is [2 7 4 7 "Bob"] show position 7 mylist => 1 show position 10 mylist => false show position "in" "string" => 3 另见 member? 227 NetLogo 4.0.2 用户手册 precision precision number places 返回将 number 四舍五入到小数点后 places 位的值。 如果 places 是负数,舍入发生在小数点前几位。 show precision 1.23456789 3 => 1.235 show precision 3834 -3 => 4000 print print value 在命令中心显示 value,后跟回车。 与show不同,value前不显示调用主体。 另见 show, type, write 另见 output-print pxcor pycor pxcor pycor 这些是内置瓦片变量,保存瓦片的 x,y 坐标,它们总是整数。因为瓦片不会移动,所以不能 设置这些变量。 pxcor 大于等于 min-pxcor,小于等于 max-pxcor;pycor 大于等于 min-pycor,小于等于 max-pycor 。 所有瓦片变量可以由瓦片上方的海龟直接访问。 另见 xcor, ycor 228 NetLogo 4.0.2 用户手册 R random random number 如果 number 为正,返回大于等于 0、小于 number 的一个随机整数。 如果 number 为负,返回小于等于 0、大于 number 的一个随机整数。 如果 number 为 0,返回 0。 注意:在NetLogo2.0 前,如果给定非整数输入,则返回浮点数。现在不是这样了。如果要 得到浮点数,必须使用random-float 。 show random 3 ;; prints 0, 1, or 2 show random -3 ;; prints 0, -1, or -2 show random 3.5 ;; prints 0, 1, 2, or 3 另见 random-float random-float random-float number 如果 number 为正,返回大于等于 0、小于 number 的一个随机浮点数。 如果 number 为负,返回小于等于 0、大于 number 的一个随机浮点数。 如果 number 为 0,返回 0。 show random-float 3 ;; prints a number at least 0 but less than 3, ;; for example 2.589444906014774 show random-float 2.5 ;; prints a number at least 0 but less than 2.5, ;; for example 1.0897423196760796 229 NetLogo 4.0.2 用户手册 random-exponential random-gamma random-normal random-poisson random-exponential mean random-gamma alpha lambda random-normal mean standard-deviation random-poisson mean 根据均值 mean 返回服从相应分布的随机数,对正态分布还要给出标准差 standard-deviation。 random-exponential 返回服从指数分布的随机浮点数。 random-gamma 返回服从伽马分布的随机浮点数,分布参数由浮点数 alpha 和 lambda 给出, 二者必须大于 0。(如果已知均值和方差的话,输入形式为 alpha = mean * mean / variance; lambda = 1 / (variance / mean)) random-normal 返回服从正态分布的随机浮点数。 random-poisson 返回服从 Poisson-distributed 的随机整数。 show random-exponential 2 ;; prints an exponentially distributed random floating ;; point number with a mean of 2 show random-normal 10.1 5.2 ;; prints a normally distributed random floating point ;; number with a mean of 10.1 and a standard deviation ;; of 5.2 show random-poisson 3.4 ;; prints a Poisson-distributed random integer with a ;; mean of 3.4 random-pxcor random-pycor random-pxcor random-pycor 230 NetLogo 4.0.2 用户手册 返回一个随机整数,处于 min-pxcor(或 -y)到 max-pxcor 或 -y)的闭区间 ask turtles [ ;; move each turtle to the center of a random patch setxy random-pxcor random-pycor ] 另见 random-xcor, random-ycor random-seed random-seed number 将伪随机数发生器的种子设为 number 的整数部分。种子可以是 NetLogo 整数区间 (-9007199254740992 到 9007199254740992)中的任何整数。 细节参见编程指南的随机数Random Numbers部分。 random-seed show random => 57 show random => 91 random-seed show random => 57 show random => 91 47823 100 100 47823 100 100 random-xcor random-ycor random-xcor random-ycor 返回海龟 x 或 y 坐标允许范围内的随机浮点数。 海龟水平坐标从 min-pxcor - 0.5 (含) 到 max-pxcor + 0.5 (不含);垂直坐标为 min-pycor - 0.5 (含) 到 max-pycor + 0.5 (不含)。 ask turtles [ ;; move each turtle to a random point setxy random-xcor random-ycor 231 NetLogo 4.0.2 用户手册 ] 另见 random-pxcor, random-pycor read-from-string read-from-string string 将给定的字符串解释为命令中心的输入,返回结果值。结果可能是数值、列表、字符串、布 尔值,或特殊值"nobody"。 与user-input一起使用,可以将用户输入转化为可用形式。 show read-from-string "3" + read-from-string "5" => 8 show length read-from-string "[1 2 3]" => 3 crt read-from-string user-input "Make how many turtles?" ;; the number of turtles input by the user ;; are created reduce reduce [reporter] list 使用reporter从左到右缩减列表,得到一个单值。含义为,例如reduce [?1 + ?2] [1 2 3 4] 等价于 (((1 + 2) + 3) + 4)。如果列表只有 1 项,返回该项。如果对空列表缩减,则出错。 在reporter中使用?1 和 ?2 引用要组合的两个对象。 很难直接说明reduce的含义,下面有一些例子,尽管不太实用,但可以让你理解该原语的含 义。 show reduce => 6 show reduce => -4 show reduce => 2 show reduce => 1 show reduce => 3 show reduce [?1 + ?2] [1 2 3] [?1 - ?2] [1 2 3] [?2 - ?1] [1 2 3] [?1] [1 2 3] [?2] [1 2 3] [sentence ?1 ?2] [[1 2] [3 [4]] 5] 232 NetLogo 4.0.2 用户手册 => [1 2 3 [4] 5] show reduce [fput ?2 ?1] (fput [] [1 2 3 4 5]) => [5 4 3 2 1] 还有一些更实用的例子: ;; find the longest string in a list to-report longest-string [strings] report reduce [ifelse-value (length ?1 >= length ?2) [?1] [?2]] strings end show longest-string ["hi" "there" "!"] => "there" ;; count the number of occurrences of an item in a list to-report occurrences [x the-list] report reduce [ifelse-value (?2 = x) [?1 + 1] [?1]] (fput 0 the-list) end show occurrences 1 [1 2 1 3 1 2 3 1 1 4 5 1] => 6 ;; evaluate the polynomial, with given coefficients, at x to-report evaluate-polynomial [coefficients x] report reduce [(x * ?1) + ?2] coefficients end ;; evaluate 3x^2 + 2x + 1 at x = 4 show evaluate-polynomial [3 2 1] 4 => 57 remainder remainder number1 number2 返回 number1 除以 number2 的余数。等价于下面的代码: number1 - (int (number1 / number2)) * number2 show remainder 62 5 => 2 show remainder -8 3 233 NetLogo 4.0.2 用户手册 => -2 另见 mod 。对整数 mod 和 remainder 一样,但对负数不一样。 remove remove item list remove string1 string2 对列表,返回去除 list 中所有 item 实例的列表拷贝。 对字符串,返回从 string2 中去除了所有 string1 子串的字符串拷贝。 set mylist [2 7 4 7 "Bob"] set mylist remove 7 mylist ;; mylist is now [2 4 "Bob"] show remove "to" "phototonic" => "phonic" remove-duplicates remove-duplicates list 对列表去除所有重复项,但每项的第一个位置保留。 set mylist [2 7 4 7 "Bob" 7] set mylist remove-duplicates mylist ;; mylist is now [2 7 4 "Bob"] remove-item remove-item index list remove-item index string 对列表,去除 list 给定索引项,返回列表的拷贝。 对字符串,去除 string2 给定索引处的字符,返回字符串的拷贝。 注意索引从 0 开始。(第一项索引是 0) set mylist [2 7 4 7 "Bob"] set mylist remove-item 2 mylist ;; mylist is now [2 7 7 "Bob"] 234 NetLogo 4.0.2 用户手册 show remove-item 2 "string" => "sting" repeat repeat number [ commands ] 运行 commands 共 number 次。 pd repeat 36 [ fd 1 rt 10 ] ;; the turtle draws a circle replace-item replace-item index list value replace-item index string1 string2 对列表,替换索引指定的项。索引从 0 开始(列表的第 6 项索引为 5)。注意"replace-item" 与"set"一起改变列表。 对字符串作用相似,只是 string1 给定索引处的字符被去除,而 string2 插进来。 show replace-item 2 [2 7 4 5] 15 => [2 7 15 5] show replace-item 1 "cat" "are" => "caret" report report value 立即从当前to-report例程退出,返回value作为例程的结果。report 和 to-report总是一 起使用。在to-report 讨论了它们的使用。 reset-perspective rp reset-perspective 235 NetLogo 4.0.2 用户手册 观察者停止观察、跟随、乘骑任何海龟(或瓦片)。(如果观察者没有观察、跟随、乘骑任 何主体,则什么也不发生)。在 3 维视图,观察者还要返回默认位置(在原点上方,向下直 视) 另见 follow, ride, watch 。 reset-ticks reset-ticks 将时钟计数器重设为 0。 另见 tick, ticks, tick-advance reset-timer reset-timer 将计时器重设为 0。另见timer 。 注意计时器与时钟计数器不同。计时器用秒计量逝去的真实时间,而时钟计数器用滴答计量 逝去的模型时间。 reverse reverse list reverse string 返回颠倒过来的列表拷贝。 show mylist ;; mylist is [2 7 4 "Bob"] set mylist reverse mylist ;; mylist now is ["Bob" 4 7 2] show reverse "live" => "evil" rgb rgb red green blue 236 NetLogo 4.0.2 用户手册 当三个数描述 RGB 颜色时,返回一个 RGB 列表。数值范围为 0-255。 另见 hsb ride ride turtle 将视角设到 turtle 。 每次 turtle 移动,观察者也移动。这样在 2 维视图,海龟总是停留在视图的中心。在 3 维 视图,好像是从海龟的眼睛看世界。如果海龟死亡,视角设为默认。 另见 reset-perspective, watch, follow, subject ride-me ride-me 请求观察者乘骑调用海龟。 另见ride right rt right number 海龟右转 number 度。(如果 number 为负,则左转) round round number 返回接近 number 的整数。 如果小数部分恰好是 0.5,则正向取整(rounded in the positive direction)。 237 NetLogo 4.0.2 用户手册 注意正向取整与其他软件程序可能会不一致。(特别是与 StarLogoT 不一样,StarLogoT 总 是舍入到最接近的偶数)。这样做与 NetLogo 里海龟坐标和瓦片坐标的关系匹配。例如,如 果海龟 x 坐标是-4.5,则它在 x 坐标为-4 和-5 的两个瓦片边界处,我们认为海龟在-4 的瓦 片上,因为我们正向取整。 show round 4.2 => 4 show round 4.5 => 5 show round -4.5 => -4 run run string 将给定字符串解释为一个或多个命令序列,然后运行。 代码在主体的当前上下文中运行,即能访问局部变量、"myself"等。 代码必须先被编译,这要花费时间,编译后的二进制代码被 NetLogo 缓存,因此如果重复运 行同样的字符串则会快得多。 另见 runresult 注意不能使用 run 定义或重定义例程。 注意用run或runresult运行代码要比直接运行这些代码慢很多倍。 runresult runresult string 主体将给定字符串解释为一个报告器,运行,返回结果。 代码在主体的当前上下文中运行,即能访问局部变量、"myself"等。 代码必须先被编译,这要花费时间,编译后的二进制代码被 NetLogo 缓存,因此如果重复运 行同样的字符串则会快得多。 另见 run 注意用run或runresult运行代码要比直接运行这些代码慢很多倍。 238 NetLogo 4.0.2 用户手册 S scale-color scale-color color number range1 range2 返回明暗与 number 成正比的 color 色。 如果 range1 < range2, number 越大,颜色越亮。如果 range > range2,则相反。 如果 number < range1,则为最暗的 color 色。 如果 number > range1,则为最亮的 color 色。 注意:对明暗无关的颜色,例如 green and green + 2 一样,使用同样的色谱。 ask turtles [ set color scale-color red age 0 50 ] ;; colors each turtle a shade of red proportional ;; to its value for the age variable self self 返回本海龟或瓦片。 "self" 与 "myself" 大不相同。 "self" 很简单,就是指我("me")。 "myself" 是指“请 求我做目前正在做的事情的海龟或瓦片” 。 另见 myself ; (semicolon) ; comments 本行分号后的内容被忽略。分号用来为程序增加“注释” – 为人类读者解释代码。 可以 增加多余的分号增加美观性。 NetLogo 的 Edit 菜单有对整块代码增加、去除注释的菜单项。 239 NetLogo 4.0.2 用户手册 sentence se sentence value1 value2 (sentence value1 ...) 根据输入值创建列表。如果某个输入值是列表,该列表的项直接包含在结果列表中,而不是 作为嵌套列表。下面的例子清楚的说明了这一点: show sentence 1 2 => [1 2] show sentence [1 2] 3 => [1 2 3] show sentence 1 [2 3] => [1 2 3] show sentence [1 2] [3 4] => [1 2 3 4] show sentence [[1 2]] [[3 4]] => [[1 2] [3 4]] show (sentence [1 2] 3 [4 5] (3 + 3) 7) => [1 2 3 4 5 6 7] set set variable value 将变量 variable 设为给定值。 变量包括: • • • • • • • 使用"globals" 声明的全局变量 与滑动条、开关、选择器、输入框关联的全局变量 属于调用主体的变量 如果调用主体是海龟,海龟下面的瓦片变量 用let 创建的局部变量 当前例程的输入 特殊局部变量 (?, ?1, ?2...). set-current-directory set-current-directory string 240 NetLogo 4.0.2 用户手册 设置file-delete, file-exists?, file-open使用的当前目录。 如果上述命令给出了绝对文件路径,则不使用当前目录。创建新模型时,当前目录默认为用 户目录(user's home directory)。打开模型时当前目录为模型所在目录。 注意在 Windows 中,字符串中的反斜线需要加上另一个反斜线作为转义符,如"C:\\"。 当前目录的改变是临时的,不会存在模型里。 注意:在 applet 里,该命令没有效果。因为 applet 只能从服务器的模型所在目录读取文件。 set-current-directory "C:\\NetLogo" ;; Assume it is a Windows Machine file-open "my-file.txt" ;; Opens file "C:\\NetLogo\\my-file.txt" set-current-plot set-current-plot plotname 将给定名字的绘图设置为当前绘图。后面的绘图命令将影响当前绘图。 set-current-plot-pen set-current-plot-pen penname 将指定名字的画笔设为当前绘图的当前画笔。如果当前绘图没有这个画笔,则出现运行错误。 set-default-shape set-default-shape turtles string set-default-shape breed string 对所有海龟或特定种类的海龟设定默认初始图形。当海龟创建或改变种类时,海龟被设置为 给定图形。 该命令不会影响已存在的海龟,只对以后创建的海龟有影响。 指定的种类必须是海龟或是由breed关键字定义的种类,指定的字符串必须是当前定义的图 形的名字。 在新模型里,所有海龟的默认图形是"default"。 241 NetLogo 4.0.2 用户手册 注意指定默认图形,不会妨碍你以后改变单个海龟的图形,海龟不必一直使用所属种类的默 认图形。 create-turtles 1 ;; new turtle's shape is "default" create-cats 1 ;; new turtle's shape is "default" set-default-shape turtles "circle" create-turtles 1 ;; new turtle's shape is "circle" create-cats 1 ;; new turtle's shape is "circle" set-default-shape cats "cat" set-default-shape dogs "dog" create-cats 1 ;; new turtle's shape is "cat" ask cats [ set breed dogs ] ;; all cats become dogs, and automatically ;; change their shape to "dog" 另见 shape set-histogram-num-bars set-histogram-num-bars number 设置当前画笔的画图间隔,这样给定绘图的当前 x 范围后,如果调用直方图命令则会画出 number 个条形。 另见 histogram __set-line-thickness __set-line-thickness number 指定海龟图形的线宽和轮廓。 默认值是 0,总是产生 1 个像素宽的线。 非 0 值使用瓦片宽度单位。例如宽度为 1,则画出 1 个瓦片宽的线。(一般使用较小的值, 如 0.5,0.2) 线至少 1 个像素宽。 这是一个实验性命令,以后版本可能会修改。 242 NetLogo 4.0.2 用户手册 set-plot-pen-color set-plot-pen-color number 将当前绘图画笔的颜色设为 number。 set-plot-pen-interval set-plot-pen-interval number 告诉当前画笔每次使用绘图命令时,在 x 方向移动 number。(画笔间隔也影响直方图命令 的行为) set-plot-pen-mode set-plot-pen-mode number 设置当前画笔的绘制模式为 number。允许的画笔模式有: • • • 0 (线) :画笔画线将两点相连. 1 (条形):画笔画一个条形,宽度为 plot-pen-interval ,点作为条形的左上角(如果 是负数,则为左下角) 2 (点):画笔只画点,点之间不连。 新画笔的默认模式是 0 (line mode)。 set-plot-x-range set-plot-y-range set-plot-x-range min max set-plot-y-range min max 设置当前绘图的 x、y 轴最小最大值。 改变是临时的,不会存在模型中。当绘图清除时,坐标范围恢复到绘图编辑对话框中设置的 默认值。 243 NetLogo 4.0.2 用户手册 setxy setxy x y 海龟将它的坐标设置为 x,y。 该命令等价于set xcor x set ycor y,不过只使用一个时间步,而不是两个时间步。 如果 x,y 超出世界范围,NetLogo 抛出运行错误。 setxy 0 0 ;; turtle moves to the middle of the center patch setxy random-xcor random-ycor ;; turtle moves to a random point setxy random-pxcor random-pycor ;; turtle moves to the center of a random patch 另见 move-to shade-of? shade-of? color1 color2 如果两个颜色属于同一色系(shades of one another),返回 true,否则返回 false。 show shade-of? blue red => false show shade-of? blue (blue + 1) => true show shade-of? gray white => true shape shape 这是一个内置海龟变量或链变量,保存海龟或链当前图形的名字。设置该变量改变他们的形 状。除非使用set-default-shape指定不同的形状,否则新海龟或链的形状为"default" 。 例子: 244 NetLogo 4.0.2 用户手册 ask turtles [ set shape "wolf" ] ;; assumes you have made a "wolf" ;; shape in NetLogo's Turtle Shapes Editor ask links [ set shape "link 1" ] ;; assumes you have made a "link 1" shape in ;; the Link Shapes Editor 另见 set-default-shape, shapes shapes shapes 返回模型中所包含的所有图形名称字符串的列表。 使用Shapes Editor能够创建新图形,也能从图形库或其他模型导入。 show shapes => ["default" "airplane" "arrow" "box" "bug" ... ask turtles [ set shape one-of shapes ] show show value 在命令中心显示value,前面加上调用主体,后跟回车。(调用主体用来帮你跟踪哪个主体 产生了哪行输出)。另外,与write相似,所有字符串有引号。 另见 print, type, write. 另见 output-show show-turtle st show-turtle 海龟再次变得可见。 注意:该命令等价于设置海龟变量"hidden?"为 false 。 245 NetLogo 4.0.2 用户手册 另见hide-turtle show-link show-link 链再次变得可见。 注意:该命令等价于设置链变量"hidden?"为 false 。 另见 hide-link shuffle shuffle list 返回一个包含原列表中的所有项,但各项随机排序的新列表。 show shuffle [1 2 3 4 5] => [5 2 4 1 3] show shuffle [1 2 3 4 5] => [1 3 5 2 4] sin sin number 返回给定角的正弦值,角度单位为度。 show sin 270 => -1 size size 这是一个内置海龟变量,保存海龟的外观大小。默认是 1,意味着海龟大小与瓦片一样。通 过设置它改变海龟大小。 246 NetLogo 4.0.2 用户手册 sort sort list-of-numbers sort list-of-strings sort agentset 如果输入是数值列表或字符串列表,返回包含原列表所有项,但按升序排列的新列表(数值 或字母顺序)。 非数值或非字符型列表项被忽略。(如果输入列表不包括数值或字符串,结果是空列表) 如果输入是主体集合或主体列表,返回主体列表(不会是主体集合)。如果主体是海龟,则 他们根据 who number 升序排列。如果是瓦片,则从左到右,从上到下排列。 show sort [3 1 4 2] => [1 2 3 4] let n 0 foreach sort patches [ ask ? [ set plabel n set n n + 1 ] ] ;; patches are labeled with numbers in left-to-right, ;; top-to-bottom order sort-by sort-by [reporter] list sort-by [reporter] agentset 如果输入是列表,返回一个包含原列表所有项,但由布尔型 reporter 定义顺序的新列表。 在reporter, 使用?1 和 ?2 引用所比较的两个对象,如果?1 严格的在 ?2 之前,则返回 true,否则返回false。 如果输入是主体集合或主体列表,返回主体列表(不会是主体集合)。 排序是稳定的,即相等项的顺序不会被干扰。(The sort is stable, that is, the order of items considered equal by the reporter is not disturbed) show sort-by [?1 < ?2] [3 1 4 2] => [1 2 3 4] show sort-by [?1 > ?2] [3 1 4 2] 247 NetLogo 4.0.2 用户手册 => [4 3 2 1] show sort-by [length ?1 < length ?2] ["Grumpy" "Doc" "Happy"] => ["Doc" "Happy" "Grumpy"] foreach sort-by [[size] of ?1 < [size] of ?2] turtles [ ask ? [ do-something ] ] ;; turtles run "do-something" one at a time, in ;; ascending order by size sprout sprout- sprout number [ commands ] sprout- number [ commands ] 在当前瓦片上创建 number 个新海龟。新海龟的方向是随机整数,颜色从 14 个主色中随机产 生。海龟立即运行 commands,如果要给新海龟不同的颜色、方向等就比较有用。(新海龟 是一次全部产生出来,然后以随机顺序每次运行 1 个) 如果使用 sprout- 形式,则新海龟属于给定的种类。 sprout 5 sprout-wolves 10 sprout 1 [ set color red ] sprout-sheep 1 [ set color black ] 注意:当运行命令时,其他主体不允许运行任何代码(就像使用without-interruption命令 一样)。这就保证如果使用了ask-concurrent,新海龟在完全初始化之前,不能与任何其他 主体交互。 另见 create-turtles, hatch sqrt sqrt number 返回 number 的方根。 stamp stamp 248 NetLogo 4.0.2 用户手册 调用海龟或链在画图层的当前位置留下一幅主体图形。 注意:stamp 留下的图像在不同的计算机上可能不是逐个像素完全对应。 stamp-erase stamp-erase 调用海龟或链在画图层里将它的图形范围内所有像素清除。 注意:stamp 留下的图像在不同的计算机上可能不是逐个像素完全对应。 standard-deviation standard-deviation list 返回列表 list 里所有数值的无偏统计量-标准差。非数值型项忽略。 show standard-deviation [1 2 3 4 5 6] => 1.8708286933869707 show standard-deviation [energy] of turtles ;; prints the standard deviation of the variable "energy" ;; from all the turtles startup startup 这是用户定义的例程。如果该例程存在的话,模型第一次加载时就调用该例程。 to startup setup end stop stop 调用主体立即从闭合例程、ask、或类似 ask 的结构(crt, hatch, sprout, without-interruption)中退出。当前例程停止,而不是主体的所有运行都停止。 249 NetLogo 4.0.2 用户手册 if not any? turtles [ stop ] ;; exits if there are no more turtles 注意:可以使用 stop 停止一个永久性按钮。如果永久性按钮直接调用例程,当例程停止时, 按钮停止。 (在海龟或瓦片型永久性按钮中,直到所有海龟或瓦片停止后,按钮才停止 – 单 个海龟或瓦片没有能力停止整个按钮) subject subject 返回观察者正在查看、跟随、乘骑的海龟(或瓦片)。如果没有这样的海龟(或瓦片)则返 回nobody 。 另见 watch, follow, ride 。 sublist substring sublist list position1 position2 substring string position1 position2 返回给定列表或字符串的一部分,范围从第一个位置(包括)到第二个位置(不包括)。 注意:位置编号从 0 开始,而不是从 1 开始。 show sublist [99 88 77 66] 1 3 => [88 77] show substring "apartment" 1 5 => "part" subtract-headings subtract-headings heading1 heading2 计算给定的两个方向之差,即 heading2 旋转为 heading1 所需的最小角度。结果为正表示顺 时针旋转,为负表示逆时针旋转。结果总在-180 到 180,不会恰好为-180。 注意简单的对两个方向使用减法不会奏效。减法总是对应顺时针旋转,有时逆时针旋转角度 更小。例如,5 度和 355 度之间的角度差是 10 度,而不是-350 度。 show subtract-headings 80 60 250 NetLogo 4.0.2 用户手册 => 20 show subtract-headings => -20 show subtract-headings => 10 show subtract-headings => -10 show subtract-headings => 180 show subtract-headings => 180 60 80 5 355 355 5 180 0 0 180 sum sum list 返回列表的各项之和。 show sum [energy] of turtles ;; prints the total of the variable "energy" ;; from all the turtles T tan tan number 返回给定角的正切值,角的单位为度。 thickness thickness 这是一个内置链变量,保存链的表观尺寸大小,该尺寸是相对于瓦片尺寸的一个数值。默认 是 0,表示不管瓦片大小,链的宽度总是 1 像素。设置该变量改变链的粗细。 251 NetLogo 4.0.2 用户手册 tick tick 时钟计数器前进 1。 另见 ticks, tick-advance, reset-ticks tick-advance tick-advance number 时钟计数器前进 number。 输入可以是整数或浮点数(有些模型将时间分割的更细)。输入 不能为负。 另见 tick, ticks, reset-ticks ticks ticks 返回时钟计数器的当前值。结果总是一个非负数值。 多数模型使用tick命令推进时钟,这样的话ticks总是返回整数。如果使用了tick-advance 命令,则可能返回浮点数。 另见 tick, tick-advance, reset-ticks tie tie 7 将链的end1 和end2 端点捆绑在一起 。如果是有向链,则end1 为根海龟, end2 为叶海龟。 根海龟的运动影响叶海龟的位置和方向。如果是无向链,则捆绑是相互的,两个海龟都能作 为根海龟或叶海龟,某个海龟的运动将影响另一个海龟的位置和方向。 7 译者注:原文为Ties end2 and end2 of the link together,有误。 252 NetLogo 4.0.2 用户手册 当根海龟移动时,叶海龟也沿相同的方向移动相同的距离,叶海龟的方向不受影响。根海龟 forward, jump,以及设置 xcor 或 ycor 坐标都会产生这样的影响。 当根海龟左转或右转时,叶海龟围绕根海龟旋转相同的角度,叶海龟的方向也旋转相同的角 度。 如果链死亡,捆绑关系消失。 crt 2 [ fd 3 ] ;; creates a link and ties turtle 1 to turtle 0 ask turtle 0 [ create-link-to turtle 1 [ tie ] ] 另见 untie tie-mode tie-mode 这是一个内置链变量,保存链当前使用的捆绑模式名称字符串。使用tie 和 untie 命令改 变链的模式。也可以设置tie-mode 为"free",实现两个海龟之间的非刚性连接(non-rigid joint)。(细节见编程指南的捆绑部分)。默认情况下,链不捆绑。 另见: tie, untie timer timer 返回自从上次使用reset-timer命令(或NetLogo启动)以来逝去的秒数。时钟最大的精度是 毫秒。(是否能得到这个精度根据系统不同而不同,取决于所用的Java虚拟机) 另见 reset-timer 注意 timer 与 tick counter 不同。Timer 计量逝去的真实秒数,而 tick counter 计量模型 运行的滴答数。 to to procedure-name to procedure-name [input1 ...] 用来开始一个命令例程。 253 NetLogo 4.0.2 用户手册 to setup clear-all crt 500 end to circle [radius] crt 100 [ fd radius ] end to-report to-report procedure-name to-report procedure-name [input1 ...] 用来开始一个报告器例程。 例程体应使用report为例程返回一个值。见report 。 to-report average [a b] report (a + b) / 2 end to-report absolute-value [number] ifelse number >= 0 [ report number ] [ report (- number) ] end to-report first-turtle? report who = 0 ;; reports true or false end towards towards agent 返回从本主体到给定主体的方向。 如果拓扑允许回绕并且回绕距离(穿越世界边缘)更短,towards 将使用回绕路径。 注意:当一个主体使用 towards 计算到自身的方向,或计算与处在同一位置的主体的方向时, 会引起运行时间错误。 254 NetLogo 4.0.2 用户手册 set heading towards turtle 1 ;; same as "face turtle 1" 另见 face towardsxy towardsxy x y 返回从海龟或瓦片到点(x,y)的方向。 如果拓扑允许回绕并且回绕距离(穿越世界边缘)更短,towardsxy 将使用回绕路径。 注意:计算主体到它所在点的方向将引起运行时间错误。 另见 facexy turtle turtle number number 返回给定who number的海龟,如果没有则返回nobody 。对有种类海龟,也可使用单数种类 形式引用他们。 ask turtle 5 [ set color red ] ;; turtle with who number 5 turns red turtle-set turtle-set value1 (turtle-set value1 value2 ...) 返回输入参数中所有海龟组成的主体集合。输入可以是单个海龟、海龟主体集合、nobody、 或包含以上任何类型的列表(或嵌套列表) turtle-set self (turtle-set self turtles-on neighbors) (turtle-set turtle 0 turtle 2 turtle 9) (turtle-set frogs mice) 另见 patch-set, link-set 255 NetLogo 4.0.2 用户手册 turtles turtles 返回包含所有海龟的主体集合。 show count turtles ;; prints the number of turtles turtles-at -at turtles-at dx dy -at dx dy 返回与调用者距离为(dx, dy)的瓦片上的海龟组成的主体集合。(如果调用者是海龟,结果 可能包含调用者自身) create-turtles 5 [ setxy 2 3 ] show count [turtles-at 1 1] of patch 1 2 => 5 如果使用了种类名,则只有该种类的海龟被收集。 turtles-here -here turtles-here -here 返回位于调用者瓦片上的所有海龟组成的主体集合(如果调用者是海龟,则也包括它) crt 10 ask turtle 0 [ show count turtles-here ] => 10 如果使用了种类名,则只有该种类的海龟被收集。 breed [cats cat] breed [dogs dog] 256 NetLogo 4.0.2 用户手册 create-cats 5 create-dogs 1 ask dogs [ show count cats-here ] => 5 turtles-on -on turtles-on agent turtles-on agentset -on agent -on agentset 返回所给定的一个或多个瓦片上所有海龟组成的主体集合,或者与给定的海龟站在同一瓦片 上的海龟主体集合。 ask turtles [ if not any? turtles-on patch-ahead 1 [ fd 1 ] ] ask turtles [ if not any? turtles-on neighbors [ die-of-loneliness ] ] 如果使用了种类名,则只有该种类的海龟被收集。 turtles-own -own turtles-own [var1 ...] -own [var1 ...] 该关键词与 globals, breed, -own, patches-own 一样,只能用在程序首部,位于 任何例程定义之前。它定义属于每个海龟的变量。 如果指定了种类而不是海龟,则只有该种类的海龟拥有所列的变量。(多个种类可以有同一 个变量) breed [cats cat ] 257 NetLogo 4.0.2 用户手册 breed [dogs dog] breed [hamsters hamster] turtles-own [eyes legs] ;; applies to all breeds cats-own [fur kittens] hamsters-own [fur cage] dogs-own [hair puppies] 另见 globals, patches-own, breed, -own type type value 在命令中心显示value,不跟回车(与print 和 show不同)。由于没有回车,你可以在一行 中显示多项。 与show不同,在value前面不显示调用主体。 type 3 type " " print 4 => 3 4 另见print, show, write 另见output-type U undirected-link-breed undirected-link-breed [ ] 该关键词与 globals, breed 一样,只能用在程序首部,位于任何例程定义之前。它定义一 个无向链种类。特定种类的链或者都是有向的,或者都是无向的。第一个输入项定义与该类 链相关的主体集合名称,第二个输入项定义该种类成员的名称。 给定种类链的任何一个链: • • • 是由种类链名命名的主体集合的一部分 有内置变量breed 设为该主体集合 由关键词决定是有向的还是无向的 大多数情况下主体集合与 ask 一起使用,向特定种类链发出命令。 258 NetLogo 4.0.2 用户手册 undirected-link-breed [streets street] undirected-link-breed [highways highway] to setup clear-all crt 2 ask turtle 0 [ create-street-with turtle 1 ] ask turtle 0 [ create-highway-with turtle 1 ] end ask turtle 0 [ show sort my-links ] ;; prints [(street 0 1) (highway 0 1)] 另见breed, directed-link-breed untie untie 如果已经被捆绑,则该命令将end2 从end1 松开(设置tie-mode为"none")。如果是无向链, end1 也从end2 松开。它不会移除两个海龟之间的链。 另见 tie 细节参见编程指南的捆绑部分(Tie) 。 uphill uphill4 uphill patch-variable uphill4 patch-variable 海龟移动到 patch-variable 最大的那个相邻瓦片上。如果没有哪个相邻瓦片变量比当前瓦 片大,则保持不动。如果有几个瓦片有相同的最大值,则随机选择一个。非数值型值忽略。 uphill 考虑 8 个相邻瓦片,而 uphill4 考虑四个相邻瓦片。 等价于下面的代码(假设变量为数值型) move-to patch-here ;; go to patch center let p max-one-of neighbors [patch-variable] ;; or neighbors4 if [patch-variable] of p > patch-variable [ 259 NetLogo 4.0.2 用户手册 face p move-to p ] 注意海龟总是停在瓦片中心,方向是 45(uphill)或 90(uphill4)的倍数。 另见uphill, uphill4 user-directory user-directory 打开一个对话框,让用户选择一个已存在的目录。 返回绝对路径字符串。如果用户取消选择,则返回 false。 set-current-directory user-directory ;; Assumes the user will choose a directory user-file user-file 打开一个对话框,让用户选择一个已存在的文件。 返回绝对路径文件名字符串。如果用户取消选择,则返回 false。 file-open user-file ;; Assumes the user will choose a file user-new-file user-new-file 打开一个对话框,让用户选择一个位置,并为新文件命名。返回绝对路径文件名字符串。如 果用户取消选择,则返回 false。 file-open user-new-file ;; Assumes the user will choose a file 注意该报告器不会实际创建文件,正常情况下你使用file-open创建文件,就像例子中那样。 260 NetLogo 4.0.2 用户手册 如果用户选择了已有文件,会询问是否要替换,但该报告器不会实际替换文件,应使用 file-delete实现替换。 user-input user-input value 返回对话框中标题为 value 的输入域用户所输入的字符串。 value 可以是任何类型,不过一般是字符串。 show user-input "What is your name?" user-message user-message value 打开一个对话框,显示消息 value。 value 可以是任何类型,不过一般是字符串。 user-message (word "There are " count turtles " turtles.") user-one-of user-one-of value list-of-choices 打开一个对话框,显示消息 value,list-of-choices 显示为弹出菜单,让用户选择。 返回用户选择的 list-of-choices 的项。 value 可以是任何类型,不过一般是字符串。 if "yes" = user-one-of? "Set up the model?" ["yes" "no"] [ setup ] user-yes-or-no? user-yes-or-no? value 根据用户对 value 的响应,返回 true 或 false。 value 可以是任何类型,不过一般是字符串。 261 NetLogo 4.0.2 用户手册 if user-yes-or-no? "Set up the model?" [ setup ] V variance variance list 返回列表中所有数值的样本方差。忽略非数值型项。 样本方差是各个数值与均值之差的平方和,除以数值项数减 1。 show variance [2 7 4 3 5] => 3.7 W wait wait number 等待给定的秒数。(不必是整数,可以指定分数秒)。注意不能期望完全准确,主体等待的 时间不会小于给定值,但可能稍微大于给定值。 repeat 10 [ fd 1 wait 0.5 ] 另见every watch watch agent 给 agent 打上聚光灯。在 3 维视图,观察者自动旋转,始终面对该主体。 另见 follow, subject, reset-perspective, watch-me 262 NetLogo 4.0.2 用户手册 watch-me watch-me 请求观察者查看调用主体。 另见 watch while while [reporter] [ commands ] 如果 reporter 返回 false,退出循环,否则重复运行 commands。 对不同的主体,reporter 可能返回不同的值,因此不同主体运行 commands 的次数可能不同。 while [any? other turtles-here] [ fd 1 ] ;; turtle moves until it finds a patch that has ;; no other turtles on it who who 这是一个内置海龟变量,保存海龟的"who number"或 ID 号,这是一个大于等于 0 的整数。 不能设置该变量,海龟的"who number"不会改变。 Who numbers从 0 开始。死亡海龟的号码不会分配给新海龟,除非使用clear-turtles 或 clear-all 命令,使得重新从 0 开始编号。 例子: show [who] of turtles with [color = red] ;; prints a list of the who numbers of all red turtles ;; in the Command Center, in random order crt 100 [ ifelse who < 50 [ set color red ] [ set color blue ] ] ;; turtles 0 through 49 are red, turtles 50 263 NetLogo 4.0.2 用户手册 ;; through 99 are blue 可以使用海龟报告器返回给定 who number 的海龟。 另见 turtle with agentset with [reporter] 有两个输入参数,左边是一个主体集合(一般是"turtles" 或 "patches"),右边是一个布 尔型报告器。返回一个新的主体集合,集合中仅包含那些使报告器返回 true 的主体,换句 话说,主体满足给定的条件。 show count patches with [pcolor = red] ;; prints the number of red patches -with link-with -with turtle link-with turtle 返回 turtle 和调用者之间的链。如果没有链则返回 nobody 。 crt 2 ask turtle 0 [ create-link-with turtle 1 show link-with turtle 1 ;; prints link 0 1 ] with-max agentset with-max [reporter] 有两个输入参数,左边是一个主体集合(一般是"turtles" 或 "patches"),右边是一个报 告器。返回一个新的主体集合,集合中仅包含那些使报告器返回最大值的主体。 show count patches with-max [pxcor] ;; prints the number of patches on the right edge 264 NetLogo 4.0.2 用户手册 另见 max-one-of, max-n-of with-min agentset with-min [reporter] 有两个输入参数,左边是一个主体集合(一般是"turtles" 或 "patches"),右边是一个报 告器。返回一个新的主体集合,集合中仅包含那些使报告器返回最小值的主体。 show count patches with-min [pycor] ;; prints the number of patches on the bottom edge 另见 min-one-of, min-n-of with-local-randomness with-local-randomness [ commands ] 该处命令的运行不影响后面的随机事件。当要执行额外的操作(例如输出)而不想对模型输 出产生影响时,使用这个命令。 例子: ;; Run #1: random-seed 50 setup repeat 10 [ go ] ;; Run #2: random-seed 50 setup with-local-randomness [ watch one-of turtles ] repeat 10 [ go ] 因为在without-local-randomness使用one-of, 两次运行是相同的。 该命令的工作原理是:在该命令之前记住随机数发生器的状态,运行后再恢复。(如果要用 随机数发生器新的状态运行该命令,在命令开始处使用random-seed new-seed) 下面的例子演示了在命令运行前后随机数发生器的状态一样。 random-seed 10 with-local-randomness [ print n-values 10 [random 10] ] ;; prints [8 9 8 4 2 4 5 4 7 9] print n-values 10 [random 10] ;; prints [8 9 8 4 2 4 5 4 7 9] 265 NetLogo 4.0.2 用户手册 without-interruption without-interruption [ commands ] 主体运行块中的命令时不允许其他主体使用ask-concurrent打断。也就是说,其他主体被挂 起("on hold"),直到块中的命令执行完。 注意:这个命令只有与ask-concurrent一起使用才有用。在以前的NetLogo版本中,经常需 要该命令,但在NetLogo 4.0 中,只有使用ask-concurrent时才可能需要它。 另见 ask-concurrent word word value1 value2 (word value1 ...) 将输入项连在一起,做为字符串返回。 show word "tur" "tle" => "turtle" word "a" 6 => "a6" set directory "c:\\foo\\fish\\" show word directory "bar.txt" => "c:\foo\fish\bar.txt" show word [1 54 8] "fishy" => "[1 54 8]fishy" show (word 3) => "3" show (word "a" "b" "c" 1 23) => "abc123" world-width world-height world-width world-height 返回 NetLogo 世界的总宽度和总高度。 宽度等于 max-pxcor - min-pxcor + 1,高度等于 max-pycor - min-pycor + 1 。 266 NetLogo 4.0.2 用户手册 另见max-pxcor, max-pycor, min-pxcor, min-pycor wrap-color wrap-color number wrap-color 检查 number 是否在 NetLogo 颜色范围 0-140(不包括 140)内,如果不在,将数 值回绕到 0-140 之内。 回绕的方法是对 number 重复加上或减去 140,直到落在 0-140 范围之内。(当将超过范围 的数值赋给海龟的 color 或瓦片的 pcolor 时,自动按这样的方式回绕) show wrap-color 150 => 10 show wrap-color -10 => 130 write write value 输出value到命令中心,该值可以是数值、字符串、列表、布尔型或nobody ,后面不加回车 (与print 和 show不同)。 与show不同,前面不显示调用主体。输出的字符串包含引号,前面有空格。 write "hello world" => "hello world" 另见 print, show, type 另见 output-write X xcor xcor 这是一个内置海龟变量,保存海龟当前的 x 坐标。设置该变量改变海龟的位置。 267 NetLogo 4.0.2 用户手册 该变量总是大于等于(min-pxcor - 0.5),严格小于(max-pxcor + 0.5) 。 另见 setxy, ycor, pxcor, pycor xor boolean1 xor boolean2 当 boolean1 或 boolean2 其中之一为 true,返回 true。二者同时为 true 不返回 true。 if (pxcor > 0) xor (pycor > 0) [ set pcolor blue ] ;; upper-left and lower-right quadrants turn blue Y ycor ycor 这是一个内置海龟变量,保存海龟当前的 y 坐标。设置该变量改变海龟的位置。 该变量总是大于等于(min-pycor - 0.5),严格小于(max-pycor + 0.5) 。 另见 setxy, xcor, pxcor, pycor ? ?, ?1, ?2, ?3, ... ?, ?1, ?2, ?3, ... 这些是特殊的局部变量,为某些原语保存报告器或命令块的当前输入。 (例如,foreach 或 map 正在访问的列表当前项) ? 总是等价于 ?1 。 不能设置这些变量,并且它们仅在某些原语中使用,目前这些原语有foreach, map, reduce, filter, sort-by, n-values ,可以查看这些原语条目中的例子。 268 NetLogo 4.0.2 用户手册 Java 小程序(Applets) 单个模型可以作为 Java applets 在网页浏览器中运行。 制作和显示 Applets 在文件菜单中选择 Save As Applet 可以创建 applets。如果模型的当前状态未保存, 则先提示你保存,也会提示你有一个 html 文件要保存。 要运行 applets,模型文件、html 文件和 NetLogoLite.jar 必须在同一目录。 (NetLogo 的安装目录里有 NetLogoLite.jar,你可以从这里复制) Applets可以在web服务器上读写文件。如果applet需要额外的文件,从文件读数据、输 入图像等,这些文件也需要上传到服务器。这些文件应该出现在相同的目录配置中,就像出 现在你的计算机上的一样。Applets不能读写用户计算机上的文件,只能读取web服务器的文 件。Applets不能浏览web服务器或用户计算机,意味着user-file 和 user-new-file 在 applet里没有作用。要运行模型,你的模型文件和NetLogoLite.jar必须对web服务器用户是 可读的。 在一些系统里,在上传到服务器之前,可以在本地机上测试 applet。当然不是所有系 统都能这样做,因此如果不能在你的硬盘上运行,试着上传到 web 服务器上。 不需要在页面上包含 html 文件中的所有事情。如果需要的话,可以只将 HTML 代码中的 部分粘贴到任何 HTML 文件中。在一个页面中放置多个
Source Exif Data:
File Type : PDF File Type Extension : pdf MIME Type : application/pdf PDF Version : 1.4 Linearized : Yes Tagged PDF : Yes XMP Toolkit : 3.1-701 Producer : Acrobat Distiller 7.0.5 (Windows) Company : WwW.YlmF.CoM Source Modified : D:20081016022036 Creator Tool : Acrobat PDFMaker 7.0 for Word Modify Date : 2008:10:16 21:27:33+08:00 Create Date : 2008:10:16 20:40:46+08:00 Metadata Date : 2008:10:16 21:27:33+08:00 Document ID : uuid:1cc99d73-bb66-4a2a-b134-1fab0bbe743d Instance ID : uuid:3a4b785e-e5c3-4df9-8871-1c3335ebdf01 Version ID : 4 Format : application/pdf Title : NetLogo用户手册 Creator : YlmF Subject : Headline : Page Count : 375 Page Layout : OneColumn Author : YlmFEXIF Metadata provided by EXIF.tools