簡體   English   中英

成對計算的高效算法

[英]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) ,因此在執行這些操作時,這些對之間的后續計算將變得多余對於代理a2a3a5

一種改進的算法將是按照上述示例在兩個維度上(即沿着代理自身以及沿着其各自的伙伴)以升序對輸入結構進行排序,因此對於每個代理(例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM