0

ヒューリスティック アルゴリズムを使用して複雑な問題を解決する Web サービスをコーディングする必要があります。アルゴリズムは、POST リクエストで指定された時間が経過する限り実行されます (つまり、timeAllowance=60 を渡すと、ヒューリスティック アルゴリズムが 60 秒後に停止し、見つかった最適なソリューションが返されます)。

すべてのサーバー コアを活用するには、ヒューリスティック アルゴリズムを複数のスレッドで実行する必要があります。アルゴリズムの実行中、これらのメソッドは互いに「通信」する必要があります。各スレッドはヒューリスティック アルゴリズムを実行し、一定の時間が経過すると、スレッドは見つけたソリューションを通信します。許可された時間が経過していない場合は、新しいサイクルが別の初期母集団で実行されます。要約:

  1. 初期集団を生成する (ほとんどランダムに)
  2. ヒューリスティック アルゴリズム スレッドを起動し、それぞれが母集団を入力として受け取ります
  3. 一定の時間が経過したら、スレッドを終了し、スレッドによって検出された新しい集団を「コントローラー エンティティ」に通信します。
  4. ポイント 2 で起動されたスレッドの結果に基づいて、論理的な推論を行い、新しい母集団を生成します。
  5. 許可された時間が経過していない場合は、新しい集団でポイント 2 に戻ります。そうでなければやめる

私の質問は、Spring MVC を使用してコードをどのように構成しますか?

テストとして、サービス メソッドで 10 個のスレッドを起動し、コントローラーからそのメソッドを呼び出すことを試みました (サービスの自動配線)。スレッドが行っていることはすべて、60 秒間スリープすることです。HTTP リクエストがすべてのスレッドが終了するまで (つまり、約 60 秒) 待機することを期待していましたが、実際にはすぐに応答します。

どんな助けでも大歓迎です。

ありがとうございました!

4

2 に答える 2

2

スレッドは必要ありません。スレッド プールが必要です ( ExecutorService)。プールにいくつかのCallable<HeuristicResult>を送信し、返される を待ちますFuture<HeuristicResult>。すべての先物が完了したら、ポイント 4. を実行し、2. に戻ります (ただし、スレッド プールを再利用します)。

最後に、プールをシャットダウンするか、すべてのリクエストに対して再利用します (よりスケーラブル)。

10 個のスレッドを起動しようとしました [...] すべてのスレッドが終了するまで HTTP 要求が待機することを期待していました [...] が、実際にはすぐに応答します。

スレッドの開始は非ブロッキングであり、その瞬間からスレッドは非同期で動作します。作成されたスレッドを呼び出しjoin()て、その終了を待つことができます。しかし、スレッド プールFuture.get()は、はるかにモダンで柔軟です。

于 2012-10-09T17:09:30.043 に答える
0

コードを見なくても、これがすぐに返された理由は、リクエストを処理するスレッドではなく、バックグラウンド スレッドでタスクを開始したためだと思います。

もし私がこのサービスを書いていたら、応答を返す前に 60 秒待たなかったでしょう。バックグラウンドで (サービスを使用して) タスクを開始し、すぐにステータス ページを返します。このページでは、ajax を使用してサーバーをポーリングしてタスクのステータスを確認し、javascript を使用してブラウザにプログレス バーを表示できます。

したがって、プロセスを開始するためのコントローラー メソッドと、ブラウザーがステータスを取得できるようにするためのコントローラー メソッドが必要になります。進行状況を導き出すために開始してからの時間が必要なだけなので、セッションの開始時間と合計許容時間を入力するだけです。次に、経過時間のパーセンテージを計算し、それをブラウザーに返すコントローラー メソッドが必要です。

于 2012-10-09T17:08:46.237 に答える