カレンダー/計画アルゴリズム


24

問題に直面しているので、どのようにアプローチしたらよいかわかりません。従業員のカレンダーを作成する必要があります。各従業員には特定の仕事上の制約があります(個人的なもの、一般的なもの)

私が取り組んでいるもの:

  • 医者がいます
  • 各医師は週5日勤務する必要があります。
  • 各医師は週に1晩働く必要があります
  • 各医師は、他の医師と比較して(または可能な限り近く)夜同じ時間働く必要があります。
  • 各医師は、他の医師と同等の(または可能な限り近い)木曜日の夜と日曜日の夜に同量の仕事をしなければなりません。
  • 一部の医師は特定の日/夜に作業できない(ユーザーによる入力)
  • 一部の医師は、特定の日/夜に作業したい(ユーザーによる入力)
  • 一部の医師は、特定の日/夜に仕事をしたくない(ユーザーによる入力)

問題のユーザーはカレンダーを扱っている人です。すべての制約に従うカレンダーを自動的に生成するソリューションを構築しようとしています。解決策は、各医師に「医師を追加」と「制約を追加」を入力し、次に「カレンダーを生成」ボタンを入力するだけの大きな設定です。それはユーザーにとって本当に基本的なものです。

私の問題 :

実際の計画をどのように生成するかわからない。ニューラルネットワークや遺伝的アルゴリズムなどについて読んでいるが、それらはすべて正しい解決策のように思えるが、実際にはそうではない。

GAを見ると、与えられた母集団(私の問題)の解を見つけるように作られていますが、開始母集団は与えられた制約のセットに既に従わなければなりません。その場合、私の最初の人口はすでに解決策です。「最適化」する必要はありません。1人の人が月曜日の3晩連続して働くことは問題ではありません。実際に正しい場合、他の人が同じ量で働く場合は、他の人もある時点で月曜日の3日間働くことは問題ありません。私の問題はすでにGAの開始点で解決されているので、GAは私にとって「高度」であると思うようになります。

しかし、再び、GAは本当にこれのために作られたように見えるので、私はそれを正しく理解していないかもしれませんか?

とにかく、GA(またはニューラルネットワークなど)を使用したことはないので、そのような学習曲線を作成する前に、正しいアプローチを選択してください。

私の質問 :

私のような問題に対する良いアプローチ/アルゴリズム/テクニックは何だと思いますか?ガス?ニューラルネットワーク?まったく違う何か?

私はすべての耳であり、必要に応じて詳細を開いていますが、私は自分自身をかなり明確にしたと思います:)


22
おそらく、看護師名簿問題に関する文献を見る価値がありますen.wikipedia.org/wiki/Nurse_scheduling_problem
ルノーM.

このような便利な用語!ヘヘ、あなたのリンクに感謝;)
ギル砂

8
私はこの分野の専門家ではありませんが、探しているのが開発の時間を節約できるアプローチである場合、問題を混合整数計画問題(en.wikipedia)としてモデル化する価値があるかもしれません。 org / wiki / Linear_programming#Integer_unknowns)、それをMIPソルバーに入力するか、制約プログラミング問題として入力してから、ORツール(developers.google.com/optimization)などのCPソルバーに入力します。このようにあなたがしなければならないのはあなたの問題を表現することです。
ルノーM.

3
線形計画法は、最適なソリューションを導き出すことが保証されています!
recursion.ninja

2
@RenaudM。この驚くほど有用な数学の分野を理解しているプロのプログラマーが少ないのは残念です。誰かがAIフィールドの側からシミュレーテッドアニーリングや遺伝的アルゴリズムを提案するたびに、私の腸の応答は次のとおりです。おそらく、より良い線形計画の最適化としてモデル化することができます
recursion.ninja

回答:


14

ここでは、遺伝的アルゴリズムとニューラルネットワークは適していません。それらは、問題に対する十分な近似解を見つけるためのメタヒューリスティックです。特に、両方とも、候補ソリューションを評価するためのコスト関数を見つける必要があります。このようなコスト関数を取得したら、このコストを最適化するアルゴリズムを手動で簡単に考え出すことができます。

これは重要な考え方です。2つのスケジュールがある場合、スケジュールAとスケジュールBのどちらが「良い」かを判断する方法が必要です。さまざまな基準をリストしましたが、それらがどのように関連しているかは明確ではありません。1つの基準を満たさないと、ソリューション全体が失敗しますか?または、部分的に制約に失敗すると、他の制約よりも悪い解決策になりますか?

