2025年8月8日金曜日

グラフ縮約の検討その3

■Scheduling Benchmarksのinstance22では、PrimaryCardinals制約は、コンパイルできるが、他のCardinals制約と合成コンパイルが出来ない (96GBメモリ)

instance23では、PrimaryCardinals単体でも、コンパイルが出来ない

という問題があります。これに対処する案の検討を行いました。

Scheduling Benchmarksは、全て同じ形態であり、

業務時間累計に対して最大・最小を規定しています。(Primary Cardinals制約)


これに対して、個別のシフト群に対して、シフトパターン数最大のみを指定しています。(Secondary Cardinals制約)

さらに、最大連続勤務日数、または、最小連続勤務日数が既定されています。これらは、スタッフ固有の規定です。


さらに、シフトパターンが、規定されています。これは、スタッフ共通です。


また、スタッフ毎にあり得るシフトが(ランダム的に)規定されています。


また、ハード予定があります。



Scheduling Benchmarksで有難いのは、これらが全てハード制約で記述されている点です。ソフト制約ならば、解空間を削減することは出来ないのですが、ハード制約なので、解空間を限定的にすることが可能になります。

1)Sencondary Cardinalsの削減
Primary Cardinalsは、業務時間累計の最大ー最小を規定しています。Secondary Cardinalsを全て除いた条件で、Secondary Cardinalsの最大値を求めるものとします。これは、他のスタッフを参照することなく、個別Roster毎に求めることが出来ます。ソフト制約ならば、全体品質との兼ね合い部分が出てきてほぼ、求めることは出来ませんが、ハード制約のみで記述されているので、個別Roster内に限定して求めることが出来ます。小さい規模のMIP問題となるので、内蔵Highsで解くことにします。

2)存在意義があるSecondary Cardinalsを含めた条件下で、Secondary Cardinalsの最大ー最小を求めます。これも内蔵Highsで解くことにします。

3)Primary-Secondaryの同時コンパイル
問題は、最適性の緒元を失わずに、如何にグラフを縮約するか?にあります。グラフの合成段階でも、コンパイルエラーが発生しているので、合成によって最大規模演算になっている可能性があります。このように合成された結果が小さいものであったとしても、合成される過程で一時的に大きくなりすぎてしまう問題は、しばしば遭遇します。この問題に対して、
同時コンパイルが出来れば、合成そのものを排除出来ます。また2)で求めた条件を入れこめば、グラフ状態数をより削減できるのではないか?と思われます。
業務時間累計は、全てのシフトに対する時間和となる関係であり、独立問題ではないハード制約です。よって、業務時間累計を求める過程において、各シフトのMin-MaxPruneすることが可能になります。

4)それでもダメなら、2)で中間ゲートもさらに求め、さらに状態数を削減します。

この案の胆は、個別Roster毎にグラフ縮約が可能になる、ということです。個別Roster毎に限定したオペレータであり、何ら最適性を失なうことがなくグラフ縮約が可能となります。結果として、コンパイル出来る可能性が高まります。これは、スケジューリングベンチマークがRosterに関しては全てハード制約で記述されているおかげです。結果、6カ月や1年という長い期間のコンパイルが可能になるのです。

言い換えれば、INRC2のようにソフト制約が入りまくりのベンチでは、今回の手法は、全く意味をなさないので適用することはできません。逆に、今回のような手法が使えないので、INRC2で6カ月や1年というベンチマークは、規模が大きすぎて全く解けないレベル、と言ってよいと思います。

実務ベンチは、どちらかと言えばINRC2に近いソフト制約が主だと思いますので、2025時点のコンピュータリソースでは、NSPが現実的に解ける規模は、高々2-3カ月以内の規模程度、ということが出来ます。


2025年8月6日水曜日

Q. 「はい」を押して終了しますが、また出てきてループします

Q.



続行を押しても、何をしても5分経ってもソルバは動き出しません。

Ans.

<原因>

恐らく、別なアカウントで起動させた状態でのソルバプロセスが残っていると思われます。

そのソルバを起動したアカウントとは別なアカウントのスケジュールナースでは、残っているソルバプロセスは消せません。(OSの仕様。同じアカウント・同じ管理権限であれば、消せる筈です。)

<対処方法>

タスクマネージャを起動して、ソルバプロセスを強制終了させます。

