如何使用NetLogo让满足条件的海龟移动

如何解决如何使用NetLogo让满足条件的海龟移动

我目前正在使用 NetLogo 开展一个项目。 长话短说:我有一定数量的海龟分布在我的世界的前半部分。目标是让海龟在满足特定条件(数学条件)时在世界的另一半移动。 我遇到的问题是,我只希望满足条件的海龟移动到另一半(所以我假设它将是海龟的一个子组,其维度将取决于我选择的“自由收入”值滑块),但实际上,如果其中至少一个满足条件,则所有海龟都会移动。那不是我想要的。 我正在考虑使用“品种”功能,但我不确定如何实现它。 这是代码:

globals
[
  lazyness-coefficient 
  fatigue-of-work     ; cost associated with looking for work and the activity of working
  free-income
  working-income
]


turtles-own
[
  condition                       ; condition = 1 if the subject works,0 if the subject is unemployed
  utility-value-working-income    ; utility associated with working or being unemployed while receiving a subsidy
  utility-value-free-income
]



;;;
;;;
;;;

to setup
  clear-all
  set free-income free-income-slider       ; mettere slider
  set working-income working-income-slider ; mettere slider
  setup-turtles
  setup-patches
  reset-ticks
end

to setup-patches
  ask patches [ set pcolor black]
end

to setup-turtles
 create-turtles 500
  [
    set shape "person"
    set color green
    set size 1.5
    set condition 0
    setxy random 64 random 32
    set utility-value-free-income free-income ^ 2 + free-income + random-float 1000
    set utility-value-working-income 0
  ] 
end

to go
  let target any? turtles with [utility-value-free-income > 14000]
  if utility-value-free-income > 14000
  [move-target]
end

to move-target
    setxy random 64 random 64
    set color blue 
end

这种情况下的条件如下: 如果海龟的效用值(类型为:x^2 + x + r,其中 r 是随机因子)高于 14000,则将颜色设置为蓝色并移至另一半。 这个条件只是一个尝试,在最终项目中,条件将是: 如果自由收入效用和工作收入效用的比率高于 1,则移动到另一半并将特定海龟的颜色设置为蓝色。

希望我解释清楚了,谢谢大家。

解决方法

你想得太复杂了。 Ask 关键字允许您指定过滤器。

to go   
  ask turtles with [utility-value-free-income > 14000]
  [
    setxy random 64 random 64
    set color blue   
  ] 
end

应该可以解决问题。

,

Jumboman 的回答解决了最实用的方面并告诉你该怎么做,但我想包括一些更深入的观点,让你了解正在发生的事情,因为这是一开始很容易挣扎的事情.

问题的核心是您的 to go 但是,如您所见,NetLogo 不会警告您任何语法错误 - 因为实际上没有!这与您的问题的性质密切相关,即所有执行操作的海龟(而不仅仅是满足条件的海龟)。

要了解原因,我们应该退后一步:您应该始终特别注意执行过程的上下文(即执行操作的代理类型)。

In NetLogo,there are four types of agents: turtles,patches,links,and the observer. 代码总是从观察者(即你)的角度编写的。这就是为什么,如果你想让其他代理做这些事情,你需要让那些代理做那些事情。你可以让海龟请求补丁请求链接请求一些海龟做事,但最终,每一个 ask 链都从观察者开始。

然而,NetLogo 也会尝试猜测您希望谁执行您的程序。在这种情况下,假设 to go 使用海龟自己的变量(即 utility-value-free-incomecolor,后者来自 move-target)并调用只能由海龟(即 setxy 内的 move-target),NetLogo 假设 to go 属于海龟上下文。

这意味着,在执行 to go 时,每只海龟都会按照 to go 所说的去做。更具体地说,这意味着每只海龟都会评估 let target 语句,然后每只海龟都会执行 to move-target

然而这也意味着,虽然 to go 没有给出任何语法错误,但您可能首先应该注意到其他一些奇怪的事情。目前 to go 是一个仅限于海龟的过程,您应该会看到,如果您在界面中添加 go 按钮(这是标准做法),您将收到错误消息。实际上,接口是仅观察者上下文(因此默认情况下按钮是观察者上下文,即除非您不手动更改它们的上下文)。您也会在命令中心输入 go(默认情况下也是仅观察者上下文)以及尝试在 go 中插入 setup 时出错。

这将通过创建 to go 观察者上下文来解决,即通过从观察者上下文的任何地方调用它 + 使用 ask turtles,如 Jumboman 所示。

在 Jumboman 的答案中隐含的另一件事是您需要明确理解的内容是 to go 中的实际代码行有什么问题。 JenB 暗示了 any? 的问题:

您显然打算创建一个名为 target 的代理集;然而,any? 只报告真/假。这意味着,正如 JenB 所说,target 不会存储任何代理集,而只会存储一个真/假值。

尽管如此,您的代码创建了这个 target 变量,但从未真正使用过它,这仍然是一个事实。事实上,您在过程名称 (move-target) 中包含“目标”一词这一事实不会使该过程自动使用名为 target 的变量。所以,即使 target 是一个代理集,move-target 也不会自动引用 target(就此而言,你可以给这两个元素完全随机的名字,它会是一样的).

要做到这一点,你必须这样做

to move-target
 ask target ...
end

但是,正如您已经被建议的那样,with 是完成这项工作的最整洁的方式。 总的来说,以上所有事情的总和就是为什么你应该这样做:

to go
 ask turtles with [utility-value-free-income > 14000] [
   setxy random 64 random 64
   set color blue
 ]
end

PS:关于context这个东西,我养成了总是写注释的习惯,在每个procedure的声明旁边,指明这个procedure所属的context。这对于加快代码的可读性和进行一些调试特别有用,因为您的模型由大量程序构建而成。

,

这是关键过程:

to go
  let target any? turtles with [utility-value-free-income > 14000]
  if utility-value-free-income > 14000
  [move-target]
end

处理每一行:

  1. 创建一个名为 'target' 的变量,并根据是否有任何收入足够高的海龟为其分配值 true 或 false`
  2. 这应该会产生一个语法错误 - 假设 'utility-value-free-income' 是一个海龟属性(这必须是因为否则第 1 行没有意义),那么这一行是一个错误,因为你没有't 告诉 NetLogo 要查看哪只海龟来运行测试。
  3. 如果第 2 行条件为真,则在“移动目标”处运行代码

我通常建议新手 NetLogo 建模者避免在太多过程中破坏事物。从概念上考虑一下,您想要的是移动满足某些条件的海龟。这是一个概念,让它成为一个程序。像这样:

to go
  move-rich-turtles
end

to move-rich-turtles
  let movers turtles with [utility-value-free-income > 14000] 
  ask movers
  [ setxy random 64 random 64
    set color blue
  ]
end

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res