首页 > 解决方案 > 如何在 Netlogo 中保存特定补丁?

问题描述

我的程序是关于:

一队海龟环游世界寻找最好的食物来源并前往那里。

我在代码中存储特定补丁(这是最好的食物位置)时遇到问题。我已尝试使用patch-here,但无法存储我想要的确切补丁

这是代码:

turtles-own
[ myteamset
  food-quality-found    ;the quality of food that the turtle found
  location              ;the location of food-quality-found
  best-food             ;the best food available
  location-best-food    ;the location of best food
]

patches-own
[ food-quality          ;the food source]

这是代码

foreach teamNumbers [
    tn ->
    ask turtles with [ teamID = tn ] [
       if myteamset != nobody [
       ask myteamset [

          set food-quality-found food-quality
          set location patch-here
          ;face location
        ]
          if food-quality-found != 0           ;after all turtles found food, thus comparison can be done
          [ 
          let x1 max [food-quality-found] of myteamset   ; max for group
          set location-of-best-food [patch-here] of location  ;problem ???
            set best-food x1
          move-to location-of-best-food      ;turtles to go to the best food location
          face location-of-best-food      ;turtles stay there
        ]
        ]
      ]

我的世界是这样的,紫色是巢,其他是食物。

每种食物都有不同的食物价值。

我需要帮助来存储location-of-best-food我不能patch-here用来存储位置的值。错误是我一直保存海龟找到食物的位置,而不是最好的食物位置。

感谢您的时间。

我已经编辑了我的问题,因为我已经理解了@JenB 想说的是什么(感谢您的解释)

标签: locationnetlogoagentheading

解决方案


你有太多的问题,其中一些是概念问题。您需要一次处理一个问题,在处理下一个问题之前解决该问题。如果你在任何一个问题上遇到困难,你可以在这里提问(展示你尝试过的事情并解释它在做什么而不是你想要什么)。

我认为最好的第一步是专注于存储最好的食物的位置。但首先你需要理清你的全局和海龟变量问题。

我认为您对全局变量是什么类型的东西感到困惑。全局变量是所有模型实体的值都相同的变量。很明显,每只海龟的团队成员和最近的队友都是不同的。因此,它们必须作为turtles-own变量存储在海龟级别。这也是你应该使用的最佳食物。

你的海龟自己的变量列表中似乎还有太多的标识符类型变量。您所需要的只是一个团队 ID,然后您可以通过简单地找到具有相同团队 ID 的海龟来识别团队成员。如果您经常这样做,则将此类海龟的代理集存储在变量队友中,这样您就不必继续创建相同的代理集。

你的过程应该是这样的:

  • 每只海龟四处移动,如果它找到食物,则检查它找到的食物是否比它所知道的最好的食物更好
  • 如果更好,请存储该食物的位置(这是一个补丁而不是一对坐标)和质量
  • 如果队友可以立即沟通,它也会告诉其他队友食物的质量和位置
  • 如果队友只在接触或类似情况下交流,那么当满足这些条件时,海龟会与队友核对食物更好的食物,并在适当的情况下将食物的位置和质量更改为队友的信息。

请注意,这只会找到最好的食物,它不会跟踪海龟找到的其他食物。一旦找到更好的食物,其他食物的位置就会被遗忘。你需要做清单来跟踪所有的食物,但你绝对不应该这样做,直到你有最好的食物版本正常工作。

作为开始使用 NetLogo 时的一般规则,如果您who在代码中为个人使用标识符(或值),您可能不应该这样做。如果您使用的是 foreach,则可能不应该使用。在这两种情况下,您都需要代理集。

您几乎已经使用此代码到达了那里。您的线路set location patch-here正在使用代理集patch-here而不是标识符。

看过你之前的问题如何让乌龟能够在 Netlogo 中保存其他乌龟 ID?,很明显,您以前曾被建议为此模型使用代理集。我添加了一个答案,向您展示如何执行此操作。您也只是简单地复制了那里提供的代码而不理解它,您之前问题的答案也指出了全局变量和海龟变量之间的区别。


推荐阅读