半自動のスケジューリングアプリケーションを作成しています。既存の予約とリソース要件を考慮すると、新しいイベントをスケジュールできる時間を見つける必要があります。人間のユーザーは結果を評価し、オプションの1つを選択します。複数のイベントのタイムテーブルを最適化する必要がないため、通常のNPハードタイムテーブルの問題ではありません。
システムにはいくつかのリソース(トレーナー、ルーム、設備)があり、それぞれにタイプ(例:フランス語の先生、セミナールーム、プロジェクター...)があります。リソースは、開始時間と終了時間のあるイベントごとに予約されます。
さて、セミナー室のプロジェクターを使用して2時間のフランス語クラスをスケジュールする必要があるとしましょう。必要なリソースタイプごとに少なくとも1つのリソースが利用できる時間はどのくらいですか。
問題のスペースを制限するために、次の90日間は15分間隔で月曜から金曜の午前9時から午後5時だけを検討することもできます。 1000のオーダーのリソースの総数。
どのようにすれば、すべてのリソースを他のすべてのリソースと比較せずにこれを行うことができますか?
これには、1次元の スイープラインアルゴリズム を使用してみます。まず、予約の各リソース部分について、そのステータスが「予約可能」から「予約済み」に、またはその逆に切り替わる時点を見つけます(たとえば、now)。この各時点を含むデータレコードに入れます
それらすべてのレコードのリストを1つ作成し、タイムスタンプで並べ替えます。次に、リソースごとにフラグ "available"のブール配列を作成し、現在の可用性ステータスで初期化します。最後に、「スイープ」が行われます。ソートされたリストを1つのレコードから次のレコードに移動し、関連するリソースのブール配列の可用性状態を、各フラグの状態が「利用可能」になるまで変更します。 1つのレコードをさらに移動してタイムスタンプを取得します。これにより、連続した時間間隔内ですべてのリソースが使用可能である時間がわかります(ここでは、日の境界を超えないように注意してください)。時間間隔が十分に長い場合は、時間間隔の形式で解決策を見つけました。リストの最後に到達するか、十分な間隔が見つかるまでこれを続けます。
おまけとして、これは「15分」と「90日」の制約の有無にかかわらず正常に機能します。
1つは、トレーナー、部屋、設備の3つのテーブルがあると想定しています。あなたは2時間の「ブロックサイズ」を持っています。したがって、生成する最初の一時的な結果セット(この場合はトレーナー用)には、使用可能なトレーナーとそのブロックの開始時間がリストされます。ここには、少なくとも2時間使用可能なトレーナーのみが含まれます。部屋と設備の別の結果セットを作成します。この時点で、3つのカテゴリすべての利用可能な時間を1つのリストにマージし、各間隔にIDを割り当てます。したがって、1日目1時間1は1、1日目1時間2.5は2、3日目3.25は3などです。1つ(結合された)すべてのカテゴリで利用可能なすべての時間のリスト。これらのIDは、それぞれの中間セットに更新されます。したがって、部屋で使用可能な最初のタイムスロットは2、トレーナーの最初は5、機器の最初のスロットは7になる可能性があります。次に、「trainertimeid = roomtimeid and trainertimeid = equipmenttimeid」であるすべてのレコードのセットをクエリします。 。返されるのは、3つのカテゴリすべてで可用性が見つかるすべてのレコードのセットです。