首页 > 解决方案 > 连接时,乌龟的 NetLogo 链断开

问题描述

我正在做一些细胞链的模型(作为更大的 DNA 字符串模型的一部分)。它们在屏幕上晃来晃去,当它们晃动到接近同一字符串中相同类型的单元时,它们必须创建与该单元的链接。

代码如下。

它有点工作....但是在我介绍了上面描述的链接行为之后,字符串会在片刻后分解成碎片。我不知道为什么:-)有什么想法吗?

谢谢,

帕勒

breed [cells cell]
cells-own [paired?]

globals [chains]

to setup
  clear-all
  set chains []
  addchain
  reset-ticks
end

to go
  foreach chains [c -> movechain c]

  ask cells [if any? other cells-here with [label = [label] of myself and paired? = false] [
    let makker one-of other cells-here with [label = [label] of myself and paired? = false]
    create-link-with makker [tie]
    set color red
    set paired? true
    ask makker [set color red set paired? true]
    print word label " was found!"
  ]]

  tick
end

to addchain
  set chains lput makechain chains
end

to movechain [mylist]

  let antalfollowers length mylist - 1

  let i antalfollowers
  repeat antalfollowers [
    ask item i mylist [
      move-to (item (i - 1) mylist)
    ]
    set i i - 1
  ]

   ask first mylist [
    right random-float wigglefactor
    left random-float wigglefactor
    fd 1
  ]

end

to-report makechain
  let mylist []
  let text "MGIVEQCCTSICSRYQ"
  let startx random-xcor / -3
  let starty random-ycor / -3

  let i 0
  repeat length text [
    create-cells 1 [
      set color green
      set shape "circle"
      set label item i text
      set paired? false
      set mylist lput self mylist
      setxy startx + i * .75 starty + i * .75
    ]
    set i i + 1
  ]

  report mylist
end

标签: netlogo

解决方案


我正在处理您的问题并取得了一些进展——至少我对您的代码进行了修订,并添加了一些故障排除功能,并且对接口进行了修订。我不知道如何在此处附加模型或运行它时将看到的视图图像,因此我在netlogo-users Google Group中发布了完整模型和 PNG 文件。

这些修订并没有完全回答您关于如何解决链断裂的问题,但它们提供了模型的可重现版本,您可以确定它会在步骤 746 中断,并且您可以打开密集打印和慢动作和观察之后尝试的动作发生了什么。

也许如果我们都看到这一点,就会很明显为什么会出现这种情况。

我认为可能正在发生的一件事是,一旦两个单元连接并打结,您的移动算法就不再是打结链应该如何移动的正确逻辑。

这是我所做的更改:

  • 我在 setup 中添加了一个 random-seed 命令,以便可以在随机变量中使用完全相同的选择重复运行模型,这样我们就可以同时查看结果。

  • 我添加了一个“详细?” 打开界面以打开或关闭正在发生的事情的详细打印。

  • 我添加了一个“清除停止”按钮,允许我在模型中输入的“停止”命令使用停止请求停止运行?标志,代码设置并且此按钮重置,以便“开始”和“一步”在停止后再次工作,并且滴答计数器继续增加。

  • 我添加了一个 msec-per-tick 滑块,以在 go 步骤的末尾放置一个固定的毫秒数,以便模型以可用于调试的速度运行。我不知道其他人是怎么做到的——当我尝试使用界面顶部的内置滑块来控制速度时,要么太慢,要么太快,我做不到似乎能够将其调整到恰到好处。所以我添加了这个kludge。

  • 我猜到你对界面上的 wigglefactor 滑块有什么限制,并做了一个从 0 到 90(度)的滑块。它可以正常工作并重现您的错误。

  • 我添加了一些额外的测试,以防止在您选择的单元格中相邻的两个 C 单元格在发现(有时会这样做)位于同一个补丁上时相互链接。 例如,使用 23456 的随机种子,您的原始代码将其自己的 CC 相邻对联系在一起,在刻度 2 中。

