我已经更改了代码的很多部分以提高性能,现在以下是我代码中最耗时的过程之一:
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
那么我认为正确的问题是如何找到能够以最有效的方式看到呼叫代理的座席?使用这种方法,我可以看到大多数可以见证的活动目击者,如果我使用半径,这可能高达90个代理人!
答案 0 :(得分:1)
我很确定你的问题在这里:
member? Picking_Agent agents in-cone vision 100
这是一种非常缓慢的方法,用于确定一个代理人是否在另一个代理人的视觉锥体中。为什么?因为它包含了这个子表达式:
agents in-cone vision 100
计算锥体中所有代理的集合。这样做非常昂贵; in-cone
进行了大量的距离和角度计算。但你不需要知道锥体中所有这些代理人是谁!你已经有了一个代理人,你只需要知道一个代理人是否在锥形区域内。
您应该避免in-cone
并使用distance
和towards
这样的原语直接计算您的是或否答案。我建议将这个计算放在一个单独的程序中,并在继续之前彻底测试该程序,以确保你做对了。它不需要很多很多代码,但它需要的代码是正确的。 (可能语言应该包含一个原语,而不是让你自己写。)