web-dev-qa-db-ja.com

動的スケジューリングアルゴリズム

最近、私はスケジューリング問題、あるいはむしろ動的スケジューリング問題に興味を持ちました。問題は、アプリケーションで、約50〜100個の電子メールボックスを定期的にポーリングする、ある種のレイヤーを開発したいということです。 IMAP/POP3サーバーを制御できず、カスタマイズや変更ができないため、受信メールに関する何らかのイベントを受信します。これが私の問題の核心です。フェッチして処理するメールがあるかどうかを確認するために、これらの電子メールボックスにクエリを実行する必要があります。重要なのは、これらのメールボックスは、時間単位での受信メール数の比率が異なるため、最適化された方法でチェックしたいと思います。 g。私がもっと頻繁にチェックしたい最もストレスの多いメールボックスと、あまり人気がないメールボックスはめったにチェックしません。

私は自分でいくつかの高レベルの調査を行い、以下を使用することを考えていました。

  • 優先キュー
  • 遺伝的アルゴリズム
  • 履歴データに基づいて受信データを予測する(ある種の回帰?)

しかし、私は立ち往生しています-遺伝的アルゴリズムが私にとって最も魅力的であるように思われるので、私が最良の解決策を選択しているのかどうかはわかりませんが、いくつか疑問があります。私のゲノムはジョブの時間間隔のセットになり(単一の電子メールボックスをチェック)、最初はランダムな値で初期化でき、適応度関数は前の反復の結果の統計(チェックのメールボックス内の実際のメールの数)を使用できます、それらの電子メールの処理にかかる時間)。しかし、このアプローチは非常にゆっくりと「進化」するので、十分に良いのだろうかと思います。

私は比較的単純なワークフローを設計しています:

  1. 動的スケジューリングを使用してメールボックスを定期的にチェックする
  2. イベントをキューに入れる
  3. ワーカーは特定のメールボックスでイベントを受信し、メールを処理します
  4. バッチサイズ、それを処理する合計時間に関する履歴エントリがDBに挿入されます。
  5. スケジューラーは、履歴データに基づいて優先順位/時間間隔を調整します。

この種の問題について何か経験はありますか? CSPまたはジョブショップスケジューリング問題として扱う必要がありますか?どんな洞察にも感謝します!

2
Apple Pie

もっと簡単なアプローチで十分かもしれないと思います。まず、メールボックスをチェックするまでの最小待機時間と最大待機時間を5分と1時間のように決定します。

メールボックスごとに10分の待機期間から始めます。新着メールが見つかった場合は時間を50%短縮し、メールが見つからなかった場合は時間を10%増やします。そして、時間が許容範囲内にあることを確認してください。

このアルゴリズムは、新しいデータにすばやく応答し、それらのソースをより頻繁にチェックし、データを処理する必要がないときに負荷をゆっくりと減らします。

目的の動作に一致するように、増加/減少のパーセンテージを調整できます。

1
Kwebble