0

語境如何在python

我寫的AI Python中確定的兩個玩家的遊戲寫的AI功能與超時。我希望編寫一個函數,它將超時值作爲其參數之一,並在超時後不久返回一個移動。該函數搜索(negamax或類似),直到超時結束,然後返回它可以找到的最佳移動。

規格

  • 該函數返回一個有效的舉措無論多麼或當它導致返回。
  • 該功能可能會在超時後返回一點,只要這對用戶不明顯(〜100ms)即可。
  • 如果在pygame事件隊列上放置了自定義AI_INTERRUPT事件,則該函數應該返回。 (這是爲了讓不耐煩的用戶可以強制電腦播放)。

建議實施

我想我有一個如何實現這一點的想法,但我發現了很多矛盾的意見的在線(多爲問題不大,因爲這一個相同)。我也擔心我是在過度設計事物。因此,我在問這個實施建議是否合理,或者您是否推薦其他建議。

我正在考慮將我的AI算法寫成一個連續產生更好動作的生成器。收益率之間的時間延遲可能很長,但第一個收益率幾乎是立即的。

然後,我會在一個子進程中調用這個生成器,並讓它將yield值送入一個管道。

  • 輪詢管:然後

    主要過程將在一個循環中運行。如果已經產生了新的值,則將其存儲。

  • 檢查時間。如果超時已超過,請返回最新值。
  • 檢查AI_INTERRUPT事件,如果找到,返回最新值。
  • 處理爲必要

我使用Python 3 pygame的其他pygame的事件。

+0

這是功課嗎? – 2013-03-10 15:25:33

+0

@PrincessOftheUniverse不,這是一個業餘愛好項目。 – 2013-03-10 15:26:36

回答

1

你可以使用一個timed-out thread包裹你的negamax方法。

該方法將使用目前爲止的最優解決方案更新共享數據結構。共享數據結構可以簡單地作爲您傳遞給negamax方法的列表。發生超時時,調用者將從列表中讀取解決方案。

+0

謝謝,這很有幫助。在這個問題上實現超時線程的幾種方法中的哪一種是你推薦的?似乎沒有任何共識。這比我的基於多處理的解決方案更好? – 2013-03-10 18:46:36

+1

調用進程需要更多時間並消耗更多系統資源。線程更輕,更快,與調用者更容易分享日期,但不提供真正的多任務(使用Python)。如果您在任何給定時間運行單個計算,請使用線程。我會用包裝材料去接受答案。 – 2013-03-10 19:36:06

0

,使用:

def foo(duration): 
    # time as MS 
    start = pygame.time.get_ticks() 
    while True: 
     now = pygame.time.get_ticks() 
     if now - start >= duration: 
      return 

     # do stuff 

或者其中一種兩個功能:

pygame.time.waitpygame.time.delay

你可以做一個稍微複雜些的版本,這仍然讓你的主循環繼續。但是,如果您的顯示屏在短時間內沒有更新,可能會過度殺傷。

+0

我擔心的是,每次「做東西」都會花費太長時間。雖然我的想法更加複雜,但它會更接近持續時間的結束。我不想使用等待或延遲,因爲這個想法不僅僅是爲了浪費時間(這是他們所做的,用於幀速率控制等)。 – 2013-03-10 18:42:39

+0

如果你無法將'做東西'分成塊,那麼你可以使用線程。 (這可以讓你使用阻塞函數,而不會破壞主線程) – ninMonkey 2013-03-11 00:54:31