0

環境

Python で決定論的な 2 プレーヤー ゲームの AI を作成しています。パラメータの 1 つとしてタイムアウト値を取り、タイムアウトの直後に移動を返す関数を書きたいと考えています。この関数は、タイムアウトになるまで検索 (ネガマックスまたは同様のもの) を実行し、見つけた最良の動きを返します。

仕様

  • 関数は、どのように、またはいつ返されるかに関係なく、有効な動きを返す必要があります。
  • ユーザーが気付かない限り (~100 ミリ秒)、関数はタイムアウトの少し後に戻る場合があります。
  • カスタム AI_INTERRUPT イベントが pygame イベント キューに配置された場合、関数は返されます。(これは、せっかちなユーザーがコンピュータを強制的にプレイできるようにするためです)。

提案された実装

私はこれを実装する方法についての考えを持っていると思いますが、オンラインで多くの相反するアドバイスを見つけました (そして、主にこれとまったく同じではない問題について)。私はまた、物事を過剰に設計していることも懸念しています。したがって、この実装の提案が賢明なものであるかどうか、または何か他のものを推奨するかどうかを尋ねています.

AI アルゴリズムをジェネレーターとして記述して、より良い動きを連続して生成することを検討しています。利回り間の時間遅延は長くなる可能性がありますが、最初の利回りはほぼ即時になります。

次に、サブプロセスでこのジェネレーターを呼び出し、yield 値をパイプにフィードします。

次に、メイン プロセスは次のループで実行されます。

  • パイプをポーリングします。新しい値が生成された場合は、それが格納されます。
  • 時間を確認してください。タイムアウトを超えた場合は、最新の値を返します。
  • AI_INTERRUPT イベントをチェックし、見つかった場合は最新の値を返します。
  • 必要に応じて他の pygame イベントを処理する

私はpygameでPython 3を使用しています。

4

3 に答える 3

1

negamax メソッドをラップするタイムアウト スレッドを使用できます。

このメソッドは、これまでの最適解で共有データ構造を更新します。共有データ構造は、negamax メソッドに渡す単純なリストにすることができます。タイムアウトが発生すると、呼び出し元はリストからソリューションを読み取ります。

于 2013-03-10T15:24:16.230 に答える
0

すでに pygame を使用しているため、次のいずれかを使用します。

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

または、次の 2 つの関数のいずれか:

pygame.time.waitまたはpygame.time.delay

もう少し複雑なバージョンを作成して、メイン ループを継続させることもできます。ただし、ディスプレイが短時間で更新されない場合は、やり過ぎかもしれません。

于 2013-03-10T16:41:49.337 に答える
0

UNIX で作業している場合は、シグナル lib を使用してタイムアウト機能を実装できます:終了までに時間がかかりすぎる場合のタイムアウト機能

于 2013-03-10T15:25:19.393 に答える