Ans.
固定した勤務で、平日のみに出勤することが決まっているならば、スタッフに入れない方がよいです。スケジュールナースは、決まっていないシフトを割り当てるソフトです。
対象は出来る限り少なくした方が、求解速度は上がるので、上記目的外のスタッフは、下のようにチェックを外すか、行削除して、当該プロジェクトの対象スタッフではなくします。
Ans.
固定した勤務で、平日のみに出勤することが決まっているならば、スタッフに入れない方がよいです。スケジュールナースは、決まっていないシフトを割り当てるソフトです。
対象は出来る限り少なくした方が、求解速度は上がるので、上記目的外のスタッフは、下のようにチェックを外すか、行削除して、当該プロジェクトの対象スタッフではなくします。
Ans. 制約名は、何であってもよいです。スタッフ名である必要はなく、例えば、AとBとかでもOKです。他の制約と区別できることが唯一の条件です。
ですのでユニークな名前にしてください。
例
<ペア制約について>
現在、上記のように固有名を用いて記述は可能ですが、記述することは推奨しておりません。退職等でスタッフがいなくなるとエラーとなるためです。
GitHUBの挙げている例の通り、
スタッフプロパティシートは毎月メンテすると思いますので、忘れることは少ないと思います。
Ans.
マイクロソフトアカウントにログインして、
サブスクを停止してください。来月から課金されなくなります。
https://www.nurse-scheduling-software.com/japanese/service/pausing_subscription/
ご利用ありがとうございました。
Q.下図、宿日直回数と休日拘束数とで、医師間のばらつきがいつもより大きいような気がします。何故でしょう?
Ans. 12月勤務表では、1月年始も取り込んで作成している影響だと思います。(物理的要因です。)
試しに、制約最終日を12月31日に変更してみました。
上図をよく見比べると、医師間のバラつきは、
制約最終日 宿日直数 休日拘束数
1月5日版 2-4 4-6
12月31日版 0-2 2-4
となっており、バラつき(偏差=2)で変わっていません。全体が多くなっている傾向になっているだけ、ということです。これは、制約日数が5日だけ増えている影響とみることが出来ます。
この勤務表のスタッフプロパティシートは、制約区間全体に効いてくるので、適宜最適値に調整してください。
変更前
また偏差も2以下に収まっています。
休日の丸1日の宿日直、あるいは休日拘束1回に対してカウントは、2です。つまり、回数に直すと1回の偏差となります。この1回の偏差は物理制約による限界です。全員が偏差0とするには、
Σ宿日直%医師数==0
になる必要があります。平たく言うと、端数が0になる必要があります。逆に言えば、全員が偏差0となるには、端数0となるときだけです。
例えば、宿日直コマ数総和40に対して、医師が10人いれば、全員4回で均等にできますが、41の場合は、割り切れず、必ず偏差が1となります。5回行う方が1人だけ生じます。
つまり、1回の偏差が生じるのは物理限界であって、なんら不思議ではありません。
大変、参考になる論文が出ました。
PDLPは、諦めていたのですが、GPU実装を使えば、可能性があることが示されています。最近のGurobiもGPUを使い始めたのは知りませんでした。
Simplex、内点法、FirstOrderの比較考証もされています。Simplexのマルチスレッド化は、LU分解のパラレル化が困難でした。Julian Hall教授の実装もありますが、CPUキャッシュに収まりきれないと性能が出ない問題があります。また、従来IPMにしてもスパースコルスキー分解を上手くGPUに載せるのは、難しいと考えられてきました。
ここにきて、FirstOrderは、激しく性能向上争いが続いていて、ADMMを用いた方法も注目しています。
以上のトレンドを鑑みて、GPUによる実装を検討してみようと思います。(あくまで記録更新用なので、一般の実装には影響しません。ABIP+にせよPDLPにせよ、ユーザにとっては、精度と速度が出れば何でもよいです。)
<Simplexは必要ないか?>
依然として必要です。なぜなら、HotStart(WarmStart)によく駆動は、Simplexによるからです。INRC2規模では、Simplexのhoststartによる方が速いのでSimplexは欠かせません。一方、超大規模、SchedulingBenchmarksのInstance23/24規模になると、SimplexはHotstartを使っても無力です。この場合、内点法かFirstOrderによる方法となります。(FirstOrderによるHotStartは、Starandmarkさんの論文にあるのですが、大して効果がなかったような印象が残っています。)
上記論文で使われているGPUは、とんでもなく高価なものですが、上のような背景の私の用途としては、普通の世代落ちしたもので十分効果があるだろう、と見ています。
CUDAが使えるGPUは、以下のページで分かります。
CUDA GPUs - Compute Capability | NVIDIA Developer
とりあえず、GPUを購入して勉強・評価して、COPTを使用するかどうかを判断したいと思います。
AIの流行により、一気に花開いたGPUですが、アークテクチャを見ると、ハードウェアとソフトウェア(コンパイラ技術)の見事なバランス感覚で成り立っており、両分野に精通した人の設計なんだろうな、と思います。CPUでマルチスレッドにするとキャッシュメモリがボトルネックとなり、その部分を分離できるという意味においても一時の流行に終わることがなく、今後も汎用化が加速していくのでないかと推測します。
今まで、ユーザさまのPCにローカルファイルで保存することを推奨してきたのですが、その選択がなくなり、勝手にクラウドに録画される仕様に変更になったみたいです。
で、この録画、AI要約があったり、文字起こしがあったりで、再度見たい箇所を素早く探すことが出来るようです。ダウンロードではなく、パスコードリンクを送ることで、ユーザさまも文字起こし付のサイトで視聴できる、ということのようです。
AI要約は、次のレベルでまだまだ、です。
次は、昨日行ったAI要約です。
--
ミーティング後、ユーザさまにパスコード付きのリンクを私菅原氏とxx氏は、クラウドレコーディングシステムの導入やスタッフの休暇管理、システムにおける制約の重要性について話し合いました。 また、スケジュール変更のプロセス、ソフトウェア制約の使用、スタッフ定義を設定し、過剰と不足を調整することの重要性にも焦点が当てられました。 会話は、新しいシステムの実装、複雑な制約に対応できるシステムの必要性、ソフトウェア制約を維持することの重要性について議論で終わりましたが送れば、ユーザさまの視聴が可能です。
菅原さんとxxさんは、Excelの使い方をxxさんに教えることに焦点を当てた4時間のセッションを行い、菅原さんが指導や制限事項を提供しました。 セッションは、菅原が後でxxにファイルを送ることを約束して終了しました。 両参加者は、このセッションに感謝の意を表しました。
--
プロジェクトファイルが、全く動かない状態からのスタートでした。なので、制約を一から作りこむレクチャを行いました。
■仕様の聞き取り・確認
■頂いたプロジェクトファイルをベースにしながら、一から制約を作りこんでいきました。
■特に留意する点、注意事項など、その都度、質問を受けながら
■全ての実装したい制約を実装
し、その場で、ブランク予定でエラー0まで実装確認を行いました。
知人からの紹介とのことで、「知人のプロジェクトファイルをベースに、サブスクをご契約頂いて著書も購入したけれでも、全くどうすればよいか分からない」
とのことでしたが、出来栄えにご納得頂けたと思います。気づけば4時間程経っていました。OJTで、なおかつプロジェクトファイルが出来上がりました。
勿論、ご自分で一から練習してみるのが最も大事、というお話しはさせていただきました。4時間分の録画はあるので、見たいところや聞き逃したところ等、見返すことが出来、これと併せて、その職場にマッチした最適な学習教材(当該プロジェクトの解説資料50ページ添付)にもなったと思います。
が、これほど短時間に実装できるスケジュールナースは、
凄いな!スケジュールナース!
と改めて思った次第です。慣れれば最強は疑うところなし、です。
先生には、RAMP発表の折にお世話になっていて、ORの学術世界を垣間見ることが出来ました。著書も購入しています。
Amazon.co.jp: IT Text 数理最適化 : 久野 誉人, 繁野 麻衣子, 後藤 順哉: 本
この本は、分岐限定法と妥当不等式について解説している殆ど唯一の日本語本だと思います。
ふと巻頭言を見る機会がありました。
-数 理 の 専 門家で ない 人 が , 対象 を的確 に捉 え,必要 な とこ ろを抽象化 してモ デル を作成する こ とが で きれ ば, コ ン ピ ュ ー タの 性能が一段 と向上 してい る現在で は , 我 々 の 研 究成果 が応用 され る機会が増す と考え る.誰 もが モ デ リン グの技術を身 に つ け るた め に は , ど うすれ ば よい か 欲を言 え ぱ , 数理 的な思 考 をと しない 人 に も対象を整 理 して モ デ リン グの 方向性が わか る よ うなそ ん な指針 を構築 したいと常 日頃考えて い る.
これは、私が常々、感じ考えていることと全く同じであります。ソフトの使い方以前に、考えを整理する術が必要です。
最近ZOOMレクチャを意図的に多くしています。(メール回答で終わらずにZOOMで解説)分からないことが分からない自分にとって、有益な機会であることが多いです。
1年のサポート中、大体が3回程度以下で済みます。プロジェクト作成で、私が生み出したバグもあるし、お客さまの仕様変更もあるし、ですが、その後は、殆どサポートしなくとも運用出来ているようです。
今回は、実装その3です。
実装1の問題は、年始の予定を自動で考慮できないことでした。そこで、実装3では、予定範囲を拡大し年始を含んだ勤務表とします。1)制約終了日を1月5日する
2)12月の公休区間を作成する
従来の「今月」は、制約終了日を年始1月5日としたために、12月1日ー1月5日が「今月」扱いになってしまいます。このため、公休数区間は、12月1日-12月31日となるように新たに定義します。
3)公休数を制約しているところを「今月」⇒「今月区間」に置き換えてやります。
4)スタッフプロパティシートを調整する
夜勤数は、年始まで含んだ夜勤数になるので、普段より多めに設定する必要があります。
公休数については、普段通り、12月の公休数を入力します。
5)オプション
以上が基本の枠ですが、多分、年始の各スタッフの夜勤数については制約する必要があるでしょう。
次のその実装例です。
次は、マクロで行う例です。
一長一短です。このほかに、出てきた解を予定で調整してしまうのもアリだと思います。
どれを使ってもOKです。自分が分かり易い方法が一番です。
以上3回に渡って年末年始の実装を解説しました。
今回は、実装2です。
この方式は、特殊です。スケジュールナースの実装というよりは、クジの作り方のようなお話です。
前提条件として、以下のような職場の仕様です。
1)年末年始区間が定められており、その期間にx回以上の公休を取るように事務局から通達がある。
2)年末年始を除いた公休数は事務局より通達があり定められている。
3)年末年始区間の希望は取らない(取れない)完全にクジで決まる。
え、希望は出せないの?と思うかもしれませが、それについては後述します。
で、クジの作り方です。以下は、クジの説明図です。
勤務するスタッフA-Pまでクジを作ります。クジには、年末年始区間の勤務パターン記されています。このパターンは1)要求も満たすようにつくられています。それを引いたスタッフはそのクジのパターン通りに働かなければなりません。希望があって、働けない場合は、同じスキルレベルのスタッフ間でやり取りして調整することになっています。
このクジは、必要な夜勤数や日勤数が必ず揃うようになっています。(完成した全体パターンをハサミで切り取ってクジにしています)
クジによって、年末年始区間の勤務は完全に決定します。これを12月・1月の勤務表各々において、予定として取り込めばよい、ということになります。
完全に神様任せでありながら、組織や事務局の要求を完全に満たすという優れた方式だと思います。これなら文句を言われることがありません。「希望不可」という一見トリッキーでありながら、誰からも文句を言われない素晴らしい方法ではないかと思います。
で、この場合、クジで決まった予定をスケジュールナースに入力することでよいので、年末年始に関わる制約を記述する必要はありません。唯一、年末年始を除いたところの公休数は、12月と1月が通常から変わるので、その部分だけ制約を追加する必要があります。
これは以下のように記述しておくとメンテナンスフリーに出来ます。
「特別の日の設定」年末年始を年間カレンダで設定します。
以上です。
年末年始がやってきました。
そこで、スケジュールナースでの、年末年始の実装をまとめてみたいと思います。年末年始の実装方法としては、3種類あります。
1)通常のプロジェクトファイルを変更せずに、12月と1月の勤務を各々別につくる(普段のプロジェクトと変わらないが年始希望を考慮して予定を組み込む)
2)年末年始区間は、くじ方式。年末年始外の公休数を別に制約
3)年末月は、年始の希望を含んで制約する
以上の3つです。
早速、第一の方法を説明します。
1)通常のプロジェクトファイルを変更せずに、12月と1月の勤務を各々別につくる(普段のプロジェクトと変わらないが年始希望を考慮して予定を組み込む)
この場合、特に年末年始に特別な制約を加えることはなく、普段通りに作ります。12月勤務表を作ったあと直ぐに1月勤務表も作ります。ただし1月勤務表で実際に採用するのは、年始区間のみです。
1)12月の勤務表を完成させる。決定した解を1月勤務表では予定に送ります。
Ans.新人は、夜勤者数にカウントしないので、1回だけ異動者は夜勤者数にカウントしなければよい、ということになります。この実装としては、既に、
「新人初回夜勤区間は、新人を含めないで通常夜勤者数を確保したい」
であります。この例と同じようにすればよいですが、今回は、マクロを使わないで実装してみます。
Q.新人も成長してきたので、夜勤関係は他スタッフと同じとし、新人ではなくしたい。ただし、Aチームから新人以外1名、Bチームから新人以外1名は、残したい。
Ans.成長した新人を準新人と定義します。準新人と新人では、仕様が異なるので、集合を分ける必要があります。そのために、「準新人」を導入します。
ただし、毎年、「新人」⇒「準新人」は、同じように推移すると思いますので、今までの「新人」も残して、各々「新人」「準新人」として動作するように設計します。
「新人属性」に「準新人」を追加します。
スタッフ定義で、「準新人」を指定します。Q.会計年度職員や、妊婦のため、日勤のみにするには?
Ans.「スタッフ毎の設定」で、そのスタッフの日勤以外のシフトのチェックを外します。
Ans.まず、グループ定義で「新人属性」を定義します。新人属性の一要素として「新人」を定義します。
First Orderのリニアソルバは、前にも評価しました。HIGHS版では、PDLPのGPU版もあるのですが、Google OR-TOOLS版では、また別な改善がされているということなので評価してみました。
Scaling up linear programming with PDLP
が、残念なことに、「収束速度、精度から言って、問題がある」、INRC2や、SchedulingBenchmarksの記録更新用途には、使用に耐えないという結論に達しました。問題の性質上、Barrior Solver(内点法)によるソルバが有効である、というのは分かっていて、HIGHSの改善版
Funding for the IPM solver and beyond
を待っていたのですが、一向に出る気配がないので諦めてCOPTに依頼することにしました。
NEOSサーバ上のCOPTは、Simplexなので遅いです。CLPと大差ありません。
しかし内点法によるMittlemanBenchmarkによれば、圧倒的に1位です。以前にCOPTを評価したときは、内点法の実装がなくSimplex Onlyでした。そのときも、この問題は、内点法ソルバの方がフィットしますよ、というアドバイスをもらっていたので、そのときから、一気にトップに駆け上るポテンシャルを秘めていたのだと思います。
Ans. 次のように、休日の集合で2連休パターンを作り、パターン最初の曜日を「土」にします。最小を1としてソフト制約にすれば、「出来れば1回以上」になります。
これだけでOKです。<「出来れば、土日2連休」は、「明け後なるべく2連休」と深く関わっている>
ちなみに、この制約は、「明けの後はなるべく2連休」という制約と関係があり、この制約追加によって、「明けの後はなるべく2連休」制約の実現が難しくなります。
下図は、その様子です。土日休み1回以上が全スタッフ達成しているのに対して、「明けの後の2連休が、かなりの部分出来ていません。スタッフによっては、4になっているところがありますが、これは、4回エラーつまり、夜勤4回も2連休ではなかった、ということになります。