web-dev-qa-db-ja.com

最適なスケジューリングアルゴリズム

プログラミングに問題のあるスケジューリングプログラムを書いています。いくつかのイベントがあり、それぞれに複数の会議時間があります。各イベントの複数の会議時間の1つを使用して、各スケジュールに特定のイベントが1回だけ含まれるように、会議時間の配置を見つける必要があります。

明らかにブルートフォースを使用することはできますが、それが最善の解決策になることはめったにありません。これは比較的基本的なコンピュータサイエンスの問題だと思います。コンピュータサイエンスのクラスを受講できるようになったら、この問題について学びます。それまでの間、私はこれについて読むことができるリンク、または私がグーグルできる名前さえも好むでしょう。

26
stillinbeta

私はあなたが遺伝的アルゴリズムを使うべきだと思います:

11
Betamoo

これを行うにはいくつかの方法があります

1つのアプローチは、制約プログラミングを行うことです。これは、feanorによって提案された動的計画法の特殊なケースです。バウンディングとブランチングを実行できる専用のライブラリを使用するのは大変なことです。 (Googleは「gecode」または「comet-online」でライブラリを検索します)

数学的に傾いている場合は、整数計画法を使用して問題を解決することもできます。ここでの基本的な考え方は、問題を一連の線形不等式に変換することです。 (多くの実際の例を見つけるための「整数計画スケジューリング」のためのグーグルと有用なライブラリのための「そろばんCOIN-OR」のためのグーグル)

私の推測では、制約プログラミングが最も簡単なアプローチですが、ある時点で問題に実変数を含めたい場合は整数計画法が役立ちます。

5
nielsle

問題の説明は完全には明確ではありませんが、重複するイベントがないスケジュールを見つけることだけを試みている場合、これは単純な 2部マッチング 問題です。

イベントと時間の2つのノードセットがあります。各イベントから可能な各会議時間までエッジを描きます。次に、 拡張パス を使用して、マッチング(ノード間の可能な最大のエッジセット)を効率的に構築できます。これは、2部グラフを常に同等のフローグラフに変換できるために機能します。

これを行うコードの例は [〜#〜] bim [〜#〜] です。 [〜#〜] goblin [〜#〜]NetworkX などの標準的なグラフ作成ライブラリにも2部マッチングの実装があります。

3
ire_and_curses

これは、 動的計画法 ソリューション、特に 間隔スケジューリング 問題に似たものの良い候補になる可能性があるように思われます。

特にインターバルスケジューリング問題については、いくつかのビジュアルがあります ここ これにより、概念がより明確になる可能性があります。 ここ は、動的計画法全体に関する優れたチュートリアルです。

2
Feanor