2026年5月4日月曜日

パルスアルゴリズム

一瞬パルスアルゴリズムに目移りしましたが、以下の通りの弱点があるので採用しませんでした。

なお、パルスアルゴリズムのC++実装は、 

https://github.com/lyandut/MyPulseForCSP/tree/master

にあります。


パルスアルゴリズム(Pulse Algorithm)は,ラベル設定法(Label-Setting)を“極限まで強化した双方向分枝限定法”であり,

主目的は「厳しい資源制約付き最短路問題(RCSPP)」を高速に解くことです。 特徴は“ラベルを保持しない(=DP表を持たない)”点にあります。

以下,RCSPP 文献で確立している標準的なパルスアルゴリズムの構造を,実装レベルまで整理します。

🔥 パルスアルゴリズムとは何か(要点)

  • 深さ優先探索(DFS)+強力な枝刈り(pruning)

  • ラベル(DP状態)を保持しない → メモリ使用量が極端に小さい

  • 資源制約(時間・コスト・勤務回数など)を満たすパスのみ探索

  • 下界(Lower Bound)と上界(Upper Bound)を使って強力に枝刈り

  • 列生成の pricing subproblem(RCSPP)で世界的に最強クラス

🧠 アルゴリズムの基本思想

パルスアルゴリズムは,ノード v に到達したときに次の 4 種類の枝刈りを行います。

1. 資源制約による枝刈り

累積資源 r が上限を超えたら即終了。

2. 下界(Lower Bound)による枝刈り

ノード v からゴールまでの最良下界 LB(v) を事前計算しておき,

current_cost+LB(v)UB

なら探索を止める。

3. 支配(Dominance)による枝刈り

同じノードに到達した過去のパスより劣っていれば枝刈り。

4. サイクル(Cycle)除去

DFS なので,訪問済みノードを再訪しない。

⚙️ パルスの流れ(擬似コード)

pseudo
Pulse(v, cost, resources):
    if resources violate constraints:
        return

    if cost + LB(v) >= UB:
        return

    if dominated(v, cost, resources):
        return

    if v == target:
        UB = min(UB, cost)
        return

    mark v as visited

    for each arc (v → u):
        Pulse(u, cost + w(v,u), resources + res(v,u))

    unmark v

📌 ラベル設定法との違い

項目ラベル設定法(DP)パルスアルゴリズム
状態保存多数のラベルを保持ラベルを保持しない
探索幅優先/最短路型深さ優先(DFS)
メモリ大量に必要極小
枝刈り資源制約+支配資源+支配+強力な下界
列生成との相性良い最高レベル

なぜ“パルス”と呼ばれるのか

探索が パルス(pulse)=波のように深く進み,戻り,また進む という動きをするためです。

🧩 列生成(Column Generation)との関係

RCSPP は pricing subproblem として頻出します。

  • RMP から得た DUAL を使って reduced cost を計算

  • パルスは reduced cost < 0 の列 を高速に発見

  • 特に 資源が多次元(勤務回数・連続勤務・休暇制約など) の場合に強い


パルスアルゴリズムの弱点は、強力な枝刈りと深さ優先探索による“爆発的な速さ”の裏側に、いくつか本質的な脆さがある点です。 強いところは極端に強いが、弱いところは極端に弱いという、かなりピーキーなアルゴリズムです。

以下、研究者・実装者の視点で“本当に問題になる弱点”だけを整理します。

🎯 結論:パルスアルゴリズムの主要な弱点(重要度順)

1. 下界(LB)の質に強く依存する

パルスは「LB が弱いと一気に破綻」します。

  • LB が弱い → 枝刈りが効かない

  • 枝刈りが効かない → DFS がほぼ全探索化

  • 全探索化 → 指数時間で爆死

つまり、

LB が強いと最強、弱いと最悪

という極端な性質を持ちます。

孝幸さんのように ZDD や DP で強い LB を作れる人には向いていますが、 一般の実務者には扱いが難しい理由がこれです。

2. 資源次元が多いと急激に弱くなる

資源次元が増えると:

  • 支配判定が効きにくくなる

  • LB の計算が難しくなる

  • DFS の探索空間が爆発する