1)タスクマネージャを起動します。

2)ユーザ→詳細で maxsat.exe(ソルバプロセス)を強制終了させます。


これで、ソルバプロセスは消せる筈です。再求解時の一回目は、「別の~」が出ますが、


気にせず再度、求解してください。

万が一それでもダメな場合は、PCをシャットダウン・再起動してください。


別なアカウントで起動させた状態でのソルバプロセスは残っていませんでした。

使用しているタスクマネージャにもありませんでした。

PC再起動で再使用できました。

Q.スケジュールナースが走らなくなりました

 Q.

突然、以下のメッセージが出てスケジュールナースの計算が走らなくなりました。

 

いただいたVer.12に予定入力し、計算させた後、解が出ました。

タスクロックを行い、シフトの調整を行おうとしたところ以下のメッセージです。


Ans.

メッセージの通りで、求解エンジン(ソルバ)が計算中ですので、「はい」を押して終了させてください。


これは、求解中に、他のプロジェクトをロードしたり、複数のスケジュールナースを立ち上げていて、求解していれば、起こります。スケジュールナースは、複数立ち上げても問題ないのですが、ソルバ求解は、一つしか許していません。



求解中のソルバ動作を止めれば、求解中のソルバ数は、0になるので、再び求解が可能になります。(スケジュールナースプログラムの不具合ではありません。)

2025年8月4日月曜日

HIGHS IPM ソルバの高速化ビジョン

 Interior point methods in the year 2025 - ScienceDirect

で近年のIPMソルバについて解説されていました。Highsの前処理についても解説があり参考になりました。

現在は、次のPhase1に在ると思います。

HiGHS_funding_proposal.pdf

Highs IPMソルバについては、Phase2で、コルスキー分解によるdirect factoringで並列化がなされるはずで、これの実装待ち、ということになります。

これを待つか、自前で実装するか悩ましいところですが、とりあえずは、Highs1.11 IPMをベースとして、LPソルバ以外の実装を行うこととしました。Scheduling Benchmarksは、時間制限がないので、いくら時間がかかっても問題ありません。



2025年8月3日日曜日

HIGHS 1.11 MIPソルバ性能評価

 Feasibility Jump等のヒューリスティクスが追加され、かなりMIPソルバの性能が上がっています。(部分的には低下しているベンチもありますが、総じて上がっています。)

下図が、SchedulingBenchmarksの結果になります。この性能だと、CBCの数倍の性能と言ってもよいと思います。



2025年8月2日土曜日

HIGHS1.11LPソルバの評価

 HIGHSの1.11、PDLP版をテストしてみました。

<PDLP版のコンパイル>

### Build HiGHS with GPU support

HiGHS must be built, from the root directory, with 

cmake -S. -Bbuild -DCUPDLP_GPU=ON

cmake --build build --parallel


<PDLP版のオプション指定>
精度/crossoverの有無等は、コマンドラインから指定できないので、例えば次のようにオプションファイルを指定して、オプションファイルの中で指定します。

highs --options_file highs.opt instance21.mps

solver = pdlp
kkt_tolerance = 1e-7
run_crossover = on


<結果>

下表がその結果になります。GPUは、4060TISuperです。


PDLP-Cとの比較

COPT版PDLP-Cとの比較では、1e-4でみると、COPT版の方が速いですが、実用的な精度である1e-7でみると、COPT版では、収束しませんでした。従い、速度的には遅いもののHIGHS版の方が、安定的と見ます。MIPソルバでは、1e-7位の精度がないと使い物にならないという事情があると思いますので、恐らくは、HIGHSチームの意図的な設計によるものと見ます。


HIGHS IPM版のとの比較

内点法ソルバが更新された模様で、以前のものより速くなっています。内点法ソルバは、WarmStartが出来ないものの、Analytic Centreを使えば、安定度はSimplexよりも良い、との報告もあります。一方、PDLP版では、インスタンス規模とSpeedとの関係が不明確で、必ずしも規模と速度の相関がありません。(規模の小さいinstance19が最も遅くなっている)

これに対して、Highs IPM版では、規模と速度の相関が安定的であるとも言えます。精度に対するSensibityも殆どなく、PDLPと比較すると、遥かに安定していると言えます。

