2025年9月18日木曜日

MaxSATソルバのダイエット

 ■SATソルバが使えない問題

に対して、構造を見直しメモリダイエットを行いました。およそ1/4程度にはなりました。

結果、instance23については、AL1でコンパイル出来るようになりました。このとき、25GB位の消費です。


しかし、instance24については、AL1コンパイルが出来ませんでした。およそ57GB位で、ストップします。TIME関係の消費が大きいようで、恐らくは、Max節数を超えているのだと思われます。

SATソルバが使えないと、やはり痛いので、なんとかして使えるような検討を行う必要があります。


2025年9月17日水曜日

PDLPX

PDLPの改善版です。3倍程度、特に高精度領域において、改善が著しいようです。

[2507.14051] cuPDLPx: A Further Enhanced GPU-Based First-Order Solver for Linear Programming

■LPソルバが遅すぎる問題

現状では、全く遅すぎて、10倍以上の速度アップが必要ではないかと見ています。

上記でも足りませんが、とりあえず、

HIGHSまたは、Cuopt で、実装されるのを待ちたいと思います。

2025年9月16日火曜日

GPUの比較

PDLPで比較してみました。 

RTX4060TIをRTX3080 12GBに置き換えてみたのですが、期待していた性能向上は見られませんでした。ネックはメモリ転送レートと睨んで、あわよくば3倍と期待していましたが、1-3割程度の効果しかありませんでした。








2025年9月15日月曜日

instance23のLBが判明

これまでの世界記録は、 

Instance23 : LB=16990 UB=17428

でした。今回、新たに 17284.3 ⇒LB=17285

であることを発見しました。

大幅なLB更新は確定的で、これまでの経験上、UBもその直近傍(ex 17285)にあると思われます。

しかし、次の

■RCSSP ソルバが遅すぎる

■LPソルバが遅すぎる

■SATソルバが使えない問題

という問題のため、それ以上前に進められていません。


LPソルバについては、

■GPU置き換え

■PDLPアルゴリズムの改善

■新たなIPMソルバの適用

の可能性を検討しました。


2025年9月14日日曜日

Pseude boolean competition 2025

日本から、3チームが出場したようです。

PB25 Pseudo-Boolean Competition 2025


名古屋大の酒井先生と山梨大の鍋島先生のチームが優勝されました。

擬ブールソルバ競技会(Pseudo-Boolean Competition 2025)よりDEC-LIN 部門 第1位を受賞しました。(情報システム学専攻 酒井 正彦 教授) | 名古屋大学情報学部/大学院情報学研究科


その他にもPrintempsや今井さんも参加されたようです。

Pseudo boolean  competition は、昔からあったように思いますが、しばらくお休みがあって、ここ最近復活したようです。最近の潮流は、MIPソルバの使用にあるように思います。

Maxsat competition については、今年はお休みです。一昨年と去年の解けた問題数の差異は、殆どなく誤差の範囲と言ってよいかもしれません。技術的進展がないと、研究者も敬遠するのかもしれません。


2025年9月13日土曜日

SAT Competition 2025

 The Results of SAT Competition 2025

今年の優勝者は、AE-Kissat-MABで、

DynamicSAT: Dynamic Configuration Tuning for SAT Solving

ダイナミックにチューニングするソルバのようです。明らかに優位性が見れます。

それから一カ月も経たないのに、それを凌駕するとの報告がありました。

Autonomous Code Evolution Meets NP-Completeness

NVidiaSaturationというフレームワークを使って人がコーディングしたよりも性能が良いソルバを自動生成する、

とのことのようです。AlphaEvolve

Google: AlphaEvolve - Gemini を活用した次世代アルゴリズム設計について #GoogleCloud - Qiita

よりも、より進歩性のあるということを主張しています。


