[英]Efficient algorithm for pairwise computation
我有一個代理列表a = {a1, a2, a3,..., an}
,其中每個代理可以與零個或多個其他代理配對。 例如,對於n = 6
,我可以有:
a1: a2, a3, a5
a2: a1, a3, a4
a3: a1, a2. a5
a4: a2
a5: a1, a3
a6:
每對彼此交互,並且每個代理都通過該交互獲得一個值(例如,他們可以玩游戲,但是可以在此處抽象出交互的詳細信息)。 我對基於上述給定的成對結構計算和存儲這些交互的結果感興趣 。
顯然,一個幼稚的算法將是遍歷每個代理,然后逐個計算與他的每個交互伙伴的成對交互。 但是,很明顯,這種方法將復制某些(或可能很多)計算。 使用上面的示例:
到我們完成對代理a1
的時間時,我們已經獲得了(a1, a2)
, (a1, a3)
和(a1, a5)
,因此在執行這些操作時,這些對之間的后續計算將變得多余對於代理a2
, a3
和a5
,
一種改進的算法將是按照上述示例在兩個維度上(即沿着代理自身以及沿着其各自的伙伴)以升序對輸入結構進行排序,因此對於每個代理(例如a3
),我們只需要計算該代理( a3
)與“高於”他的代理( a5
)之間的交互,因為我們知道他與“下等”伙伴( (a1, a3)
, (a2, a3)
)之間的交互已經計算的。
我想知道是否有其他更好的算法來解決這個問題? 更好的是,我的意思是在時間和空間上都更有效率。
是的,這嘗試將每個對添加到集合兩次,但是我覺得這可能比有條件的效率更高。 是否有人想嘗試選擇替代方案?
agents = {
'a1': ['a2', 'a3', 'a5'],
'a2': ['a1', 'a3', 'a4'],
'a3': ['a1', 'a2', 'a5'],
'a4': ['a2'],
'a5': ['a1', 'a3'],
'a6': []
}
pairs = {(k,v) for k in agents for v in agents[k]}
這仍然是O(n),因此就效率而言,勝於涉及排序的任何事物
通過使用,您可能會獲得較小的加速
pairs = {(k,v) for k,vs in agents.iteritems() for v in vs}
您可以將座席ID與以下內容進行比較:
agents = {
'a1': ['a2', 'a3', 'a5'],
'a2': ['a1', 'a3', 'a4'],
'a3': ['a1', 'a2', 'a5'],
'a4': ['a2'],
'a5': ['a1', 'a3'],
'a6': []
}
interactions = []
for agent, connections in agents.iteritems():
interactions.extend((agent, connection) for connection in connections if agent < connection)
print interactions
# [('a1', 'a2'), ('a1', 'a3'), ('a1', 'a5'), ('a3', 'a5'), ('a2', 'a3'), ('a2', 'a4')]
Itertools進行救援
>>> from itertools import combinations
>>> agents=['a1','a2','a3','a4','a5']
>>> list(combinations(agents, 2))
[('a1', 'a2'), ('a1', 'a3'), ('a1', 'a4'), ('a1', 'a5'),
('a2', 'a3'), ('a2', 'a4'), ('a2', 'a5'),
('a3', 'a4'), ('a3', 'a5'),
('a4', 'a5')]
>>>
據我了解您的問題,您為什么不考慮2D矩陣? 在第一階段,如果兩個代理可以相互協作,則只需設置相交單元等於1。 在第二階段,只需圍繞矩陣設置一個周期,並僅在具有互連關系(即,單元等於1)的那些代理之間計算一些值。 而不是1,而是一個真實的價值。 因此,在這種情況下,您無需進行多余的計算。 唯一的冗余部分是在矩陣中兩次填充計算值。
根據@gnibbler的回答,我得出以下結論:
agents = {
'a1': ['a2', 'a3', 'a5'],
'a2': ['a1', 'a3', 'a4'],
'a3': ['a1', 'a2', 'a5'],
'a4': ['a2'],
'a5': ['a1', 'a3'],
'a6': []
}
pairs = {tuple(sorted((k,v))) for k in agents for v in agents[k]}
排序仍然是必需的,但僅限於一對。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.