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版で行うことにしました。