2013-11-03 26 views
1

在我的模型中,我使用直接链接来保持每只乌龟与其他乌龟的交互作用值,并且每个链接对链接的每一端都有不同的值,这正是我想要的,它确实是我想要的容易实现,但是,我有一个性能问题,我的模型工作速度不如我认为它应该工作。使用无向链接,而不是定向链接

现在我正在尝试不同的方法来减少计算需求。我想到的一件事是将所有定向链接集成到无向链接,并将end1和end2的交互值的值彼此作为链接属性,例如end1-end2-Relationship-Valueend2-end1 - 关系价值频率1频率2。这个实现会让我的整个模型更难以调试,因为链接的顺序将难以跟踪,我使用这些值的计算很多,所以我想知道是否有人有更好的方法来增加性能:)

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

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 

我想我已经找到了更好的方法(明显的一个!我应该首先完成这项工作)来设置流行度,而不是每调用一次我都会更新它,我甚至认为我可能不需要每次需要时都会调用“流行度”变量我只是叫我,在链接

* 更新3:*

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] 
      [create-link-to Other_Agent [set Value-Of-The-Relationship Value-Of-The-Relationship + Value set Frequency Frequency + 1 ] set hidden? true ] 

     ] 

end 

感谢塞特对他的评论

感谢。 Marzy。

+0

检查当前的表现我已经通知后更好d检查修补程序值是我模拟中的另一个主要性能问题,每个代理程序都有一个My-Home属性,用于存储修补程序地址,并且所有家庭成员具有相同的my-home值,每个修补程序存储属于全家的属性值成员,当人口增长并且一个补丁中的人数超过7人时,如果所有家庭成员都死亡,那么与他的伴侣(如果有的话)的大儿子将迁出并将他的份额转移到新的家庭补丁中,家庭将被转移到社区补丁。 – Marzy

+0

您的更新中的所有新问题都感到困惑 - 可能会打开一个或多个新的单独问题? –

+0

好吧,我只是做了,我完全新到了Stackoverflow!感谢您的输入:) – Marzy

回答

1

您的计划对我来说听起来并不像会有助于提升性能。这听起来很可能让事情变得越来越慢。

您是否尝试过使用Profiler扩展来查看哪些程序是使用最多CPU的程序? http://ccl.northwestern.edu/netlogo/5.0/docs/profiler.html

UPDATE:(现在的代码已经提供)

links with [end2 = mySelf]是缓慢的,因为它必须检查每一个环节,看看它是否满足给定的条件。我想你的意思是[my-in-links] of myself;像my-in-links这样的原语立即返回答案,而不必检查每个链接。

同样,你有any? links with [end1 = Self_Agent and End2 = Other_Agent]。同样,使用with表示如果满足条件,则必须检查每个链接。相反,请写[out-link-neighbor? Other_Agent] of Self_Agentout-link-neighbor?可以直接检查链接的存在,而无需扫描每个链接。

我有一个预感,消除不必要的使用with将解决您的性能问题。但是,一个额外的,不太重要的笔记:

为什么foreach sort sss?为什么不只是ask sss?是否有某些原因需要按排序顺序运行? askforeachsort?更快。

+0

谢谢,是的,我已经使用这个扩展,目前我的模拟40000蜱(50-100代理人口的10生命),其中包括个人的社会互动需要15-20分钟的win7, 32位,2GB RAM,2.4Ghz CPU)。最多的CPU被3个程序使用,一个用于检查哪个补丁没有任何代理在其中,并将该补丁的属性移动到社区级别,即设置代理人气度的那个,这是每个人的关系值之和-link-neighbor和一个检查有多少代理人住在一个​​补丁中并要求最老的儿子搬出去的人。 – Marzy

+0

如果您发布了使用大多数运行时的过程的代码,我可能会发现加速机会。 (或不,不可能提前知道) –

+0

是的,你是对的:)我会改变代码,现在改变[移出和设置人气]功能,我提到的问题在很大程度上提高了性能:) – Marzy

1

只是为了总结了我在改变定向链接,这让很多之后的麻烦无向那些首先做了结果,所以我还是会使用定向链接:

这是代码我已经使用:

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 

随着改正塞特建议我认为有更多的联系比拥有更复杂的计算,以找到合适的无向链接(这里称为友谊)