最も基本的なレベルでは、週を個別のタイムスロットに分割し、すべてのスロットとドクターの組み合わせをブルートフォースできます。ただし、ハード障害の制約を使用して、この検索スペースをより管理しやすいサイズに減らすことができます。勤務時間と夜勤の制限は、このような検索スペースの制限に適しているようです。その後、何百もの候補ソリューションが残ります。

最適な候補ソリューションを選択するには、それらをランク付けする必要があります。これは、1つのソフト制約が他のすべてのソフト制約よりも明確に優先されている場合、たとえば医師が特定のシフトを働けない場合、そのシフトを働きたくない医師よりも重要である場合、かなり簡単です。しかし、これらのルールをあなたのために決めることはできません。それは管理上の決定です。2つのソフト制約の優先順位が明確でない場合はさらに困難です。この場合、1つのメトリックで2つの制約の重要性を統一する何らかのコスト関数を考え出す必要があります。


おそらく、いくつかの優先順位付けされた基準に従って、空白のタイムテーブルを埋める貪欲なアルゴリズムを構築します。これは最適なソリューションではないかもしれませんが、「最適」が実際に何を意味するかについて哲学するよりもはるかに簡単です。

最初のステップとして、週末の夜勤を埋めることができます。また、週末の夜勤を最も長く行っていない医師を選択し、「そこでは仕事ができません」というユーザーの希望も考慮します。 。これらの希望は週ごとであり、継続的ではないと仮定すると、これは週末に1週間働くことができない医師が来週選ばれることを意味します。

他の夜にも同様の手順を使用できます。ユーザーの希望を尊重しようとした後、最も長い時間夜勤をしていない人に応じて医師を記入します。この手順は、3番目の種類の時間帯である日シフトについても同様に繰り返されます。2人のユーザーの希望を調整できない場合、ユーザーの希望が付与された頻度を追跡し、付与された希望がより少ない医師に優先順位を付けることができます。

残念ながら、私はこのシステムをゲームするいくつかの方法を見ることができます。例えば、医者が週末の夜勤で働くために選ばれたが、「そこで働けない」要求を出す場合、彼らの選択は1週間遅れます。同僚を犠牲にして週末の夜勤の頻度。却下されたリクエストの数を調べるウィッシュ解決手順が実装されている場合、ユーザーはいくつかの不可能なリクエストを入力して、通過したいリクエストをブーストできます。ただし、誠意(および医師が互いのシフトを交換できる柔軟性)を前提とすると、このようなアルゴリズムは十分なソリューションをもたらすはずです。


あなたの答えをありがとう、私は同僚ともう少し詳しく調べます:)あなたにもっと情報を与えるために:はい、私たちはほとんどのソリューション/基準をランク付けすることができ、他のものより優先するものがあるかどうかを決定できます。また、彼らは今、誠意を持って真剣に取り組んでいます。彼らはそれを手でドンドンし、「一日中働けない」を使いすぎないでください。彼らが本当に手作業でやっているので、彼らが今どのようにこれを機能させているのかはとても素晴らしいです。「実行可能な」ソリューションは、すでに彼らに世界を意味し、そしてそれらをするとき働くことができる人の時間ブレーンストーミングのLOT保存されますので、
ギル・サンド

5
@Zil現在スケジュールを作成している人々は、おそらくすでに非公式のアルゴリズムを使用しています。あなたは彼らと話をして、彼らの決定プロセスを理解しようとすることができ、それを正式にし、実行することができます。これは、ニューラルネットワークをセットアップしてトレーニングするよりもはるかに簡単です。
アモン

それが私たちの最初のステップです:p彼らとのミーティングはすでにセットアップされています すべてのあなたの助けをありがとう:)
ギル・サンド

3
このユースケースでは、遺伝的アルゴリズムは一貫してタブー検索およびシミュレーテッドアニーリングよりも劣っています。これは、研究コンペ国際ナースロスタリングコンペで証明されています。(もちろん、貪欲なアルゴリズムよりも優れています。)
ジェフリーデスメット

12

シミュレーテッドアニーリングを使用できます。