初期のSATソルバとは違い、最近のSATソルバは、細かな改善の積み重ねの結果としてあり、何のパラメータが支配的な性能向上につながるか?というのは、パラメータ数が多すぎてよく分からないことになっていると思います。 こうしたパラメータが多数ある分野でのチューニングは、人間は、LLMには敵わない、と私も見ています。言うなれば、人間勤務表ースケジュールナース勤務表のような関係性です。

最適化ソルバで、研究者自体が駆逐される可能性も出てきるでしょうか? こちらは、未だ論文化されていない方法が多数あると思われます。(私が取り組んでいるのも、その一つです。)それらが全部オープンにされない限りは、LLMが支配することはないと思います。

逆に言えば、

■最先端技術が全てオープンになっているSAT技術分野でのLLMとの闘い

今後のSAT Competitionは、LLMが生成したソルバが参戦してくるでしょうから、来年以降、過去の技術資産の組み合わせだけで、LLM生成ソルバに勝つのは、極めて難しいと思います。昨今の革新的進歩がないことを勘案すると、極めて不利な情勢です。しかし、一抹の期待を抱かずにはいられません。



2025年9月12日金曜日

Q.9月15日以降の勤務表を再作成する必要があり、 システムで再作成(求解)を行ったところ、エラーが発生

 Ans.


赤部をダブルクリックすると、次に飛びます。

しかし、これは、GUIの誤作動です。申し訳ありません。制約は、二つあり、

「できれば2連休を一回以上」ー 赤部GUI指摘箇所

「できれば2連休を一回以上 責任者」青部ソルバ指摘箇所


で、ソルバの指摘箇所は、GUIが指した赤部ではなく、責任者の記述がある青部です。

スタッフ14が9月15日以降、全日休みになっているので、上記制約の最大記述と矛盾になっています。(ソフト制約ですが、行制約レベル2は、許容エラーが1になっているので、4+1 ⇒6以上は、ハードエラーとなっています。)



従い、スタッフプロパティ、スタッフ14の責任者記述を、一時的にブランクにすることで

対応するのが、簡単でしょう。


あるいは、恒久的に、当該制約の最大記述をカットしてもよいと思います。

2025年9月11日木曜日

添削プロジェクト

お客さまが記述したプロジェクトをZOOMレクチャ1回で添削しました。

 病棟2交代メンテナンスマニュアル

プロジェクトファイルは、以下です。



2025年9月10日水曜日

Q.日勤後連続夜勤が先月部ー今月部でエラーする

 Ans.

下記記述で、先月部末日(=制約終了日)に夜勤が来ると、次の日は、夜勤明けが来ることが必然となるためです。この際、パターンがヒットしないことに注意してください。


これを改善するには、パターンがヒットするように、次のように明けパターンを削除します。

先月部の記述問題なので、今月部は、如何ともなりません。次月よりの改善となります。



2025年9月9日火曜日

解がないプロジェクトの改善

 前回、解がない場合の解析を行いました。実務場面で、ここまで詳しく見る必要はありません。単に、「9月19日、グループAの夜勤明けリソースが足りないのだな」ということだけ分かれば、十分です。

しかしながら、実務場面で、予定を入れるたびに、こうしたことに頭を悩ませるのは、好ましいことではありません。ブランク予定で、UB=0が保証されていれば、機械的手順で、予定が変更される部分は分かりますが、一定のスキルを要するので、出来れば、そういう事態は避けるような、恒久的プロジェクトの改善を行うことが好ましいです。

1)列制約のソフト化


2)行制約のソフト化


3)グループA/Bに関わるのでバランスを整える

グループAのリソースが足りないので、グループBのリソースに余裕があれば、改善する可能性があります。その月で、もし変えることが可能ならば、カットアンドトライでやってみる価値はあります。




4)グループA/B両方対応できるスタッフがいないか?

スタッフ1は、丁度そのようなスタッフなので、グループ集合を変更して制約を変更します。





<まとめ>

夜勤明けリソースが居ない問題について

1)予定変更

2)列制約のソフト化

3)夜勤明け後の休みのソフト化

