OptaPlanner examples その10

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 な患者がいっぱいいますけど、病院はベストを尽くすのです。