Performance 使用无向链接而不是定向链接

Performance 使用无向链接而不是定向链接,performance,simulation,netlogo,multi-agent,Performance,Simulation,Netlogo,Multi Agent,在我的模型中,我使用直接链接来保持每个海龟对其他海龟的交互价值,每个链接对链接的每一端都有不同的价值,这正是我想要的,而且很容易实现,但是,我有一个性能问题,我的模型没有像我认为的那样快速工作 现在我正在尝试不同的方法来减少计算需求。我想到的一件事是将所有有向链接整合到无向链接,并将end1和end2的交互值作为链接属性相互关联,例如end1-end2-Relationship-value和end2-end1-Relationship-value和Frequency1 Frequency2。此实

在我的模型中,我使用直接链接来保持每个海龟对其他海龟的交互价值,每个链接对链接的每一端都有不同的价值,这正是我想要的,而且很容易实现,但是,我有一个性能问题,我的模型没有像我认为的那样快速工作

现在我正在尝试不同的方法来减少计算需求。我想到的一件事是将所有有向链接整合到无向链接,并将end1和end2的交互值作为链接属性相互关联,例如end1-end2-Relationship-value和end2-end1-Relationship-value和Frequency1 Frequency2。此实现将使我的整个模型更难调试,因为链接的顺序将更难跟踪,而且我经常使用这些值的计算,因此我想知道是否有更好的方法来提高性能:)

我认为这可能更好的原因是,它会将链接数量减少一半,另一种方法是忘记链接(杀死旧链接或关系不太重要的链接(关系值不重要,关系频率较低),但这一方法与我的模型设置不完全兼容

agents-own [Belongs_to My-home popularity ]
patches-own [label_ storage]
links-own[Value-Of-The-Relationship frequency] 

to Update_link_Values  [Self_Agent Other_Agent Value]
 ask Self_Agent 
   [     ifelse any? links with [end1 = Self_Agent and End2 = Other_Agent]

         [ask out-link-to Other_Agent  [ set Value-Of-The-Relationship Value-Of-The-Relationship + Value  set Frequency Frequency + 1 ]  set hidden? true] 
         [create-link-to Other_Agent [set Value-Of-The-Relationship Value-Of-The-Relationship + Value set Frequency Frequency + 1 ] set hidden? true ] 

     ] 

end

to SeTPoPularity
   set Popularity sum[Value-Of-The-Relationship] of links with [end2 = mySelf]
 end 
更新2: 我想我已经找到了一个更好的设置流行度的方法(很明显!我首先应该这么做),而不是每次都叫它,我只是可以在它发生变化时更新它,我甚至认为我可能不需要每次都叫“流行度”的变量,我只需要在链接中叫my-in-links

*更新3:*

感谢赛斯的评论

谢谢。
Marzy.

我觉得你的计划不会有助于提高绩效。它听起来很可能会让事情变慢变快

您是否尝试过使用探查器扩展来查看哪些过程使用的CPU最多

更新:(现在代码已经提供)

与[end2=我自己]
的链接速度很慢,因为它必须检查每个链接是否满足给定条件。我想你是指我自己的
[my in links]
;像
我的in links
这样的原语会立即返回答案,而不必检查每个链接

类似地,您有[end1=Self\u-Agent和End2=Other\u-Agent]的
any?链接。同样,将
一起使用意味着必须检查每个链接是否满足条件。相反,请编写
[out link neighbor?Other\u-Agent]Self_Agent的
外链路邻居?
可以直接检查链路的存在,而无需扫描每个链路

我有一种预感,通过
消除对
的不必要使用将解决您的性能问题。但是,另一个不太重要的注意事项:


为什么
foreach排序sss
?为什么不干脆
ask sss
?它需要按排序顺序运行有什么原因吗?
ask
foreach
plus
sort
plus
要快得多,这仅仅是为了总结我在第一时间将定向链接更改为无定向链接的结果ch在那之后制造了很多麻烦,所以我仍然会使用定向链接:

这是我使用的代码:

to Update_link_Values  [Self_Agent Other_Agent Value]
 ask Self_Agent 
   [     ifelse  out-link-neighbor? Other_Agent

         [ask out-link-to Other_Agent  [ set Value-Of-The-Relationship Value-Of-The-Relationship + Value  set Frequency Frequency + 1 ]  set hidden? true] ;IF already has a link 
         [create-link-to Other_Agent [set Value-Of-The-Relationship Value-Of-The-Relationship + Value set Frequency Frequency + 1 ] set hidden? true ] ;If they meet for the first time

     ] 

end

;Update_Friendship_Values 
to Update_Friendship_Values  [Self_Agent Other_Agent Value]
  ask Self_Agent 
    [     
      ifelse any? Friendships with [end1 = Self_Agent and End2 = Other_Agent]

      [
        ask Friendships with [end1 = Self_Agent and End2 = Other_Agent] 
        [ 
          set End1-End2-Value-Of-The-Relationship End1-End2-Value-Of-The-Relationship + Value  
          set End1-End2-Frequency End1-End2-Frequency + 1  
        ]  
       ; set hidden? true
      ] ;IF already has a link and first agent is end1
      [  
        ifelse any? Friendships with [end2 = Self_Agent and End1 = Other_Agent]

          [
            ask Friendships with [end2 = Self_Agent and End1 = Other_Agent] 
            [ 
              set End2-End1-Value-Of-The-Relationship End2-End1-Value-Of-The-Relationship + Value  
              set End2-End1-Frequency End2-End1-Frequency + 1
            ]  
            ;set hidden? true
          ] ;IF already has a link and first agent is end2 
          [ ifelse count Other_Agent = 1 
            [create-Friendship-with Other_Agent [
              set End1-End2-Value-Of-The-Relationship End1-End2-Value-Of-The-Relationship + Value
              set End1-End2-Frequency End1-End2-Frequency + 1 
            ]] [
            create-Friendships-with Other_Agent [
              set End1-End2-Value-Of-The-Relationship End1-End2-Value-Of-The-Relationship + Value
              set End1-End2-Frequency End1-End2-Frequency + 1]
            ;set hidden? true 
          ] ]
      ]
    ] 

end

根据Seth建议的更正,我认为拥有更多链接比使用更复杂的计算来找到正确的无向链接(这里称为友谊)要好。

谢谢,是的,我使用了这个扩展,目前我模拟了40000个滴答声(50-100个代理的生存期为10个)其中包括在win7,32位2GB内存和2.4GHz CPU上进行个人社交活动需要15-20分钟。最多的CPU由3个过程使用,其中一个过程检查哪个修补程序中没有任何代理,并将该修补程序的属性移动到社区级别,设置代理流行度的一个是每个外链接邻居的关系值之和,另一个是检查一个补丁中有多少代理,并要求长子迁出。如果您发布了使用大部分运行时的过程的代码,我可能能够发现加速机会。(或者不是,不可能事先知道。)是的,你是对的:)我将更改代码,因为现在更改我在问题中提到的[Move out and set popularity]函数可以大大提高性能:)太棒了,很高兴听到!在检查当前性能后,我注意到检查修补程序值是我模拟中的另一个主要性能问题,每个代理都有一个my Home属性,该属性存储修补程序地址,所有家庭成员都有相同的my Home值,每个修补程序存储一个由整个家庭成员拥有的属性值,当人口增长且一个补丁中的人数超过7人时,长子及其配偶(如果有)将迁出,并将其份额转移到新的“我家”补丁中,如果所有家庭成员死亡,整个家庭的份额将转移到“社区”补丁中。被更新中的所有新问题所迷惑-可能打开一个或多个新的,单独的问题?好的,我刚问过,我对Stackoverflow完全是新手!感谢您的投入:)
to Update_link_Values  [Self_Agent Other_Agent Value]
 ask Self_Agent 
   [     ifelse  out-link-neighbor? Other_Agent

         [ask out-link-to Other_Agent  [ set Value-Of-The-Relationship Value-Of-The-Relationship + Value  set Frequency Frequency + 1 ]  set hidden? true] ;IF already has a link 
         [create-link-to Other_Agent [set Value-Of-The-Relationship Value-Of-The-Relationship + Value set Frequency Frequency + 1 ] set hidden? true ] ;If they meet for the first time

     ] 