4)グループバランス

5)グループA/Bの両方に対応可能なスタッフ記述

対応する方法を述べました。列行どちらの選択をするかは、重みの選択によります。


一つの解がない問題について掘り下げました。ハード制約間の矛盾で解がない事態となってしまうので、基本的には、予定・列・行のいずれかをソフト制約で逃げる必要があります。

大事な事は、解がない⇒原因は様々ある⇒ソルバは、原因に関するヒントを列挙はしますが、上のどの対応が適切かは分かりません。管理者だけが正解を知っているということです。

そして、その正解は、予めソフト制約や重みによって自動的に選ばれるようにしておくことが、恒久対策となる、ということです。

上のような解析は、開発時だけのもので、稼働時には、常に管理者にとっての正解が示されるようにしておく、ということがポイントです。



2025年9月8日月曜日

Q. 希望休と必ず出なければならない日勤集合、研修、などを合わせた結果エラー発生します

 Ans.

エラー情報をよく見ます。


一見して分かるのは、9月19日近辺にエラー要因があるということです。

赤丸部をダブルクリックして飛ぶと、エラーは、全てグループAで起きている、ことが分かります。



なので、最も疑わしいのは、
■9月19日にグループAで夜勤リソースが足りていない

ということです。9月19日の予定を全てソフト制約にして、再度求解します。



予定ソフトのレベル1の適用にチェックを入れ求解します。


1か所、日勤集合が夜勤明けに変更されていることが分かります。

解と並べて、予定が変更されられた理由を考えてみましょう。何故、スタッフ10の予定、日勤集合の予定を夜勤明けに変えざるを得なかったのでしょうか?

 ⇒夜勤明けをやるスタッフリソースがなかった、ということが直接的な理由です。




その他のグループAの予定は、未だ余裕があるように見えます。しかし、
■グループAの夜勤明け休み 1名
■グループAの夜勤者    1名
■グループAの9月19日予定 3名
■グループAの9月20日予定が休みでないので、9月19日を夜勤明けにできない 2名
■グループAの夜勤不可者 2名
■グループAの夜勤明け  1名

全部足すと10名となり、グループAの人数9名を上回ります。
これは矛盾です。


2025年9月7日日曜日

お客さまが開発したプロジェクトを見てー8

 次の青部パターンは、冗長です。

そもそも、当直-当直明けは、制約1-2番目の制約で、必ず対になっているので、パターンを拾って回数制約する必要はありません。当直だけで十分です。(パターンで行うとソルバに余計な負担がかかってしまいます。)

従い、次のように記述した方がよいでしょう。




2025年9月6日土曜日

お客さまが開発したプロジェクトを見てー7

以下のパターンも、前回と同じ間違いを含んでいます。


今回の指摘は、それだけではなく、夜勤間隔に関するものです。夜勤間隔6日以下を禁止しています。つまり、夜勤間隔は、1週間以上であることをハード制約としています。この制約があると、夜勤回数は、月4回以下が絶対ということになります。

何が問題かというと、全ての深夜Gメンバに対してそれを強いている、ということです。必ずそれを満たす保証があれば、問題ない記述ですが、中々それを保証することは難しいのではないでしょうか?

夜勤間隔が長いパターンは、ソフト制約として逃げる弁を付けてやるのが常道です。あるいは、スタッフ毎の夜勤回数制約に応じて、制約パターンを分けるというのも手です。

https://schedule-nurse.blogspot.com/2025/04/4endrelease-3.html

2025年9月5日金曜日

お客さまが開発したプロジェクトを見てー6

 次の記述のどこが「まずい」でしょうか?


Day集合を表示させてみると、「制約開始日二日前から」は、

となっています。1番目の制約は、次のように作用します。

最初のパターンは、先月部のみに作用します。先月部は、過ぎ去った過去なので、変えようがありません。自由空間である「今月」が全く絡んでこないので、そもそも制約するべきではありません。