私は最初の仕事を始める前にそのようなことをしました-https ://vimeo.com/20610875を参照してください(デモは2:50から始まり、アルゴリズムは6:15から説明されています)。

シミュレーテッドアニーリングは遺伝的アルゴリズムの一種であり、理論的には適切ではなかったかもしれません(@amon が答え述べているように)が、実際には非常にうまく機能し、あなたと同じユースケースでした。

ソースコードは入手可能(C#)ですが、機能しますが、恐ろしいことですが、数年前のことであり、独断的であったため、保守性については知りませんでした。しかし、非常に良い結果が得られました。

とにかく簡単に機能する方法:

  • 1生成を可能に起点として時間スケジュール(それは非常に良いが、物理的に不可能であってもよいです)。遺伝的アルゴリズムはこの時点では必要ありません-あなたが見つけることができる最初の解決策にあなたの方法を総当たりすることができます。バックトラッキングを使用しました。計算の複雑さは、毎日のロータを個別に解決することで克服できます。解決策がまったくない場合(場合によって)、この時点でそれを検出します。

  • ソリューションのプールを作成します-たとえば、このエントリーレベルのソリューションのコピーを100個作成して開始します。

  • すべてのソリューションをランダムに変更します。医師同士でシフトを交換し、ランダムな医師をシフトから外して、ランダムに利用可能な人を配置します。

  • 各ソリューションを、それがどれほど良いかを決定するフィットネス関数で評価します。ある男は別の男よりも多くの夜を働いていますか?ペナルティポイントを引きます。誰かが月曜日をやりたかったのですが、彼らはしませんか?ペナルティポイントを再度引きます。

  • 20の最高のソリューションを取り上げて、それぞれを5回コピーし、残りの80をそれらで上書きして、次世代に持ち帰ります。適者生存。

  • すすぎ、繰り返します。

数値は明らかに任意です。シナリオに最適な設定を見つけるには、パラメーターをいじる必要がある場合があります。

ソリューションの変更に関しては、シミュレーテッドアニーリングは温度と呼ばれるものを導入します。基本的には、最初はソリューションをかなり激しく変更し(たとえば、一度に10回のシフトスワップを試みてください)、後続の反復で徐々に攻撃性が低下するため、より微調整(ダウンなど)する必要があることを意味します世代ごとにわずか2回の微調整を試みました)。


4
OptaPlanner(旧Drools Planner)とSimulated Annealingを大学の時刻表に使用しました。モデルを宣言します-シフトには時間と医師がいます。フィットネス関数の宣言的ルール-厳しい制約(医師は重複したシフトを取ることはできません)および罰則(アンは月曜日が嫌いです)を記述します。シフトの宣言的(要点)スワップを記述します。OptaPlannerは、開始状態をランダムに作成し(実行不可能な場合があります)、ルールからフィットネス関数を計算し、最適化アルゴリズムに従ってスワップを操作します。アニーリングスケジュールなどのパラメーターを選択および調整できます。
ジェスビンホセ

6

ここには遺伝的アルゴリズムが適用されます。私の学部課程で、同僚の一人があなたの問題と非常によく似た問題について論文を書きました。

Job Shop Schedulingを探すことができます。また、Open Shop SchedulingまたはFlow Shop Schedulingも興味深い出発点になる可能性があります。

完全な解決策を必要としない遺伝的アルゴリズムを使用するには、N個のランダムな候補から始めて、それぞれにフィットネス関数を適用できます。次に例を示します。

  • 最も忙しい医師とあまり忙しくない医師の間で割り当てられた夜の違いは、コスト関数のペナルティです
  • 医師が週に5日以上、または週に1晩以上働く場合は、ペナルティを適用します
  • 各制約など...

N個の候補を生成すると、それらの中最も良いX選択しますが、それらは制約をあまり与えないものです。それらと協力し、いくつかの世代にわたって交配し変異させると、良い解決策になります。

こういったことすべてを話し合ったので、交配よりも突然変異に依存する遺伝的アルゴリズムを使用するたびに、実装がより簡単になり、パフォーマンスがはるかに向上するシミュレーテッドアニーリングを開発できました。遺伝的アルゴリズムのコスト/適合性と突然変異関数は、おそらくシミュレーテッドアニーリングで使用されるものと非常に似ているでしょう。そこから始めて、@ Konrad Morawskiの答えを見てください

Google検索でJob ShopとGAの良い結果が見つかりました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.