【问题标题】:Setting specific patch identifier设置特定补丁标识符
【发布时间】:2017-03-11 19:44:56
【问题描述】:

我想要补丁的特定“谁”(标签)。我已经附上了一张图片。我该如何设置?是否设置补丁号的手动“谁”?或者还有其他方法吗?

谢谢

picture for patch identifiers

【问题讨论】:

    标签: netlogo patch identifier


    【解决方案1】:

    如果您不关心示例中的特定“螺旋”序列,您可以使用 Luck 解决方案的变体,该解决方案利用 NetLogo 的默认补丁排序顺序:

    patches-own [ id ]
    
    to setup
      clear-all
      (foreach (sort patches) (range count patches) [ [p n] ->
        ask p [ set id n ]
      ])
      ask patches [ set plabel id ]
    end
    

    或者您可以使用sort-by 指定的稍微不同的排序顺序。

    话虽如此,我不知道您的要求是什么,但我会质疑为补丁提供特定 ID 的想法。 NetLogo 中的大多数事情都可以在不参考代理 id 的情况下完成。 who 编号本身是非常古老的 NetLogo 版本的遗物,几乎不应该在现代代码中使用。

    如果要引用特定补丁,请通过其坐标引用它,例如:patch -2 4

    如果您想存储补丁以供将来参考,请存储对补丁本身的引用,而不是某种 id。例如:ask turtles [ set my-patch one-of patches ]

    【讨论】:

    • 感谢您的回答和提问。这些是公寓的标识符。 00是大学区,其余是大学附近的公寓。在每一轮中,学生都会搬到最近的公寓住宿,如果住满了,则搬到离大学更远的公寓外环。这些数字将有助于将学生移动到随机的特定位置。这些标识符会在我设置它们时起作用吗?此外,我不了解 P、n 和范围。写什么来获得这些唯一的标识符。谢谢
    • 我同意 Nicolas 的观点——最好不要给出补丁特定的标识,做你需要做的事情,尤其是当学生随机移动到外环的建筑物时。如果您想要指定的建筑物的可见 ID 标签,我上面的回答会起作用,但从长远来看,在程序中使用这些 ID 最终会变得更加困难。
    【解决方案2】:

    一个补丁没有who,因为那是一个只有海龟的变量;补丁有坐标。但是,您可以为补丁提供自己的 ID 号并使用它。如果您只需要一个 5 x 5 的世界(如您的图片所示),您可以在 Netlogo 代码中完成您想要的。例如,看下面的代码(注意我改变了世界设置to those seen here)。但是,如果您想要一个有更多补丁的世界,我建议您从文件中读取您想要的补丁值。

    globals [
      idlist
      ordered_patches
    ]
    
    patches-own [
      id
    ]
    
    
    to setup
      set idlist [ 9 10 11 12 13 24 1 2 3 14 23 8 0 4 15 22 7 6 5 16 21 20 19 18 17 ]
      set ordered_patches sort patches
    end
    
    
    to assign-ids
    
      ( foreach ordered_patches idlist [
        [ o_patch _id ] -> 
          ask o_patch [ 
            set id _id
          ]
      ]
      )
    
      ask patches [
        set plabel id
      ]
    
    end
    

    【讨论】:

    • 感谢 Luck 的详细解答。我是 netlogo 的新手。我希望你不会介意我在上面的列表中询问 [o_patch _id] 是否需要再次写入并询问 o_patch Is it ask ordered-patches?。 _id的目的是什么。我需要在这里再次列出清单吗?这个符号是什么意思 -> 。我在 Netlogo 中复制并尝试了相同的方法,但出现了许多错误。请指导。
    • 嗨,Sadaf,我应该指定我使用的是 Netlogo 6.0; foreach 原语的语法在版本 5 和 6 之间略有不同,如果您使用的版本比我旧,这可能是导致错误的原因。或者如果没有使用与我上面相同的世界设置,它们可能会发生)。我建议阅读foreach 上的Netlogo dictionary entry,以了解-> 在上面的代码中所做的事情——它还有助于澄清“o_patch”和“_id”只是foreach 的临时变量。
    • 好的,感谢您的澄清。我现在正在使用 NetLogo 6。我运行相同的程序但弹出此错误,因为 FOREACH 的所有列表参数必须是相同的长度。由按钮“assign-ids”调用的过程 ASSIGN-IDS 调用的观察者运行 FOREACH 时出错
    • 我试过这个世界设定。它以这种方式工作。我不知道有什么区别。link
    • 您得到的“必须是相同长度”错误是由于foreach 中使用的任何列表的长度必须相同。所以在这个例子中,我们要求一个有序的补丁列表(其中 25 个)将它们的 id 设置为“idlist”,它也是一个包含 25 个项目的列表。因此,使用此代码,您必须确保 idlist 中的 id 数量与世界上的补丁数量相同。由于您的世界设置 (xmin = -2, xmax = 2, ymin = -2, ymax = 2) 提供了一个包含 25 个补丁的世界,因此代码有效。
    猜你喜欢
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多