一般に、先月部に対しては、「”パターン数-1”前から」にするのが常道です。
考えるのが面倒であれば、自動設計にして求解保存すると、次回プロジェクト読み込みから、正しく設定されます。

正しい曜日タイプは、以下のようになります。





2025年9月4日木曜日

お客さまが開発したプロジェクトを見てー5

 <シフト数が多すぎる>

シフト数は、25程度を目安としてそれ以下になるように心がけてください。

次は、良くない例です。


シフトは、他と管理状態を区別するためのものです。他と管理状態が同じであれば、同じシフトにするべきです。自動割り当てしないシフトが多数ありますが、

■業務外日勤カウントあり

■業務外日勤カウントなし

という二つの非自動化シフトにすれば、十分だと思います。その他は、上の別名にすればOKではないでしょうか? 勿論、管理を別にする必要がある(例えば、個別に人数を制約する必要がある)場合には、使えませんが、同じ管理でよければ、同じシフトにしてシフトの削減を行うべきです。

別名にすれば、メモリを食いませんので、いくら定義してもソルバの負担にはなりません。このお客さまの場合、こうした感じで50以上のシフトが定義されていました。この状態では、ソルバの負担は、測り知れないことになっていると思います。シフトは出来る限り削減してください。

2025年9月3日水曜日

お客さまが開発したプロジェクトを見てー4

 制約を変更したら、直ぐに動作を確認しない方が多いです。

一つ変更、一つ求解確認が基本です。

一つ一つの制約の中身は、

■Day集合

■グループ集合

■シフト集合

から出来ています。各々制約上で集合を確認してください。

人間は間違えます。制約は、プログラムと違い、書いたその場で、動作を確認できるのですから、一つ一つStep by Step、動作を確認して、積み上げていくことが出来ます。そうした方が、結果として早いと思います。



2025年9月2日火曜日

お客さまが開発したプロジェクトを見てー3

< ブランク予定で、必ず解があることの保証>

開発段階・デバッグ途中では、ブランク予定で、解がないことはあり得るのですが、本稼働場面で、ブランク予定で解がない事態は、絶対に避けなければなりません。

ブランク予定で必ず解があることが保証されていれば、予定を入れて仮に解がなくても、予定を全部ソフト制約にすれば、解は必ずある筈です。予定変更された部分が問題箇所という特定が直ぐできます。機械的な手順で難しいことはありません。本稼働時は、原因解析をすることなく、機械的に処理します。

ところが、ブランク予定で、解がないということは、その原因の解析をしないといけないということであり、スキルを要する仕事になってしまいます。原因の分析は、制約の中身について知らないと出来ない作業です。

また、毎月の予定に対して制約を弄ることは、完成したプロジェクトでは行いません。制約は予定に関わらず不変であること、が安定稼働の条件と考えます。

もし、予定を全部ソフト化しても解がない、つまり、ブランク予定にしても解がないならば、設計不備です。ブランク予定では、どのような月であっても解が存在することを保証をしておくことは、プロジェクト設計の礎です。

どのような月であっても、必ず解が存在するプロジェクトにするには、どうすればよいでしょうか?施設によりその条件は、異なるので一概には言えませんが、月の公休数や祝日数に関係していることが多いので、敢えてそういう条件の悪い月で試して解があれば、一応安心できるでしょう。(ただし、先月からの条件も絡んでくるので、絶対大丈夫とは言えません。)

いずれにせよ、ブランク予定で、先ず解のある状態にしておくことは、基礎中の基礎です。まずは、ブランク予定で開発を進めて、ブランク予定では、必ず解があるようにしてください。


2025年9月1日月曜日

お客さまが開発したプロジェクトを見てー2

 ハード制約が多すぎるプロジェクトも、よくみかけます。ハード制約が一つでも満たせないなら、解がない状態になってしまいます。「ハード制約は、必ず満たさなければ、いけない制約」という理解は、されていると思いますが、必ず満たせる制約である必要もあるのです。逆に言えば、少しでも満たせない可能性がある制約は、ソフト制約にする必要があります。その意味で、「こんなにハード制約があって満たせるの?」という疑問が沸いてくるプロジェクトを拝見することがあります。