特に 5 次元以上の資源制約では、パルスは急激に性能が落ちます。

3. 深さ優先探索ゆえに“運が悪いと”最悪ケースに落ちる

DFS は探索順序に依存します。

  • 良い順序 → 最適解にすぐ到達 → UB が早く更新 → 枝刈りが効く

  • 悪い順序 → 最適解に全く届かない → UB が更新されない → 枝刈りが効かない

つまり、

探索順序の設計が悪いと、指数時間に落ちる

4. 並列化が難しい

DFS+強い枝刈りという構造は、並列化と相性が悪いです。

  • スレッド間で UB を共有する必要がある

  • 探索順序が変わると性能が大きく変動

  • LB の更新も同期が必要

結果として、

パルスはマルチスレッド化してもスケールしにくい


 

5. 実装が難しい(バグりやすい)

パルスは:

  • 支配判定

  • LB の適用

  • UB の更新

  • サイクル除去

  • 資源制約のチェック

など、複数の枝刈りが複雑に絡むため、 少しでも条件を間違えると:

  • 最適解を落とす

  • 不正な枝刈りが起きる

  • infeasible と誤判定する

という“致命的なバグ”が発生しやすいです。

6. 最適解が高コスト側にあると弱い

パルスは「良い UB が早く見つかる」ほど強い。

逆に、

  • 最適解が高コスト

  • 低コストのパスが存在しない

  • UB がなかなか更新されない

というケースでは、枝刈りが効かずに弱くなります。

🧩 まとめ:パルスは“尖った武器”

パルスは、 LB が強く、資源次元が少なく、探索順序が良いときに最強 という、非常に尖ったアルゴリズムです。

逆に、

  • LB が弱い

  • 資源次元が多い

  • 探索順序が悪い

  • UB が更新されない

という状況では、 指数時間で破綻するという明確な弱点があります。

結論から言うと、パルスアルゴリズムはキャッシュ特性が“かなり悪い”部類に入ります。 これはアルゴリズムの構造的に避けられない弱点で、実際に実装してみると L1/L2 ミスが多発し、CPU の IPC が落ちやすいタイプです。

実装・最適化レベルで RCSPP を扱う人が気づくのは、むしろ自然です。

🔥 なぜパルスはキャッシュ特性が悪いのか(本質的理由)

1. 深さ優先探索(DFS)はアクセス局所性が低い

パルスは DFS でグラフを深く潜るため、

  • 次にアクセスするノードが予測しにくい

  • メモリ上で連続していないノードに飛ぶ

  • CPU のプリフェッチがほぼ効かない

結果として、

キャッシュミスが多発し、メモリアクセスがボトルネックになる

これは BFS やラベル設定法(DP)と比べて明確に不利です。

2. ラベルを保持しない=DP テーブルがない → 局所性が生まれない

ラベル設定法は DP テーブルを持つため、

  • 同じノードのラベルを何度も参照

  • メモリ局所性が自然に発生

というメリットがあります。

一方パルスは、

  • ラベルを保持しない

  • 状態をほぼ持たない

  • 毎回新しいパスを深く探索する

ため、局所性がほぼゼロです。

3. LB(下界)テーブルへのアクセスがランダム

パルスの強さは LB に依存しますが、LB の参照は

  • ノード v に到達するたびに LB[v] を参照

  • DFS の順序はランダム

  • LB テーブルのアクセスもランダム化

つまり、

LB が強いほど LB 参照が増え、キャッシュミスも増える

という皮肉な構造になっています。

4. 支配判定(dominance check)がランダムアクセスを増やす

支配判定は通常、

  • ノードごとに「過去の到達状態」を保持

  • DFS の順序に依存してランダムに参照

  • 状態数が増えるほどキャッシュミスが増える

特に資源次元が多い場合は顕著です。

5. スタックが深くなるとレジスタ・L1 が圧迫される

パルスは深い DFS を行うため、

  • 再帰スタックが深くなる

  • ローカル変数が多くなる

  • レジスタが足りず spill が発生

  • L1/L2 キャッシュに溢れる

という現象が起きやすいです。

📌 まとめ:パルスは“キャッシュに優しくないアルゴリズム”

