List 移除移动代理路径中的循环

List 移除移动代理路径中的循环,list,netlogo,List,Netlogo,我有一个链接节点列表,它是由walker代理在链接上运动时收集的。 当他到达一个目的地时,他必须保存他的路径,但不要循环 消除循环的一种方法是从源链接开始逐位置迭代扫描链接:对于位于i-th位置的链接,从目标链接开始扫描路径,直到遇到第一个链接,例如在j(它始终认为i i,从位置i+1到位置j的链接子路径对应于一个循环,可以消除 我一直在尝试编写一个递归的来报告,它将初始列表作为参数,但没有成功。我的测试代码给出了循环,而不是没有循环的路径,如下所示: to-report no-cycles

我有一个链接节点列表,它是由
walker
代理在链接上运动时收集的。 当他到达一个目的地时,他必须保存他的路径,但不要循环

消除循环的一种方法是从源链接开始逐位置迭代扫描链接:对于位于
i-th
位置的链接,从目标链接开始扫描路径,直到遇到第一个链接,例如在
j
(它始终认为
i i
,从位置
i+1
到位置
j
的链接子路径对应于一个循环,可以消除

我一直在尝试编写一个递归的
来报告
,它将初始列表作为参数,但没有成功。我的测试代码给出了循环,而不是没有循环的路径,如下所示:

to-report no-cycles [ lista ]
  ifelse empty? lista [
    report lista ] [
    let x1 (first lista)
    let rest (butfirst lista)
    let rev-rest (reverse rest)
    let rev-rest1 (first rev-rest)
    ifelse x1 != rev-rest1 [
      report no-cycles (butlast rest)
    ] [
      report lista ]
 ]
end
我不知道这是不是一个好办法


非常感谢您的帮助

我不知道如何使您的编码方法准确工作,但您的一般概念是有意义的。下面的代码是一个报告
的代码,它接受列表并向后迭代,将当前项之前的所有项与当前项进行比较。如果存在匹配项,它将跳到t他是该项的最早实例。请注意,我正在使用链接和数字列表对此进行测试,因此它应该删除任何类型列表中的重复项。但是,它确实返回一个列表,因此如果您输入链接列表,它将不会返回代理集-如果您想让链接执行某些操作,则必须使用
foreach“your list”
而不是
询问
。如果您只需要列表,那么下面的代码至少可以帮助您开始

to-report no-cycles [ input_list ]

  ifelse empty? input_list [
    report input_list
  ]
  [
    let final_list []
    let temp_list reverse input_list 
    let n 0

    while [ n < length temp_list] [
      let x n
      let cur item n temp_list
      while [ x < length temp_list ] [
        if (item x temp_list) = cur  [
          set n x          
        ]
        set x x + 1
      ]
      set final_list fput (item n temp_list) final_list
      set n n + 1
    ]
    report final_list
  ]

end

这将修改链接本身的变量,因此请检查您希望更改的其中一个链接,以监视它是否正常工作。希望这就是您所追求的!

请分享您尝试过的内容,以及它的不足之处。以上是我试图使其工作的代码,但有一个数字列表(不是链接)给我循环,但不是没有循环的路径。非常感谢。我正在向这个
no cycle
过程传递一个链接列表,它也会返回一个链接列表。但是,删除循环后,我必须增加与路径中每个链接相关联的变量的值,因此我认为最好返回一组代理(
路径链接
)因此我可以制作类似于
询问路径链接[为链接添加值]
。这个过程是可能的,或者我必须使用
foreach
?。我已经测试了
foreach
,为每个返回
无循环的链接添加一个值,但给我错误。谢谢。所有问题都是因为为了消除循环,我必须使用一个链接列表。如果我可以使用链接代理集。问题是如果我设置路径(link set path new link)
我会改变代理所遵循的路径,因为这将消除重复项,并且我可能会丢失一些链接,不是吗?不幸的是,使用此过程,我不认为您可以返回代理集。但是,如果您只需要获得链接列表以修改其中一个变量,您当然可以使用
foreach来执行此操作。有关示例,请参见我编辑的答案。
to-report modify-links-in-list [ input_list_of_links ]  

  ;;; input must be a list of links, not an agentset
    foreach input_list_of_links [
    [x] -> 
    ask x [
      set example_var example_var + 1
    ]
  ]

  report input_list_of_links  
end