行制約と列制約は、互いに干渉しあうので、以下のA)B)いずれかにするのが基本です。

A)列制約がハード制約主体 ⇒行制約はほぼソフト制約とする

B)行制約がハード制約主体 ⇒列制約は、ほぼソフト制約とする

その中で、どうしても実現したい制約のみ(1個か2個程度)をハード制約とします。

行と列どちらもハード制約主体となっているプロジェクトは、解がない状態となる率が高いです。特にリソースを使い切るプロジェクト、いわゆる「人がいない」職場では、解がない状態となる確率が高いでしょう。






2025年8月31日日曜日

お客さまが開発したプロジェクトを見てー1

 お客さまが開発したプロジェクトを拝見する機会が多いのですが、それを見ていて、思うことがあります。

<仕様書の存在>

仕様書がなく、いきなり制約を書き始めていませんか? プロジェクトを開発する場合は、まずは、日本語で仕様書を書きましょう。

何年もスケジュールナースを使って頂いているのは有難いのですが、恐らくは、月々のスタッフ要求をそのまま制約化して、スパゲッティプログラム状態になっているプロジェクトを見かけます。スタッフの力が強いのだと思いますが、学級崩壊のクラス状態です。コントールが効かない、統制のないプロジェクトは、崩壊します。

制約を書ける管理者が陥り易い現象ですが、それを防ぐには、元々の仕様書に戻ってメンテナンスしているかどうかに尽きます。元々の仕様には、平準化とか、負荷を均一にとか、そういう言葉があったはずですが、それがどこかに置き忘れて、月々の個々のスタッフ要求を満たすための制約記述に成り下がっていないでしょうか?

個々のスタッフ要求は、予定で記述されることが基本です。過渡な要求は、当然解がない事態となりえるので、ソフトレベル化し、全ての予定を満たすことはできない、というスタンスで臨みましょう。それが、上記仕様を満たし、しいては全体の幸せベクトルを最大化すると考えます。







2025年8月30日土曜日

メンテナンスし易い制約の仕方

 大事な原則は、

固有スタッフ名で制約しない

です。お客さまのプロジェクトファイルを拝見していて、メンテナンス性が良くない例を下に示します。


ペア禁止制約ですが、スタッフ名で制約しています。


これは、良い記述ではありません。制約の中身は、書いた時点では覚えていますが、やがて忘れてしまうのが普通です。

スタッフが異動になったり退職したりする場面でスタッフプロパティシートのスタッフ名を変更しますが、そのとき、上の制約も変更する必要があります。ところが、制約したことは忘れてしまっているので、求解エラーとなってしまい、『何が起こった?」で無駄な時間がかかってしまいます。

こういうことが起きないようにするには、将来起きえる変更をスタッフプロパティシートにまとめておくことです。毎月のメンテナンスは、スタッフプロパティシートだけ行えばよい、ということにしておきます。つまり設計後は、制約そのものを弄る必要がないようにします。

改善例は、例えば、次のようにペア制約の組を指定するようにします。こうしておけば、ペア禁止人数は、二人に限定されることがなく、3人でも4人でも汎用的に記述できます。


上のメニューを出すには、次のようにグループ定義を記述します。

最後に列制約を用いて、ペア禁止とします。

以上で、メンテナンス性の良い記述の完成です。

2025年8月29日金曜日

Q.様式9の対応は?

 申し訳ありません。対応は行っておりません。

様式9については、以下が詳しいですが、

https://lp.henry-app.jp/column/yoshiki9

どちらかというと勤怠管理の範疇に属します。加算要件を満足させるためのシフト要件については、スケジュールナースで如何様にも記述可能です。が、その中で用いられるシフトは、モデリング(簡易化)したものであり、実勤務時間を正確に記述したものではありません。


