1

排他的なリソースをスケジュールしている複数のユーザーを調整するアプリケーションを実装しようとしています。スケジュール データは、単一のマスター ノードを持つネットワーク上で強力な一貫性を維持する必要があります。スケジュールされたリソースは、会議室から現場の作業員まで、あらゆるものである可能性があります。

会議室で一度に 2 つの会議をスケジュールすることはできず、作業者が同時に 2 つの現場にいることはできないと想定しています。アプリケーションのビジネス ロジックでは、ユーザーがリソースを「オーバーブッキング」することを許可してはなりません。

私が理解できないのは、2 人以上のユーザーが同時にスケジュールに従って操作し、競合が発生した場合、更新の 1 つが中止されるようにデータを表現する方法です。

これまでに見た唯一の解決策は、排他的なリソースごとにタイムスロットを追跡することです。したがって、会議室が 5 分間隔で使用され、午前 9 時から 9 時 30 分に予定されている場合、対応する午前 9 時から 9 時 30 分までの 5 分間の時間枠はすべて TRUE を返し、予定外の時間枠は FALSE または NULL を返します。 . 次に DB トランザクションは、会議室オブジェクトをストアから引き出し、すべてのタイム スロットをチェックし、更新が既存のタイム スロットと競合する場合は中止します。

ただし、これは非常に大きく、非常に速くなるようです。おそらく、ガベージコレクションされる可能性がありますか?また、設計の目標の 1 つは可変粒度をサポートすることです。そのため、一部のオブジェクトは分単位でスケジュールされ、他のオブジェクトは日単位でスケジュールされますが、このデータ設計はそれを十分にサポートしていません。

現在、Python を使用して Google App Engine にこれを実装しようとしていますが、この問題に対するより一般的な解決策を見てみたいと思っています。私がグーグルで思いついたのは、定期的なタスクのスケジューリング、または最適化されたスケジュールを自動的に構築するための 1 回限りの操作を実行するアルゴリズムだけです。

4

2 に答える 2

3

各除外リソースの開始時間と終了時間だけを追跡する必要があります。問題のデータストレージは実際には簡単な部分です.難しい部分は、時間間隔で競合を探すためのクエリを作成することです.

21 時間稼働した後で私のロジックが正しければ、次の疑似コードで会議の競合をチェックする必要があります。

# Set up your proposed meeting
proposed.start = <thursday, 1pm>
proposed.end   = <thursday, 2pm>

# Look for meetings that intersect with or straddle proposed meeting
conflicts = <SELECT * FROM meeting WHERE
             meeting.start BETWEEN proposed.start AND proposed.end OR
             meeting.end   BETWEEN proposed.start AND proposed.end OR
             meeting.start <= proposed.start AND meeting.end >= proposed.end>


if conflicts.length > 0:
   # We have a conflict!
于 2009-10-08T04:00:23.830 に答える
1

学校や大学の時間割 (またはその他の問題) を自動的に最適化するには、次の Java ツールを参照してください。

TimeFinderUniTimeまたはDrools Solver

ユーザー操作の問題は、あなたが説明したほど簡単には解決されません。他の制約違反もある可能性があるためです (タイムテーブルはより複雑になる可能性があります)。

まず、時刻表データにアクセス/変更する時刻表のみを許可します。

次に、タイムテーブルごとに独立したソリューションを作成し、上記の提案されたツールを使用してこのソリューションを最適化します。その後、ソリューションをデータベースに保存し、タイムテーブル担当者がそれらを使用して、スケジュールをさらに最適化したり、他のソリューションと比較したりできます。

于 2010-01-10T12:26:39.250 に答える