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:
ラベルのシフト合成集合の明示。




2025年8月19日火曜日

コルスキー分解もGPU化へ

 Condensed Interior-Point Methods for Scalable Nonlinear Programming on GPUs

によれば、cuDSS の性能向上が著しいようです。未だ、Preview版ですが、そのうち正式版になることが期待されます。現在Highs ipm solverは、疎行列に対してコルスキー分解を使用していませんが、近い将来、GPUを用いた高速化が期待できます。

Linear Solver は、PDLPがありますが、高精度を必要な場合は、さほど速度アップを期待できません。その用途において補完できるのではないかと思います。

いずれにせよ、大規模問題については、GPU演算は必須の様相を呈しています。現在取り組んでいる大規模問題についてもGPU(4060TI16GB)のパワー不足が明らかですので、パワーアップを検討中です。


2025年8月16日土曜日

PDLPは、厳密解MIP向きではない

 KKT_toleranceを1e-7にすると、IPMよりもかなり遅くなりますし、それでいて精度も未だ十分ではありません。1e-4にして、推定値を求めるにはよいのですが、PDLPで厳密解を目指して最後まで通すには、不十分であると結論しました。

また、WarmStartもやってみましたが、全く効果がありませんでした。

そこで、Rootで、PDLPで推定⇒IPMに切り替えというのが、最も経済的なアプローチということになると思います。 残念ながらHIGHS IPMは、未だマルチスレッド化もされていないし、コルスキー分解のGPU化もなされていないので、相当遅いのを覚悟しなければなりません。

2025年8月15日金曜日

Instance24 AL1が動かない

AL1単独で、コンパイルを試みましたが、128GBPCでも出来ませんでした。

リソースモニタを見ると60GB程度まで消費していました。つまり最大の128GBは、消費していないので、SATソルバの限界と見ます。SATソルバの内部は、32ビットのアドレシングであり、その他のビットも割り当てられるために、有効なアドレシングは、30ビット程度です。2^30=1000万Clauses程度までです。恐らくそれを超えてしまったものと推察されます。



ちなみに、Instance23までは、コンパイル出来30GB程度でした。

Instance24は、超長大規模問題ということです。

<AL1が使えないと>

AL3中、AL1は、整数化機構として動作します。LPソルバの推定値を現実の整数世界に変換する機構として動作しています。これが使えないということは、LPソルバが整数値を出力するまで、延々とBranch&Boundを繰り返す必要があります。要するに膨大な時間を要する、ということです。

2025年8月14日木曜日

Instance23の様子を見る

<GPU側の課題>

GPUが15秒、その他が50秒程度かかっています。稼働8時間程度で、未だROOT OBJ値は得られていません。

GPUの時間は、安定しない時期もあり1分以上かかっていたときもありましたが、ここ数分みていると安定して以下のようになっていました。


未だよく雰囲気を掴めていません。PDLPの演算時間がこの程度で済んでいるならば、ISM/PDLPの選択は、PDLP一択になります。現状Defaultの精度で。

1)Double⇒Floatによる高速化

2)終段以外は、精度を落として高速化

3)WarmStart処理

等の高速化手段は未だ残っているので、これらが課題になります。WarmStartについては、何もしていません。Highs側で勝手にやってくれることを期待していますが、リリースコメントを見ると、「モデルを変えたらSetSolutionで再セットする必要がある」となっているので、効いているのかどうか分かりません。

<CPU側の課題>

CPU側の演算がネックになっています。

1)GetBasisをPDLPでも構わず使っていますが、これが動くものなのかどうか?

2)Roster演算のマルチスレッド化

3)Roster演算で初期Feasibility解を見つけられていない問題


2)について、その方法は前回レポートしました。

3)は、

初期各RosterのFeasible解を求めていますが、Timeoutで求まっていないRosterが数か所あります。Instancfe22までは、綺麗に求まっていたのですが、流石にInstance23は、各Rosterにとっても規模が大きく求まっていません。一旦でも求まれば、後はそれをベースに改善していくので、最終的にFeasibleになっていれば、それでも問題ないとも言えますが、気分的には、よろしくありません。(改善すべきです)



引き続き検証を進めます。



2025年8月13日水曜日

マルチスレッドStrategy

 二つのStrategyがあります。

一つ目は、Br&Bound自体をマルチスレッド化します。

下がこのモードで走らせたときの様子です。thr=スレッドNoになっています。

このCPUの場合コア数は、8なので8threadsで走らせています。


この構造を下図に示します。
各Thrは、各RosterのグラフをシーケンシャルにScanします。各Roster毎、ワークメモリが要りますが、Roster間では、同時に走ることはないので、最大のワークメモリを一つ用意し、それをスレッド数分だけ用意すれば十分です。一般にグラフ容量は、大きいので、対応するワークメモリもRoster分用意すると膨大なものになってしまいます。しかし、この方式では、一つのワークメモリを使い廻すので、効率がよいです。Graph演算自体は極めて高速なので、シーケンシャルで演算してもネックにはなりません。Lpソルバに対して余力が未だあるので、Br&Bound自体をマルチスレッド化します。注意するのは、このマルチスレッドが有効に働くのは、ワークメモリがCPU3次キャッシュに収まるときだけです。一般のCPUでは、Instance15規模でも厳しいです。大きな3次キャッシュを備えたCPU(32MB以上)では、効果があります。


一般のベンチマークおよび実務問題は、原則的に、このモードとなります。