https://www.nurse-scheduling-software.com/japanese/nurse_scheduling_problem/chapter33/


それを実勤務時間形式である様式9に落とすには、


スケジュールナースExcel解⇒様式9Excel


へ変換を行う作業となります。


言い換えれば、シフト要件に特化したスケジュールナースの範疇ではなく、モデリングしたシフトと実勤務時間との対応を把握している病院サイドでの対応というスタンスとなります。


2025年8月28日木曜日

Q.夜勤の際に、特定の人間との夜勤の回数を一回以下にしたいのですがどのようにすればよろしいでしょうか。

 Ans.

似た実装として例として、以下があります。

https://schedule-nurse.blogspot.com/2024/04/q_14.html

題意は、特定のスタッフとそれ以外との夜勤ペア回数を最大1回にしたいということですが、

これは、日々の列制約(全てのペア組み合わせ)に対して、行制約=今月期間中に最大1回と、列と行の複合制約となります。こうした複合制約については、Pythonでしか書けません。

以下は、プロジェクトを走らせた様子です。解がない可能性がありますので、

■ソフト制約にする(ソフトレベル設定で、適用と重みを設定)

することと、言語制約にチェックを入れることが必要です。



スタッフプロパティシートで、ペア回数を最大1回にするスタッフを設定します。

上のメニューにするためのグループ定義記述です。

解になります。ペア回数を最大1回にしたところのスタッフは、全スタッフに対して最大1回にソフト制約されます。
このように、Python記述をブラックボックスとして、将来に渡る変更は、スタッフプロパティシートで吸収できるようにするのが、良い実装です。スタッフ個別名を用いていない点に注意してください。


実装は、以下となります。Python記述は、ブラックボックスとして扱えるように記述しています。(僅か十数行です。”夜勤”の部分をご自分のプロジェクトのシフト名に入れ替えれば汎用的に使える記述です。)



import sc3


def ペア回数制限Sub(person1,person2):
    if person1==person2:#同じ人は制約しない
        return
    list=[]
    for day in 今月:
        v1=sc3.GetShiftVar(person1,day,'夜勤')
        v2=sc3.GetShiftVar(person2,day,'夜勤')
        list.append(v1&v2)
    s=staffdef[person1]+"と"+staffdef[person2]+"の組み合わせ回数"
    print(s)
    sc3.AddSoft(sc3.SeqError(0,1,3,list),s,5)#min max allowable errors 最大1回に制限

def ペア回数制限():
    for 特別person in 夜勤ペア最大1回:
        for person in 全スタッフ:
            ペア回数制限Sub(特別person,person)

ペア回数制限()


2025年8月25日月曜日

超大規模問題に対してのこれまでの状況

 ■メインリニアソルバ


Defaultは、CLPです。

INRC2 8Weeksの規模に対しては、明らかにHighs IPMが有利です。ソフト制約が基数制約にある場合は、より有利に働くと見ています。

Instance23/24については、今のところ、Highs PDLP一択です。(近い将来 Highs IPMがGPUを使ったコルスキー分解をサポートするようになれば、PDLPを使わない可能性はあります。)


■サブ問題(RCSPP)

Defaultは、Complete Graph方式です。Instance22では、Graph化が困難で、部分グラフ方式となります。それ以上の規模では、部分グラフの計算時間がネックとなります。サブ問題用にHighs MIPソルバも実装しましたが、問題外に遅いです。
CLP+CompleteGraphをグラフを使えば、例えば上の求解時間は、十数秒で済みます。
小・中規模では、PDLPは、思いのほか遅いのです。それに、Highs MIPを使えばさらに遅くなってしまうので、選択肢からは除外せざるを得ません。


現状の課題は、超大規模問題の想定求解時間(一週間)内に解を求められる速度のサブ問題ソルバが無いことです。この規模では、Algorithm1も使えません。ひたすらBranch&Boundしなければならないため、余計に時間がかかってしまうことから、より高速なサブ問題ソルバの開発が必要となります。