(

这是修改后的代码,关于如何使用它的评论在发布的模型中(在 netlogo-users 中)以及代码之后的下方。

breed [cells cell]
cells-own [paired?]

globals [
  chains
  stop-requested?  ;;//////////////////////////////////////////////////
]

to setup
  clear-all
 ;; random-seed 12345  ;; /////////////// breaks at either step 35 or 45  ////
 ;; random-seed 23456 ;; ////////////////// ties its own CC in tick 2 ///
  random-seed 34567 ;; /////////////////// ties own cc in tick 84 ,  ties C at 746 and breaks in 6 steps
  ;;// wow -- it SNIPS TSIC out of the middle of the chain!!  snips out CTIS, turtles 7 8 9 and 10
  ;; cell 6 C  is directly followed by cell 11  -- also C




  set chains []
  addchain
  set stop-requested? FALSE ;; ////////////////////////////////////////
  reset-ticks
end

to go
  if stop-requested? [ stop ] ;;////////////////////////////////////////////
  foreach chains [c -> movechain c]
  ask cells [if any? other cells-here with [label = [label] of myself and paired? = false
    and who != [who] of myself + 1
    and who != [who] of myself - 1

  ] [
    let makker one-of other cells-here with [label = [label] of myself and paired? = false]
    create-link-with makker [tie]
    set color red
    set paired? true
    ask makker [set color red set paired? true]
    print ( word label " was found at tick " ticks)
    set stop-requested? TRUE ;;/////////////////////////////////////////////
  ]]


   wait ( msec-per-tick / 1000 ) ;;////////////////////////////////////////
  tick
end

to addchain
  set chains lput makechain chains
end

to movechain [mylist]

  if verbose? [print ( word "\n\nin code at tick " ticks " starting movechain") ];;//////////////
  ;;if verbose? [ show mylist ]

  let antalfollowers length mylist - 1

  let i antalfollowers
  repeat antalfollowers [
    ask item i mylist [


    if verbose? [
        ;;print (word " asking item " i " on mylist to move to item " (i - 1) )
        let mover  [label] of item i mylist
        let moveto [label] of item (i - 1) mylist

        let mover-color  [color] of item i mylist
        let moveto-color [color] of item (i - 1) mylist

        ;; BLUE one moves TO the YELLOW ONE at the end of this second
        print (word " move " mover " to " moveto )
        ask item i mylist [set color blue set shape "square" set size 2]
        ask item (i - 1)  mylist [set color yellow set shape "square" set size 2]
        display
        wait 4
        ask item i mylist [set color mover-color set shape "circle" set size 1]
        ask item (i - 1)  mylist [set color moveto-color set shape "circle" set size 1]
        display

      ]

      move-to (item (i - 1) mylist)


        ;;print word "just moved follower " i  ;;//////////////////////////
      ;; wait 0.1 ;;////////////////////////////////////////////////////
    ]
    set i i - 1
  ]

   ask first mylist [
    right random-float wigglefactor
    left random-float wigglefactor
    fd 1
  ]

end

to-report makechain
  let mylist []
  let text "MGIVEQCCTSICSRYQ"   ;; NOTE - this has a repeat of CC in it which SOMETIMES gets tied (23456 tick 2)
  let startx random-xcor / -3
  let starty random-ycor / -3

  let i 0
  repeat length text [
    create-cells 1 [
      set color green
      set shape "circle"
      set label item i text
      set paired? false
      set mylist lput self mylist
      setxy startx + i * .75 starty + i * .75
    ]
    set i i + 1
  ]

  report mylist
end

to clear-stop                   ;;////////////////////////////////
  set stop-requested? FALSE     ;;////////////////////////////////
end                             ;;////////////////////////////////

无论如何,这里是如何运行它来重现问题并非常仔细地检查它。

它是什么?

为排除故障而修改的运动中的 DNA 模型。当一个“C”单元在步骤746中接触另一个“C”单元,并在两个C单元之间建立一个链接并将它们联系在一起移动时,运动算法不知何故中断。这可能有助于找出原因,

这个怎么运作

这增加了一个 msec-per-tick 滑块,默认为 50,如果您将通常的速度滑块留在中间的最顶部(正常),则可以将显示速度设置为大约正确。

我还添加了一个按钮(“清除停止”)和一个开关(详细?)通常关闭。用冗长的?开,模型运行非常非常缓慢,并且颜色编码哪个单元格将要移动到哪个单元格(蓝色移动到黄色)并且它们都暂时变为正方形。

如何使用它

1) 将 msecs-per-tick 设置为 50 2) 关闭详细?,单击 SETUP,单击 GO。该模型将运行 746 个刻度。(这就是在全局变量中将随机种子设置为 34567 的值。)

3) 在滴答 746 处停止后,单击 clear-stop。

注意右上角的 CTI 组。这在逻辑上位于已连接起来的两个 C 细胞之间。这组将被从移动的 DNA 中剪掉,你可以通过检查看到它的编号为 7、8、9 和 10。

4)单击一级6次,前进到可以更清楚地看到两组已经分开的地方。然后开启详细?并单击一次以观看血腥细节,在单元格移动之间暂停 4 秒,命令中心中正在运行的评论告诉哪些单元格将要移动。


推荐阅读