私はスポーツリーグのスケジューラーを作成しようとしています。各スロットを効率的に埋めるのに役立つアルゴリズムを特定できません。
スケジュールを作成するためのサンプルデータは次のようになります。
コンボテーブル(45のコンボを含む)
ID
Team1ID
Team2ID
bitAssigned
スケジュールテーブル(45のタイムスロットを含む)
scheduleID
homeTeamID
awayTeamID
ゲーム日付
ゲームの時間
現在、私の既存の手順は、スロットの約90%を占め、上記のルールに基づいて、スケジュールの競合のためにスロットの10%を空にします。
日付/時刻の昇順でスケジュールテーブルをループします。
最初のスロットは土曜日の午前8時です。
まだスケジュールされていないチームのリストをクエリします。次に、それらのチームの可能な組み合わせの配列を作成します。次に、その配列を使用して、まだスケジュールされていない組み合わせから組み合わせテーブルから1つのランダムなレコードを取り出し、それらのチームをスケジュールに配置します。次に、その組み合わせを使用するように設定します。
ループを何度も繰り返し、使用可能なチームのリストが小さくなるたびに、結果として配列も小さくなります。
いくつかの日はうまく行き、他の日に私の最後の最後の2つの残りのチームは前の週にすでにプレーしたので、それらは再びスケジュールに追加されません。
まだ試していないのは、競合する日を「リセット」して、もう一度試し、より良い配置が得られるかどうかを確認することだけです。
誰か提案はありますか?
これが私が自分で発明したアルゴリズムです。私はそれがすでに存在するのか、実際にラウンドロビン実装であるのかわかりません:
1 4 1 5 1 6 1 3 1 2
2 5 4 6 5 3 6 2 3 4
3 6 2 3 4 2 5 4 6 5
基本的にあなたは
常に1を同じ位置に保ち、残りを回転させます。
そうすれば、常にユニークな試合のスケジュールを取得できます。これは非常に簡単に実装でき、任意の数の対戦相手でも、均等または均等にスケーリングできます。対戦相手の数が不均一な場合は、チームを1の位置に配置しないでください。彼らはフリーラウンドを持っています。
逆にやっていると思います。 しないでくださいスケジュールテーブルから始め、テーブル/配列/すべてのゲームの組み合わせ(45ゲーム)から始めます。そこから、チームが1日1回だけプレイすることに基づいて、ゲームを1日に割り当てるのは簡単なプロセスです。また、対戦は1回しか発生しないため(チームAはチームBを1回しかプレイしません)、対戦がまだ発生していないことを確認するだけで済むため、スケジュールは簡単です(エントリはそのように「一意」です)。
以下の10チームのシングルラウンドロビンスケジュールを生成しました。約3分かかりました。
スケジュール情報:
10チーム-1ラウンドロビン(最初の6週間のみが表示されます)
シーズン開始日1/6/15-終了日3/5/15
毎週火曜日2試合、毎週木曜日3試合、毎週5試合スキップ日なし
旧式のHoneywellメインフレームコンピューターを使用して、わずか3年弱でこのすべてをまとめました。スケジューリングソフトウェアがデバッグされると、メインフレームコンピューターが何百万もの順列と組み合わせを検索して、探していた4〜22チームのバランスのとれたパターンを計算して作成するのに何時間もかかりました。
10 Team Division Schedule DATE 12/20/14
DATE DAY TIME LOCATION GM HOME vs VISITOR
Jan 6 Tue 6:00pm Field #1 1 # 1 vs #10
Jan 6 Tue 6:00pm Field #2 1 # 2 vs # 9
Jan 8 Thu 6:30pm Field #3 1 # 3 vs # 8
Jan 8 Thu 6:30pm Field #4 1 # 4 vs # 7
Jan 8 Thu 6:30pm Field #5 1 # 5 vs # 6
Jan 13 Tue 6:00pm Field #1 2 # 6 vs # 3
Jan 13 Tue 6:00pm Field #2 2 #10 vs # 8
Jan 15 Thu 6:30pm Field #3 2 # 7 vs # 2
Jan 15 Thu 6:30pm Field #4 2 # 9 vs # 1
Jan 15 Thu 6:30pm Field #5 2 # 4 vs # 5
Jan 20 Tue 6:00pm Field #1 3 # 7 vs # 9
Jan 20 Tue 6:00pm Field #2 3 # 5 vs # 2
Jan 22 Thu 6:30pm Field #3 3 # 6 vs #10
Jan 22 Thu 6:30pm Field #4 3 # 3 vs # 4
Jan 22 Thu 6:30pm Field #5 3 # 8 vs # 1
Jan 27 Tue 6:00pm Field #1 4 # 9 vs # 5
Jan 27 Tue 6:00pm Field #2 4 # 1 vs # 7
Jan 29 Thu 6:30pm Field #3 4 # 2 vs # 3
Jan 29 Thu 6:30pm Field #4 4 # 8 vs # 6
Jan 29 Thu 6:30pm Field #5 4 #10 vs # 4
Feb 3 Tue 6:00pm Field #1 5 # 4 vs # 8
Feb 3 Tue 6:00pm Field #2 5 # 7 vs # 5
Feb 5 Thu 6:30pm Field #3 5 # 1 vs # 6
Feb 5 Thu 6:30pm Field #4 5 #10 vs # 2
Feb 5 Thu 6:30pm Field #5 5 # 3 vs # 9
Feb 10 Tue 6:00pm Field #1 6 # 3 vs # 7
Feb 10 Tue 6:00pm Field #2 6 # 6 vs # 4
Feb 12 Thu 6:30pm Field #3 6 # 5 vs # 1
Feb 12 Thu 6:30pm Field #4 6 # 9 vs #10
Feb 12 Thu 6:30pm Field #5 6 # 8 vs # 2
数百または数千の異なるタイプのリーグ、スポーツ、および潜在的な状況に関連する全体的なスケジューリング問題を解決するアルゴリズムはありません。この問題を解決するために行ったのは、スケジュールを計算するために別のアプローチを取ることでした。それは、適切なラウンドロビンチームのペア(マッチアップ)を決定するための非常に複雑な数学から始まりますが、それはほんの始まりにすぎません。他の部分は、公開して配布できる有用なバランスの取れたスケジュールを作成するために必要です。プレーヤー、コーチ、保護者などは、すべて知っている必要があります彼らが誰をプレイしているか;しかし彼らがプレイしている場所; 彼らがプレイしている時間; 自宅または訪問者の場合;多くのリーグではゲーム番号です。
これがあなたや他の人たちが私たちが理解するのに3年かかった理由を理解するのに役立つことを願っています。