【问题标题】:How can I improve following function in NetLogo?如何改进 NetLogo 中的以下功能?
【发布时间】:2013-11-27 12:46:45
【问题描述】:

我已经更改了我的代码的许多部分以提高性能,现在以下是我的代码中最耗时的过程之一:

to deduct [Picking_Agent C]
  If label_ = "Common Food Source"   
    [

      Let witnesses_From_Other_Village other (agents in-radius vision with [Belongs_to !=  [Belongs_to] of Picking_Agent and member? Picking_Agent agents in-cone vision  100 ])
      if any? witnesses_From_Other_Village
        [Let Penalty (0 - (C / count witnesses_From_Other_Village * 10))
          ask witnesses_From_Other_Village 
          [
            Update_link_Values  Picking_Agent Penalty
          ]
        ]
    ]

end




to Update_link_Values  [Other_Agent Value]

  if self != Other_Agent

  [  ask Other_Agent [set popularity popularity + Value]
     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 ]   ] ;IF already has a link 
         [create-link-to Other_Agent [set Value-Of-The-Relationship Value-Of-The-Relationship + Value set Frequency Frequency + 1 hide-link]   ] ;If they meet for the first time

  ]

end

我不得不使用条件if self != Other_Agent 只是为了确保我的实验不会以错误“代理不能与自身建立链接”而结束,即使我试图确保代理要求其他代理更新链接并且永远不会本身就是!!

Name                               Calls Incl T(ms) Excl T(ms) Excl/calls
DAILY-TASK-WITH-LEADER           4598209    271.667 169791.762      0.037
DEDUCT                            248639 168314.428 104789.036      0.421
....

更新: 如果性能问题在Picking_Agent agents in-cone vision 100 那么我认为正确的问题是如何找到能够以最有效的方式看到呼叫代理的代理?使用这种方法,我有多达 10 个目击者可以见证大多数活动,如果我使用半径内,这可能高达 90 个代理!

【问题讨论】:

    标签: performance optimization netlogo


    【解决方案1】:

    我很确定你的问题在这里:

    member? Picking_Agent agents in-cone vision  100
    

    这是确定一个特工是否在另一个特工的视锥中的一种非常缓慢的方法。为什么?因为它包含这个子表达式:

    agents in-cone vision 100
    

    计算圆锥中所有代理的集合。这样做非常昂贵; in-cone 进行了大量的距离和角度计算。但是您不需要知道锥体中的所有特工是谁!您已经有一个代理,您只需要知道该代理是否在锥体中。

    您应该避免使用in-cone,并使用distancetowards 等原语直接计算您的是或否答案。我建议将该计算放在一个单独的过程中,并单独彻底地测试该过程,以确保在继续之前你做对了。它不需要太多 代码,但它需要的代码很难正确处理。 (可能该语言应该包含一个执行此操作的原语,而不是让您自己编写。)

    【讨论】:

    • 谢谢,我需要的是找出谁可以看到这个代理在做他的活动,就像目睹其他代理的活动一样,半径内包括所有代理,甚至那些不看的人(并且增加链接疯了),我有一些不同的任务可以被其他代理目睹,如果我找到一个好的方法来做这件事,我想我会解决大部分的性能问题。
    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多