最近の論文関係では、ラベリングアルゴリズムがあるのですが、これについても遅すぎると、見ています。

まとめると、超大規模問題では、今までに全く知られていない高速RCSSPソルバの開発が必要になる、ということです。

2025年8月24日日曜日

instance23 Rostering w/o cardinals 時間がネック

 instance22 以上では、グラフ化が出来ないので、基数制約以外をグラフ化する方式にしました。なんとか、Rootまでは、持ってきたものの、それ以降のBranch&Bound操作で時間がかかりすぎることが分かりました。


R_calc_timeがその計算時間で、ときに10分以上要しているのが分かります。100Rosterだと、その100倍かかり、さらにそれが数回以上収束に要しています。

このままでは、1カ月経っても目的Depthまで到達することは出来ません。想定Depthは、1000で、1Depthに数時間かかるようでは、到底現実的な時間内には、収まりません。

大規模Lp問題に取り組む前に、まずこの問題を解決する必要があります。



2025年8月21日木曜日

Highs ipm(1.11)は、大規模問題には、パワー不足

 Highs ipmをinstance22 を W/O Cardinals Graph in rosterで走らせると、24時間経ってもROOT LP値を得ることができません。

現状のHighs ipmで行うと、恐らくは、一カ月以上計算機を廻さないといけないでしょう。そこでPDLPに期待がかかるのですが、高精度、kkt_tolerance=1e-7にすると、IPMと時間的には大差ありません。(4060Ti)

そこで、初期は、精度を落として、1e-4からスタートし、徐々に精度を上げる方式を取ることで、高速化できないかを検討しました。1e-4ならば、高速に解が得られます。また、解の安定性のための初期スケーリング処理も必要ないようです。

下のグラフは、kkt_tolerance=1e-4での目的関数値の変化のグラフです。

精度が悪いので、目的関数値は、滑らかではなく、凹凸があります。そこで、適当に低域フィルタリングして十分傾きが≒0近くなったときに、精度を上げるようにします。これを1e-7最終精度まで繰り返して、最後に収束を判定します。ROOTまで来たら1e-7に固定しBr&Bound処理に移行します。

2025年8月20日水曜日

Q.夜勤と当直の行制約で以下を実現するにはどうしたらよいでしょうか?

 Q.夜勤と当直の行制約で以下を実現するにはどうしたらよいでしょうか?

    当直数を個人ごとに最大―最小パターンで最大数と最小数を決める

    夜勤数も同様に最大―最小パターンで最大数と最小数を決める。

    当直数と夜勤数の合計を最大―最小パターンで最大数と最小数を決めて、その範囲でシフトを割り当てる。

スタッフ名1は月当たり当直を1~2回、夜勤を1~0回、当直と夜勤の合計が1~2回の勤務条件とした場合。

月当たりの当直数と夜勤数のパターンとして次の4パターンになるかと思います。

当直(1~2回)

夜勤(0~1回)

計(1~2回)

 

添付したプロジェクトで試しに当直と夜勤をシフト集合で深夜としてみましたが、深夜のシフトが割り当てられてしまいます。

上表の4パターンのどれかに当てはまるシフトを実現するにはどのように制約すればよいのでしょうか?


Ans.

考え方は、正しいです。ただし、実装が間違っていました。

以下の制約で「深」は、意図した合成集合「深夜」になっていません。

合成シフト集合は、最後の方にあります。

正しくは、これを用いて、次のように制約すべきです。



スタッフプロパティシートは、

求解して、意図通りの解となることを確認しました。

<網羅テストの仕方>
ただし、4つのパターンのうち一つの解しか確認できなかったので、予定をソフト制約として、テストを行います。

予定をソフト化したので、適用にチェックして求解します。

全4パターンの確認が出来ました!


スケジュールナースTODO:
ラベルのシフト合成集合の明示。