構造的に、

  • DFS

  • ランダムアクセス

  • ラベル非保持

  • LB 参照の多発

  • 支配判定のランダム性

が重なるため、キャッシュ効率は悪くなるのが宿命です。

2026年5月3日日曜日

Q.勤務時間を制限する条件は使用しない方が良いのでしょうか

 Q週に35時間制限など、看護補助者向けの時間制限条件を希望される病院が多くなってきています。


Ans.

必要であれば、使って構いません。ただし、

■時間よりは、回数制限の方が求解時間では有利になります。

■時間制約はハード制約のみです。ソフト制約はありません。

なので、可能であれば、回数制約で記述可能ならば、回数制約にすることをお勧めします。




2026年5月2日土曜日

Q.設定した条件の並び順で解が出るまでの時間に変動したりするのでしょうか。

 Ans.変動がないとは言えませんが、その程度は、制約追加よりは、小さい程度ですので、通常無視できると思います。


2026年4月30日木曜日

Q.行制約が多ければ多いほど、自動作成の時間もかかる認識に相違ございませんでしょうか

 Ans.はい。一般的には、解空間をより狭めることになるので、そういう傾向にはなります。より詳細には、問題の解領域には、二つの領域があると考えられます。

■一つは、SAT空間

■もう一つは、Optimize空間です。

言い換えるなら、SAT空間は、Hard制約空間です。問題は

■Hard制約を全て満たした上で、

■最適解を得る

二つのステップからなることに注意します。

題意は、明らかにHard制約空間を狭めることになると思うので、SAT解/探索空間比を狭めることとなり、探索時間はよりかかる、ということになります。

一方、Optimize空間、言い換えるとSoft制約空間の観点でみると、必ずしも上記傾向にはならない、ということが言えます。

ハード制約主体のインスタンスならば、より時間がかかる傾向となりますが、ソフト制約主体のところに、ハード制約が追加されると、解空間を狭めると同時に探索空間も狭めます。結果、SAT解/探索空間比が大きくなれば、より解を見つけ易くなる方向に作用します。

よって、ソフト制約主体のインスタンスでハード行制約を強化する記述を追加すれば、むしろ時間節約になる可能性が高くなります。ソフト行制約を追加すれば、やはり時間は増える傾向になるでしょう。

結論として、一般的な傾向としては、確かに、制約追加により時間が増加する認識は間違っていないと思いますが、ハード制約・ソフト制約によってその意味と作用は異なります。

まとめとして、

■ソフト行制約追加ならば、時間は増える

■ハード行制約追加ならば、

 ●ハード制約主体のインスタンスなら時間は増える

 ●ソフト制約主体のインスタンスなら時間は減る可能性がある


2026年4月29日水曜日

Q.ハード制約矛盾でも解が出るようにして欲しい

 Q.必須条件が違反していると自動作成できないのが現在のソルバだが、必須の条件も許容して自動作成できるようにしてほしい

Ans.

これは大変難易度が高い問題です。上記を言い換えると、

1)絶対守らないといけない制約同士の矛盾を緩和して

2)解があるようにして(make feasible)

3)最適化(optimization)

ということを行うということと同じことです。実は、AL1の原因解析機構は、上記そのものを行っています。ですから、既にやれることはやっている、とも言える訳です。

実は、この問題、昔から指摘しているのですが、誰も手をつけようとしていない学術問題で、恐らくはNP困難な領域だと思います。緩和解は無数にあり、どれが最適かは、さらに難しいと思います。

make feasibleの部分に関しては、AL1とは別にAL3のアプローチも考えられます。

詳細を、今、述べることは出来ませんが、AL1での弱点を補うアプローチは考えることが出来、それはAL1自体では、実現不可能ということです。つまり、全く別のソルバが必要になる、という大変に大きなテーマとなります。現在、AL3の根源的な再設計・研究開発を進めており、これが終わり次第、上記テーマに取り組みます。長い時間がかかって申し訳なのですが、次世代でのアルゴリズムとして組み込みます。

2026年4月28日火曜日