Highs IPM版は、未だSPARSE行列演算のマルチスレッド化が出来るところもやっていないので、未だ速度向上の余地はあります。何よりGPUを必要としないので、ライブラリの切り替えの手間等がなく実装が楽です。速度もそれなりに期待できるので、未解決残り2問題用のソルバ実装検討には、HIGHS IPM版で行うことにしました。



2025年7月30日水曜日

Graph縮約方法の検討 その2

 2番目の方法は、期間の中間部に途中ゲートを置く方式です。例えば、Instane15の期間は、6週間ですが、中間あたりの3週間目にゲートを置きます。


ゲートの幅(最大値ー最小値)を小さくすればするほど、グラフ容量は、小さく抑えられていることが分かります。元々が8MBでしたので、幅36にしても半分以下とすることが出来ます。

この発想を、全週に拡大したのが下図結果になります。
全週に適用すると、狭幅化が、よりグラフ容量削減効果を生むという傾向が分かります。





下図は、制約ゲート数とグラフ容量の関係です。制約箇所が多ければ多いほど、グラフ容量を削減することが出来ます。


いわば、マラソンゲート方式です。途中関門を決められた時間内に通過する、という制約を付加すると、グラフ容量を削減できることが分かりました。(イラストはCopilotで生成)

ゲートを狭くすることは、下図で、幅方向を制限することに繋がります。
状態空間を狭めてしまうということです。幅を狭めれば、グラフ容量をそれだけ削減できることになりますが、同時に、真の最適解を見逃してしまう可能性が増えます。最適解は、見逃さずに、冗長なノードだけを消去することが必要となります。



まとめると問題は、

■最適性を担保する緒元を失わずに、縮約する理論の確立

■途中関門が多ければ多いほど、効果は増大するが、コンパイル時間が増える問題への対処

にあります。

これがこれからの研究課題となります。

2025年7月29日火曜日

Graph縮約方法の検討 その1

 1)Secondary Cardinalsの削減

SchedulingBenchmarksの制約を見るとメインは、勤務時間制約で両方向から効いています。が、そのほかにも、特定のシフトに対する最大値パターン数制約があります。これをSecondary Cardinalsと呼ぶことにします。今、Secondary Cardinalsを無視して最適解が求まったとします。その最適解が、(制約していなくとも)最適解を満足するならば、最初から無視しても問題なかった、と言うことが出来ます。


当然のことながら、それは、やってみないと適用できるかどうか分からないのですが、仮に適用できたとして、どれくらいの効果があるか見てみました。

    その結果が下記グラフで、E1を削除したとき8MB→6MBになっているので、2MB約25%の効果が得られます。しかし、E1/E2の両方を削除しても全く同じ結果となりました。


従い、Secondary Constraints削除が可能ならば、それなりの効果は期待できる、ということになりますが、半分にする程の効果はなさそうだ、という結果となりました。

2025年7月28日月曜日

Instance15 の厳密解が確定

 Ryzon9700X、約一週間廻してようやく確定しました。


LB=3828

UB=3828

です。

十数年に渡り未解決だった問題の最適値が確定しました。


ルートLB=3823.64
で変わりません。

行った改善は、マルチスレッド化がメインです。その他細かい改善として、

■環境の保存で、最大10GB程度DISKを使いました

■ログもGUIの限界を超えていたのでDISKに落とすようにしました。

■その他に、CPU(キャッシュ容量32MB)の能力が大きい。

旧世代のCPUでは、全くマルチスレッド効果は期待できず、恐らく1カ月以上かかったと思います。


2025年7月27日日曜日

Updated Report for Instance15

 

Subject: Updated Report for Instance15

Dear Tim Curtois-san,
I would like to report the exact objective function value for instance15 in the scheduling benchmarks.

Lower Bound (LB): 3828
Upper Bound (UB): 3828

I have also attached an updated UB dataset that differs slightly from the version previously reported.

Thank you for your attention.
Sincerely,
Tak.Sugawara

2025年7月26日土曜日

7月16日リリース機能その6

 6)スタッフ毎のシフト・タスクの名前は、見ないのは変わりないのですが、エントリー数のチェックを入れました。スタッフ数と一致していないと読み込まないようにしました。




2025年7月25日金曜日

