您當前的位置:首頁 > 歷史

計算機通訊中兩軍問題,真的是無解嗎?

作者:由 wangyou 發表于 歷史時間:2019-01-28

假設A軍和B軍互相確認了50輪,此時按題主所說,AB雙方對於“對方到底收沒收到進攻訊息”確實早已一目瞭然,但這卻不足以解決兩軍問題。

事實上在第一次訊息來回之後,“對方到底收沒收到進攻訊息”這一知識已經能被雙方所確認:A知道B掌握了進攻的時間,B當然也知道A掌握了進攻的時間。然而這並不足以給予雙方100%的信心來發動進攻,因為A和B還需要掌握更多”關於知識的知識“,比如:

B需要確定A瞭解了”B已經掌握進攻時間“,畢竟如果B的確認訊息丟失,A就不能確認B是否已經得知了進攻時間,也就不會發起進攻。為此,A不得不再次傳送一個關於”確認訊息“的確認訊息給B

再進一步,A還需要得知B已經掌握了自己上一個確認訊息所確認的知識,即“A已瞭解B已經掌握進攻時間“,所以B需要再次對A的關於”確認訊息“的確認訊息進行確認,即再發一個確認給A

如此迴圈確認下去以至無窮。

這裡的關鍵在於後續的確認訊息並非對是對“進攻訊息”本身的確認,而是對於“進攻訊息的確認的確認的確認…“這些更高階知識的確認。一旦開始追求這種高階知識就無法停下來了,畢竟沒有理由只需要得知”關於知識的知識的…(迴圈N次)知識“,卻不需要進一步得知”關於知識的知識的…(迴圈N+1次)知識“。所有這些高階知識加在一起就構成了所謂“共同知識”(common knowledge)。對於兩軍問題而言common knowledge是必要的,而common knowledge這一概念的定義本身就是無窮遞迴的,因此按照上述方案來實現common knowledge就不得不陷入題主所說的“無限迭代過程”。

我們還可以反過來想這個問題:假設雙方透過來回傳送有限個(比如N個)訊息解決了兩軍問題,我們來看這N個訊息序列裡的最後一個,如果它對於”雙方達成進攻時間的共識“並非一個必不可少的訊息,我們就把它從這個序列裡拿走。我們可以反覆進行這個操作直到發現這個序列裡的最後一個訊息是必不可少的,此時我們需要想到通道的不可靠性——如果這最後一個必不可少的訊息丟失了,勢必影響到雙方達成進攻時間的共識,也即使得兩軍問題無法被解決。換句話說,由於通道的不可靠性,這個訊息序列不得不是無限長,而且其中的每個訊息都是必不可少的。

當然這一切都是不可靠的通道惹的禍,如果雙方的通訊通道完全可靠, 那麼A給B發出第一個訊息以後,common knowledge便已經實現,甚至第一個的確認訊息都是不需要的。但在不可靠的通道上,common knowledge無法在透過有限次的訊息確認來實現。

以上都是理論場景,在實際應用中雖然我們無法建立100%可靠的通道,也不會因此而陷入無限迴圈的陷阱,因為我們並不追求common knowledge。仍以兩軍問題為例,可以用一些機制來代替反覆無窮的來回確認,比如我們讓A一次性發送大量同樣的訊息給B,並期待其中的一些訊息可以被B接收;或者讓A持續傳送同樣的訊息給B,直到B返回確認為止,這樣B也能得知A收到了自己的確認——否則A會持續不斷的繼續發下去。這些機制並非完美,無論是一次傳送大量訊息,還是持續不斷髮訊息,都存在所有訊息都丟失的可能——只是機率更小,但也足夠在實際場景中應用起來。

標簽: 確認  訊息  知識  common  knowledge