Q,解が思い通りの挙動にならない

 Q.今月に関して13日の午後のみ4名全員出勤にしたいと思いまして、いつも決まっている列制約の3行目:月火水の午後は3名をソフト制約にして、28行目の全員出勤日は午後4名をハードにしたところ、どうしても12日の午後が2人になってしまい、思い通りの挙動になりません。

この時々ある特別な変更はどう設定すればよいでしょうか?

多分、スタッフの行制約との絡みなのですが、もしそうなら、人数の方を優先して解が出ないようにして、スタッフ側で調整したいのです。

Ans.

まず、考えられるのは、想い描いている状態が、ハード制約上の矛盾を孕んでいる可能性です。

現在の状態を確認しました。

確かに12日が2名になっております。

1)月火水の午後は3名をソフト制約にして、

2)28行目の全員出勤日は午後4名をハードにしたところ、

3)どうしても12日の午後が2人になってしまう

そこで、まず、ソフト制約化した制約をハード制約に戻しました。

すると、解のない状態となりました。解要因の日が12日だけではないことから、12日以外で、解がない事態が考えられます。そこで、原因を分離するために、12日だけに効くハード制約を記述しました。

これで求解してみると、やはり解が無い状態が再現します。


このことが意味しているのは、12日にだけ効く制約と矛盾がある、

■12日の午後が3人

■13日午後4名

が物理的に相いれない状態になっている、ということです。上にその要因が列挙されています。試しに、5連休関係の制約を無効または、ソフト制約化してみます。


こうすると解がありました。

あるいは、関係する予定をソフト化します。

このようにして、要因として列挙されているハード制約をソフト化することで、目的のハード制約を満たしたまま、解を得ることが出来ます。


その他にも要因は示されているので、別な緩和策はあると思います。以上が、とりあえず、ご要求を満足させるやり方の例になります。緩和策は、実は無数にあり、何が適切な緩和かは、管理者だけが知っているので、ここではあくまで例ということでご承知ください。

<この時々ある特別な変更>

xxさまのプロジェクトは、通常のプロジェクトとは異なります。通常は、ハード制約を設定したらそこの制約はいじりません。それがルールということです。ところが、小人数であるが故だと思いますが、そのハード制約を変更の変更が元で大変な変更になってしまっています。通常スタイルでは、ルールを決めたら(ハード制約を決めたら)後は予定のソフト化で対応するのが基本です。(推奨している記述スタイルです。)

予定の方をハード制約とするとその都度、制約を見直す必要になることはご承知の通りです。

xxさまのプロジェクトは、色々なノウハウが詰まっていて、私がどうこう出来るプロジェクトでは、もはやありません。

スタッフの予定を最優先のハード制約とするなら、列制約・行制約共にソフト制約化すべきでしょう。大事なことは、何をハード制約するか?です。これがぶれると、土台を弄るようなもので、しばしば大変な変更を伴ってしまいます。

まとめとして、

■上記の観点も盛り込み、

■今回のような機に、整理統合を心掛けながら、

■プロジェクトを鍛え育成して頂けたら、


さらに使い易くなっていくのではないかと思います。







2026年4月26日日曜日

ラベル設定法 先は未だ長い

 ようやくInstance13で、ラベル設定法によるLBが出るようになりました。下記は、LB=1348までに到達するまでの時間比較結果です。

label setting algorithm:83sec

Current AL3:117sec

恐らく、幾多の研究者が、Instance13での求解に手間取った筈で、ラベル設定法によるLB解の提示が行われたのは、世界初と思います。ラベル設定法は曲者でして、数々の関門があります。その関門をくぐり抜けた者だけがInstance13のLB解に辿りつけます。ここまで来るにもかなり苦労しました。

しかしながら、さらに数十倍の巨大なインスタンス(instance22/23/24)に対しては、現在無力です。具体的には、

1)ラベル数の爆発が抑えられていない

2)求解時間がかかりすぎる Instance23で300sec -3600sec/iteration

3)メモリ所要 11GB/roster


目標は、60sec/iterationですから、あと60倍程度高速化しないと使い物になりません。控えている改善アイデアをさらに投入すれば、なんとかなるだろうと見ていますが、それも未だ分からない、といった状況です。ちなみにMIPソルバによる求解では、2000secを下回ることはありません。