SchedulingBenchmarks instance15再挑戦

 マルチスレッド化して様子を見てみました。スレッド数は8にしました。下記は、テスト中の様子です。


約2日走らせて、LB=3826.6 UB=3828となっています。なので、UB=3827が発見されれば、即終了です。後、僅かのように見えますが、実際には、BranchingTreeの爆発状態にあり、終了まで2週間程度かかる見込みです。(大体こういうテストをしているとWindows強制アップデートによりテスト途中終了となってしまうのが常です。)

経験的には、ここまで来て未だUB=3827を発見できないということは、その解は本当に存在しない、すなわちUB=3828こそが厳密解である可能性が非常に高い、ということです。ただし、UB=3827解が存在しないという厳密な証明のためには、LB=3827プラスアルファとなるまでBranchingTreeをスキャニングする必要がある、ということです。たとえば、LB=3827.01となれば、整数解は、3828以上ということになります。LB=3827では、未だ、整数解が3827に存在する可能性が残ります。


CPUの稼働率を見ると、

上のように、稼働率100%とはなっていません。Hyperthreadを加味して最低50%程度稼働しているべきなのがそうなっていないのは、キャッシュヒット率によるものであると推察されます。

A)この稼働率を上げることが出来れば、速度アップとなるはずです。
B)もう一つの問題として、インスタンス23以上では、128GBRAMをもってしてもグラフ規模が大きすぎてコンパイルできない、という問題があります。

A)B)の両方を一挙に完結する方法として、グラフの縮約化があります。要するにメモリのダイエットです。厳密解を得るのに必要な緒元を失うことなしに、ダイエットを行うことは、instance15を解くことは勿論ですが、instance23を解くにも必要なことです。

この方法が実用化出来れば、アルゴリズム3の使用頻度が3%から20%位に上がるかもしれません。というのは、多くの実務インスタンスにおいてもグラフコンパイル速度がネックとなっている為です。

instance15だけを見れば、cutting plane 的なアプローチの方が適しているように思えますが、グラフダイエットこそが本丸であると思います。そしてそれは、アルゴリズム3実用化のために必要でもあります。アルゴリズム3の実用化は、これまで知られていない多くの実務インスタンスの厳密解を知るのに大きく寄与するはずです。



2025年7月24日木曜日

XML converter for Scheduling Benchmarks

 未解決のスケジューリングベンチマーク問題について取り組みを始めました。

未解決なのは、

instance15

instance23

instance24

の3問です。

検討を始めるにあたって、スケジュールナースのCSV解をAutoRosterのフォーマット(XML)に読み込ませるためのコンバータを制作しました。これまでは、IFDEFコンパイルオプションにより、AutoRosterに読み込ませる解XMLをスケジュールナース内部で生成していましたが、いちいち再コンパイルする手間をなくすのが目的です。

以下使い方です。

とりあえず、求解を中止しました。2時間程走らせてUB=3828 になっています。この値はは、菅原システムズが所持する世界記録に同じです。


解画面で、

CSVファイルで出力すると、プロジェクトファイル名+_shift.csvで、ファイル出力されます。

次にXMLコンバータ起動、求解し、出力されたファイルを指定します。
同じフォルダに、tak_solution.xml が出力されます。
AutoRosterを起動して、下記フォルダにtak_solution.xmlファイルを置いて読み込みます。

確かに、解は、Feasibleで、かつUB=3828をAutoRosterでも確認できました。

中身は、PostPythonで書いていて、INRC2用のコンバータcsv.nurse3と同じように、単なるフォーマットコンバータです。

2025年7月23日水曜日

7月16日リリース機能その5

5)Historyのダイエット


5年程お使い頂いたお客さまのプロジェクトファイルのサイズは、12MBになっていました。これは、予定での状態をスタッフ名:予定のmapを過去も記憶しているからです。通常、過去の予定を覚えておく必要はない、と思われるので、消去できるオプションを作成しました。


 以前のヒストリデータを消去:0だと、予定表示開始日より0日以前のデータが消去されます。設定ボタンを押して、スケジュールナースを終了すると、ダイエットが行われます。このお客様の場合、12MB→1.5MB程度とダイエット出来ました。


2025年7月22日火曜日

7月16日リリース機能その4

 4)ExcelファイルオープンでNGの場合、ファイルクリエートにしていましたが、既存ファイルを新規ファイルにしてしまう問題がありました。これを改善し、ファイルが存在しない場合のみ、ファイルクリエート方式に変更しました。