二つ目は、各Roter毎にマルチスレッド化します。このモードでは、Graphは、基数制約を除く分だけコンパイルしGraph容量は極めて小さくなります。ワークメモリは、各Roster毎に用意しますが、容量が小さいので、ネックにはなりません。各Rosterは、マルチスレッド化されます。これは、各Roter毎に複数の求解が入り、遅い処理となるためです。メインのBranch&Boundは、マルチスレッド化は、行いません。
また、このモードは、厳密解を得られる保証がありません。基本的には、準最適解となります。本モードは、instance22/23/24用専用です。つまりグラフコンパイルが不可能なインスタンス用のみとなります。LPソルバは、GPUにする予定です。GPUは、マルチスレッドの阻害要因とはならず、(キャッシュに影響せず)独立に扱えます。




2025年8月12日火曜日

Instance24の様子を見る

 下のように基数制約を全てオフにしてコンパイルしてみました。

課題を確認するためです。


各Roster600KB程度でコンパイル出来ています。基数制約がないと全然問題ありません。
基数制約が無ければ、系としては意味のない問題ではあります。それなしでも、目的関数値は0ではない、ということが分かります。

しかし、CLPの計算時間は、最初60秒だったのが、今や600秒を超えています。
これは想定内です。

その他に、メモリ所要が多すぎるという問題が露呈しました。

Instance23 3GB

Instance24    18GB

食っています。肝心の核心に辿り着く前に、こんなに食っているのは驚きです。

この辺のダイエットも考えねばなりません。

課題

1)メモリダイエット

2)Roster基数制約をグラフコンパイルしない準最適化方法

3)MasterLP CLP⇒IPM⇒PDLP

2025年8月11日月曜日

Instance22以上では、グラフ化は困難

 同時コンパイルのテクニックを駆使したとしても、Instance22以上では、完全なグラフ化は、困難であることが判明しました。SecondaryCardinalsの3個以上の組み合わせで、メモリ的に破綻してしまいことが、複数のグラフ化方法で確認しました。

そこで、完全なグラフ化を一旦諦めて、次の方針に切り替えることにしました。

1)グラフは、基数制約以外でコンパイルする

2)Rosterの最適値・準最適値は、1)グラフを用いて複数の求解により求める

Roster毎の最適値が求まれば、系全体の最適値も担保できますが、2)で常に最適解が求められる保証はありません。2)が準最適解の場合は、系全体の最適値も準最適解となってしまいます。しかも、それなりに時間がかかってしまうことが予想されます。

どのようにして、最適解を求めるかは、後ほど検討することにして、現時点での課題をまとめます。

1)任意中間ゲートの同時コンパイル化グラフの作成

2)基数制約以下のグラフ化と複数求解によるRoster毎の準最適解導出アルゴリズムの作成

やはり、最後の難関2問は半端ないです。

2025年8月10日日曜日

Q.Excelで1日ずれる

 スケジュールナースの解をExcelにおとしたときに、1日ずれてしまいました。

先月まではこんなことはなかったです。

なぜかわかりますでしょうか。

Ans.

分かりません。スケジュールナースが出力しているのは、ExcelシートSheet1です。


それを整形して施設フォーマットに変換しているのは、Excelマクロでして、スケジュールナースの範疇ではありません。大変恐れ入りますが、マクロで作成された(施設のシステム担当の?)方に診てもらったら如何でしょうか? (少し眺めてみたのですが、どういう風にコンバートしているのか判りませんでした。)

2025年8月9日土曜日

グラフ縮約検討 その4

 Instance24を各Roster毎Highsで解いてみました。

Instance24の例えばStaff BOは、次のような基数制約が記述されています。


これに対して、Highsで解いた結果が次です。

この結果は、例えば、Days1年後、a1というシフトは、最大で222であることです。optimalが1になっているので、最適解です。この結果は、他のRosterは我関せず、ですので、これ以上は、どんなことがあってもあり得ない、ということを示しています。

で、シフトa6に関してみると、最大値71に対して制約値も71最大になっています。この場合、a6に関して、制約値とHIGHS最適値が一致しているので、制約が効いていることを示しており、制約を削減することはできない、ということを示しています。

同様に殆どの制約で一致しており、制約を削減することは出来ません。唯一シフトs2だけが、制約値より小さくなっており、この制約だけは、なくても支障ない、と言うことが分かります。


instance21で見てみましょう。


この場合、シフトa2/p2/n1共、Highsの最適値は、39であり制約値46より小さいです。

つまり制約が効いていないことが分かります。instance21の場合、他のスタッフについても、同様な結果となっており、要するに全てのSecondary Cardinalsは削除しても全く問題ありません。世界記録を提出したときも、このことを別な方法で分かっていたので、グラフ合成は全く行っていなくてPrimary CardinalsのみのGraphで計算した解を提出しました。今回、Highsでも検証したのですが、Highsによっても裏付けが取れました。


このようにインスタンス毎、スタッフ毎に様相は、異なりますが、縮約の効果は期待できる場面もある、ということです。

なお、グラフだけの演算で解くことが出来ればそれに越したことはありません。今回HIGHSで最適解を解いていますが、instance21規模にしても結構な時間がかかっています。しかし、合成したグラフには、あらゆる最適解情報が詰まっており、一旦グラフ化が出来たならば、任意Daysの最適解は、経路探索によりほぼ瞬時に求まる、ということです。RCSPPの最適解は、グラフが出来たら即完了です。問題は、メモリにそのグラフを納めることが出来るか?の一点にあります。

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 = off


<結果>

下表がその結果になります。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版で行うことにしました。