Hospital bed planning
http://docs.jboss.org/optaplanner/release/latest/optaplanner-docs/html_single/index.html#pas
患者を病室のベッドに割り当てます。患者によっては特別な設備が必要だったり、別性の患者は同じ部屋には割り当てない、など。ディナーパーティーexampleに似てますね。
- PatientAdmissionSchedule : @PlanningSolution
- BedDesignation : @PlanningEntity
- Bed bed : @PlanningVariable(nullable = true)
- AdmissionPart admissionPart
AdmissionPart は患者(Patient)と滞在日程(firstNight,lastNight)と専門分野(Specialism)をラップしたもの。Specialism は Patient の属性じゃないの?と思ったけど、「この期間は外科でこの期間はリハビリ科」みたいな感じかな。AdmissionPart は 固定なので、PlanningVariable は Bed だけ。
今回の新ネタは overconstrained.
http://d.hatena.ne.jp/tokobayashi/20150113 にちょっと書いたけど、「制約が厳しすぎて解が得られない」ような問題の場合、PlanningVariable が null になるのを許容する。@PlanningVariable(nullable = true) とする。
"4.3.4.2. Nullable planning variable" http://docs.jboss.org/optaplanner/release/latest/optaplanner-docs/html_single/index.html#planningVariable
PlanningVariable である Bed が null でもよい。つまり、患者が路頭に迷ってもいいということですね。他の病院にたらい回しでもするのだろう。いちおう Medium score にスコアはしておきます。
rule "assignEveryPatientToABed" when $bedDesignation : BedDesignation(bed == null) then scoreHolder.addMediumConstraintMatch(kcontext, - $bedDesignation.getAdmissionPartNightCount()); end
サンプルでは overconstrained01.xml で動作を確認できます。Unassigned な患者がいっぱいいますけど、病院はベストを尽くすのです。