この変更により、例えオープン可能でも読み込み不能なシートが含まれる場合(Invalidな外部参照等が含まれる場合)には、読み込みが出来ないメッセージ(Unexpected xml tag)が出て読み込みません。新規ファイルをCreateもしません。

この場合の対処方法としては、Excelファイルに含まれるInvalidリンクを削除してください。





2025年7月21日月曜日

All optimal solutions for the 8-week INRC2

All optimal solutions for the 8-week INRC2 (Second International Nurse Scheduling Competition) have been uploaded using our newly developed solver, which is currently under active development.

These solutions have been verified using the official Validator, and the corresponding validation output is also attached.

For most instances, Schedule Nurse was able to obtain exact solutions within eight hours, although a few required nearly a full day of computation (Ryzen 9700X).

Upon completing all exact solutions for the Scheduling Benchmarks, we plan to write a research paper. Our new solver will conclusively address all instances that have remained without known optimal solutions for many years.

Schedule_Nurse3_Gallery/English/Benchmarks/INRC2/8weeks at main · sugawara-system/Schedule_Nurse3_Gallery · GitHub

2025年7月20日日曜日

7月16日リリース機能その3

 3)2026年5月24日以上、カレンダが更新できない問題の対策



カレンダマックスを2100年以上に更新しました。適用は、スケジュールナースPrivateとスケジュールナースサブスクリプションのみです。その他のエディションの適用は行わないのでご注意ください。

2025年7月19日土曜日

7月16日リリース機能その2

2) スケジュールナース のUpdate廃止


現在、3つのversionをメンテナンスしていますが、2つに集約します。

今後、スケジュールナースPrivateと、スケジュールナースサブスクリプションのみが、

今後のメンテナンス対象となります。


「スケジュールナース」は、開発に貢献した方等にも無償配布しておりましたが、スケジュールナースPrivateに移行をお願いします。該当の方は、マイクロソフトアカウントを取得の上、サポートにご連絡頂ければ、引き続き無償で使用できるようにいたします。

後述のように、スケジュールナースは、Updateしないと、2026年5月以降のカレンダが効きませんので、該当するバージョンをお持ちの方は、早めに切り替えをお願いいたします。


2025年7月18日金曜日

Q添付のファイルで予定入力のスタッフ4の2日に「希扱」の予定入力を入れた時のエラーの理由がどうしてもわかりません

 Ans.

拘束*拘束制約がハード制約となっており、先月からの連続で見るとスタッフ4が1日に拘束とならざるを得ないことと矛盾するようです。



30日にスタッフ4が拘束であることは変えようがないので、拘束*拘束制約をソフト制約化することにより解が出るようにします。



解析:
Python制約レベル7のエラーが出ています。とりあえず、この原因かどうかを判別したいので当該言語制約の✓を外して求解します。

依然としてハードエラーになりました。根本原因は、Pythonではありません。

スタッフ4関係であることは間違いなさそうなので、関係しそうなハード制約をソフト制約化
し求解の試行錯誤を行います。下記、スタッフ4の下記制約をソフト化するだけで、解が出ることが分かりました。
当該制約をソフト化したときの解です。拘束*拘束パターンが出現していることが分かります。

スタッフ4の30日勤務をブランクとすれば、ハード制約のままでもOKでした。よって、この制約が原因である、と特定できました。

以上で解析終了です。

最終的な解は、PythonをEnableして以下のように得ました。

考察
解がないときの解析は、非常に面倒です。簡単には、解がないときは、予定部をソフト化して、予定が変更になった部分に着目します。

しかし、今回、原因がない原因を追究したい、とのことでしたので、上のような手順で解析しました。上のように、具体的原因の追究は手間がかかるのが普通です。特に、ハード制約が多く、解のない原因が複数の要因による場合、真の原因に辿り着くのは容易ではありません。従い、次の指針を推奨します。

基本的には、ハード制約は、必ず実現できるものであるべきです。実現出来ない可能性があるものは、原則的にソフト制約とします。

どうしてもこれだけは実現したいというアイテムは、ハード制約化してもよいですが、その数は出来るだけ抑えるようにするようにした方がよいでしょう。