end

;Update_Friendship_Values 
to Update_Friendship_Values  [Self_Agent Other_Agent Value]
  ask Self_Agent 
    [     
      ifelse any? Friendships with [end1 = Self_Agent and End2 = Other_Agent]

      [
        ask Friendships with [end1 = Self_Agent and End2 = Other_Agent] 
        [ 
          set End1-End2-Value-Of-The-Relationship End1-End2-Value-Of-The-Relationship + Value  
          set End1-End2-Frequency End1-End2-Frequency + 1  
        ]  
       ; set hidden? true
      ] ;IF already has a link and first agent is end1
      [  
        ifelse any? Friendships with [end2 = Self_Agent and End1 = Other_Agent]

          [
            ask Friendships with [end2 = Self_Agent and End1 = Other_Agent] 
            [ 
              set End2-End1-Value-Of-The-Relationship End2-End1-Value-Of-The-Relationship + Value  
              set End2-End1-Frequency End2-End1-Frequency + 1
            ]  
            ;set hidden? true
          ] ;IF already has a link and first agent is end2 
          [ ifelse count Other_Agent = 1 
            [create-Friendship-with Other_Agent [
              set End1-End2-Value-Of-The-Relationship End1-End2-Value-Of-The-Relationship + Value
              set End1-End2-Frequency End1-End2-Frequency + 1 
            ]] [
            create-Friendships-with Other_Agent [
              set End1-End2-Value-Of-The-Relationship End1-End2-Value-Of-The-Relationship + Value
              set End1-End2-Frequency End1-End2-Frequency + 1]
            ;set hidden? true 
          ] ]
      ]
    ] 

end