病院の看護師にシフトを最適に割り当てるアプリケーションを開発しています。これは離散変数を使用した線形計画法の問題であり、したがっておそらく NP 困難であると思います。
- 毎日、各看護師 (約 15 ~ 20 歳) にシフトが割り当てられます。
- 少数 (約 6) の異なるシフトがあります。
- 1 日に関して、または従業員に関して、かなりの数の制約と最適化基準があります。
- 毎日、各シフトに割り当てられる最小人数が必要です
- 一部のシフトは重複しているため、中間シフトを行っている人がいる場合は、早いシフトの人が 1 人少なくても問題ありません。
- 早いシフトを好む人もいれば、遅いシフトを好む人もいますが、より高いシフト勤務賃金を得るには、最小限のシフト変更が必要です。
- ある日は遅番、翌日は早番で働くことは認められていません(最低休憩時間の規定による)。
- 割り当てられた週の勤務時間のミーティング (人によって異なります)
- ...
したがって、基本的に、それぞれが少数の離散値を取ることができる多数の (aout 20*30 = 600) 変数があります。
現在、私の計画は、修正されたMin-conflicts アルゴリズムを使用することです
- ランダムな割り当てから始める
- 一人一人、毎日のためのフィットネス機能を持っています
- 最悪のフィットネス値を持つ人または日を選択します
- その日/人の割り当ての 1 つをランダムに選択し、最適なフィットネス値をもたらす値に設定します
- 繰り返しの最大回数に達するか、選択した日/人に改善が見られなくなるまで繰り返します
より良いアイデアはありますか?局所最適に陥ってしまうのではないかと少し心配です。何らかの形式のシミュレーテッド アニーリングを使用する必要がありますか? それとも、一度に 1 つの変数を変更するだけでなく、具体的には 2 人の間でシフトを切り替えること (現在の手動アルゴリズムの主要コンポーネント) を検討しますか? 変更される可能性があるため、現在の制約に合わせてアルゴリズムを調整することは避けたいと思います。
編集:厳密に最適なソリューションを見つける必要はありません。名簿は現在手動で作成されており、ほとんどの場合、結果はかなり最適化されていないと確信しています-それを打ち負かすのは難しいことではありません. 短期的な調整と手動によるオーバーライドも間違いなく必要ですが、これが問題になるとは思いません。過去の割り当てと手動割り当てを「修正済み」としてマークすると、実際には、ソリューション スペースが減り、タスクが単純化されます。