2026年2月13日金曜日

MDDグラフの削減方法

 次は、生成したInstance13,staff1のMDDグラフ全体グラフです。


Root付近(Day0)付近の拡大図です。


この図から、

Root→

D0_0,D0_4,D0_5,D0_6

に行くパスが分かります。D0は、Day0の意味、その後の数値は、加算値計になります。シフト時間としては、8時間、10時間、12時間、休みは0しか存在しないので、以降あり得るシフトの加算を行っているだけです。

 次は、終端付近の拡大図です。制約は、132時間から、144時間までなので、4週間28日の最終日は、66から、72までしか存在できません。

緑のノードは、終端(D27に到達するノード)に到達することはないノードになります。ハード制約、終端で132時間から144時間を満足できないということになります。

<緑のノードのマーキング方法 Reverse Reduction Technique>

終端から始点に向かってスキャンします。到達したノードには、到達したとマークしておきます。マーク済(メモ化)ならば、スキャン済なので、それ以上、上に上がる必要はありません。こうして、終端から到達可能な全ノードスキャンすることが出来ます。Visitしていないノードは、マークされません。マークされないノードを緑にマークしています。

さらなる削減方法として、

<単一方向、値無変化ノードの統合削減>

Day26は、休みです。なので、値に変化はなく単一→のみです。なので、D26ノード群は統合スキップしても問題ありません。

ここまでは、MDDグラフ上で削減出来ます。しかし、未だ削減できるところはあります。


黄色の部分は、Day11日に合計値Max72に到達し、以降終端Day27までづっと休み(=0)の加算が行われるPathになります。そのようなパスはあり得るでしょうか?月の後半前からずっと休みのイメージになります。気持ち的には、あり得ないのですが、MDDグラフは、終端に到達するあらゆる合計パターンを列挙していることになるので、このようなパターンも含むことになります。

しかし、下図のように、連続勤務禁止や、単一休み禁止制約がハード制約であることにより、上のPathは、あり得ないことになります。


さらに、雑多なハード制約群もあります。


これらまで考慮すれば、MDDの幅を削減できることになります。その方法は、別途にして、


ここでの知見は、MDDの幅部分です。幅は、その日にあり得る合計値の最小から、最大までの合計値を表しています。最大部分は、真ん中付近で、最小0-最大72まで存在します。

しかし、考えてみてください。月の真ん中まで、全く勤務していなかったり、月の最大時間まで既に勤務している、という状態はあり得るでしょうか?

実務上の制約では、連続休みの最大数を制約すれば、幅部分は簡単に削減できることに注意してください。ベンチ上の制約では、単一休みの禁止しか入っていないのですが、実務上の制約は、もっと長い連続休みが実質的に禁止の筈です。夜勤回数がある程度多ければ、自動的にこの制約は課されるので、実務制約では、上のMDDPath総数よりも状態数は、かなり少ないと考えられます。

上はハード制約ですが、ソフト制約では、状態削減(枝刈り)ができないことがお分かりでしょう。これが、ソフト制約があると重たくなる理由です。

普通のインスタンスでは、MDD化することはせず単純に加算器によって制約しています。今回は、超大規模インスタンスであり、特殊ケース対応のためMDD化を検討しています。






2026年2月12日木曜日

EncodeにMDDを使う

Instance24 TimeConstraint制約用です。 

新たな試みとして、EncodeにMDDを使います。MDDはMulti Valued Decision Diagramの略です。BDD/ZDDは、2値のGraphで、枝は、2本まで。MDDの場合は、多値のGraphになるので、2本以上の枝になります。

グラフは、GraphViz、DotEditorで表示させています。MDDは、本来、多方向のEdge(⇒)があるのですが、Graphがバグっていて、未だそうなっていません。

これで何が嬉しいかというと

1)極限まで状態を圧縮できる

2)アーク整合性が保てる

の2点です。

アーク整合性については、以下AI回答参照。ここで、伝搬力が強いとは、要するに良い解が早く出てきやすい、ということです。


アーク整合性(Arc Consistency)は、**制約充足問題(CSP: Constraint Satisfaction Problem)**で使われる基本的かつ重要な概念です。
特に、SAT/PB/制約プログラミングに強いあなたなら、より深いレベルで理解しておくと後のアルゴリズム設計にも効いてきます。


🔷 アーク整合性とは何か

CSP は

  • 変数 (X_1, X_2, \dots)
  • 各変数のドメイン(取り得る値の集合)
  • 変数間の制約

から構成されます。

**アーク整合性(Arc Consistency)**とは、
二項制約 (C(X, Y)) に対して、X の各値が Y のドメイン内に少なくとも1つの「サポート(support)」を持つ状態
を指します。


🔷 直感的な説明

変数 (X) の値 (x) が、制約 (C(X, Y)) を満たすような (Y) の値 (y) を1つも持たないなら、
その値 (x) は絶対に解にならないので削除してよい

これをすべてのアーク(有向辺)について繰り返し、
ドメインを前処理で削っておくのがアーク整合化(Arc Consistency Enforcement)。


🔷 形式的な定義

制約 (C(X, Y)) に対して、アーク (X \rightarrow Y) が整合であるとは:

[ \forall x \in D(X),\ \exists y \in D(Y)\ \text{s.t.}\ (x, y) \in C(X, Y) ]

つまり:

  • (X) の各値 (x) は
  • 制約を満たす (Y) の値 (y) を
  • 少なくとも1つ持っていなければならない

🔷 例で理解する

変数:

  • (X \in {1,2,3})
  • (Y \in {1,2})

制約:

[ X < Y ]

このとき:

  • (X=3) は (Y) のどの値とも (3 < y) を満たさない
    削除される

結果:

  • (X \in {1,2})
  • (Y \in {1,2})

これがアーク整合化。


🔷 アーク整合性のアルゴリズム(AC-3)

最も有名なのが AC-3

  • 各アークをキューに入れる
  • アーク (X \rightarrow Y) を取り出して整合性チェック
  • ドメインが削れたら、関連アークを再度キューへ
  • キューが空になれば終了

計算量は最悪 (O(ed^3))(e: 制約数, d: 最大ドメインサイズ)。


🔷 アーク整合性の位置づけ

アーク整合性は 局所整合性(local consistency) の一種で、他にも:

整合性レベル 説明
ノード整合性 単変数制約を満たす
アーク整合性 二項制約を満たす
パス整合性 3変数間の整合性
k-整合性 k変数の部分問題が整合

アーク整合性は「軽量で効果が高い」ため、実用CSPソルバーで広く使われています。


🔷 SAT/PB/ソルバー視点での理解(あなた向け)

あなたの専門領域に寄せると:

  • アーク整合性は 単純なレベルの前向き推論(forward checking)
  • SATでいう 単位伝播(unit propagation)より弱い
  • PB制約では ドメイン削減の一種 とみなせる
  • 強い整合性(例:GAC)は より強い伝播 に相当

特に、全体の探索木を大幅に削る効果があるが、完全な解決にはならないという点が重要。


🔷 もっと深く知りたい方向け

  • GAC(Generalized Arc Consistency)との違い
  • アーク整合性と SAT の単位伝播の比較
  • アーク整合性を強化したアルゴリズム(AC-4, AC-2001)
  • PB制約におけるアーク整合性の類似概念
  • ソルバー内部での実装戦略(ウォッチリストなど)

このあたりも掘り下げられます。


必要なら、

  • 図解
  • 擬似コード
  • SAT/PBへのマッピング
  • 実装テンプレート
    なども作れますよ。

アーク整合性(Arc Consistency)は、**制約充足問題(CSP: Constraint Satisfaction Problem)**で使われる基本的かつ重要な概念です。
特に、SAT/PB/制約プログラミングに強いあなたなら、より深いレベルで理解しておくと後のアルゴリズム設計にも効いてきます。

アーク整合性(Arc Consistency)と SAT の単位伝播(Unit Propagation)は、どちらも 制約の伝播(constraint propagation) によって探索空間を削る技術ですが、性質も強さもかなり違います。
あなたの専門領域に合わせて、理論的な比較実装レベルの比較の両面から整理します。


🔷 1. どちらも「局所的な伝播」だが、強さが違う

観点 アーク整合性 (AC) SAT の単位伝播 (UP)
対象 CSP の二項制約 CNF 節
削除するもの 変数のドメイン値 リテラルの真偽値
伝播の強さ 弱い 強い(AC より強力)
完全性 不完全(解を決められない) 不完全(だが AC より強い)
伝播のトリガー ドメイン削減 節が単位節になる

SAT の単位伝播は、アーク整合性より常に強いと知られています。
理由は後述します。


🔷 2. アーク整合性の本質:値に「サポート」があるか

アーク整合性は、制約 (C(X, Y)) に対して:

[ \forall x \in D(X),\ \exists y \in D(Y)\ \text{s.t.}\ (x, y) \in C ]

つまり:

  • (X) の値 (x) が
  • 制約を満たす (Y) の値を
  • 少なくとも1つ持つかどうか

をチェックするだけ。

値レベルの削除が基本で、
「この値は絶対に使えない」と分かったときだけ削る。


🔷 3. SAT の単位伝播の本質:節が単位になったら強制代入

CNF 節:

[ (l_1 \lor l_2 \lor \dots \lor l_k) ]

が、他のリテラルがすべて偽になったとき、残り 1 つのリテラルを 強制的に真にする

例:

[ (x \lor y \lor \neg z) ]

  • (y = \text{false})
  • (\neg z = \text{false})(つまり (z = \text{true}))

なら、残る (x) は 必ず true

これは 値削除ではなく、変数の値を確定させる という点で AC より強い。


🔷 4. なぜ単位伝播はアーク整合性より強いのか?

SAT の CNF は CSP の二項制約より表現力が高く、
単位伝播は 節の構造を利用して強制代入を行う

一方、アーク整合性は 二項制約のサポートチェックしかできない

例:AC では削れないが UP では削れるケース

制約:

[ X \lor Y ]

CSP 風に表すと:

  • (X, Y \in {0,1})
  • 禁止組み合わせ:((0,0))

AC を適用すると:

  • (X=0) は (Y=1) がサポート
  • (X=1) は (Y=0,1) がサポート
  • (Y) も同様

どの値も削れない

しかし SAT では:

  • (X = 0)
  • (Y = 0)

が同時に起きたら節が偽になるため、
単位伝播は より早く矛盾を検出できる。


🔷 5. 形式的な関係:UP は AC より強い

研究では次が知られています:

  • SAT の単位伝播は CSP のアーク整合性より強い伝播を行う
  • ただし、CSP の GAC(Generalized Arc Consistency)は UP より強い場合もある

つまり:

[ \text{AC} \ <\ \text{UP} \ <\ \text{GAC} ]

という階層が成立する。


🔷 6. 実装レベルの比較(ウォッチリスト vs AC-3)

観点 アーク整合性(AC-3) SAT(UP + ウォッチリスト)
データ構造 制約グラフ、ドメイン 節、リテラル、ウォッチリスト
トリガー ドメイン削減 リテラルが偽になる
再チェック 関連アークを再投入 ウォッチしている節のみ
計算量 (O(ed^3)) 実用上ほぼ線形
実装の複雑さ 中程度 非常に最適化されている

SAT ソルバーのウォッチリストは、
単位節を効率的に検出するための最適化で、
AC-3 よりはるかにスケールする。


🔷 7. あなたの領域(PB/SAT/ソルバー設計)に寄せたまとめ

  • アーク整合性は 弱い前処理
  • SAT の単位伝播は より強い前処理+強制代入
  • SAT のウォッチリストは AC-3 より効率的
  • PB制約では ドメイン削減(bound consistency) が AC に近い
  • GAC は UP より強いが、計算コストが高い

🔷 8. さらに深く比較したいなら

次のテーマも掘り下げられます:

  • UP と GAC の厳密な比較(例:Horn 節 vs 非 Horn 節)
  • PB制約における UP の類似物(cutting plane, pseudo-Boolean propagation)
  • SAT のウォッチリストと AC のデータ構造の対応関係
  • CSP を SAT にエンコードしたときの伝播強度の変化

どこまで深掘りしますか。
あなたなら、GAC と UP の比較まで行くとかなり面白い議論になりますよ。


2026年2月11日水曜日

instance24のTime Encode失敗

 ネックになっているのは、時間制約です。


休みY以外は、8,10,12時間のシフト時間となります。(OECD諸国の中で16時間連続勤務が常態化している国は少数で、欧州ではEU労働時間指令により

連続勤務は最大13時間程度

24時間内に11時間の休息義務

などの強い規制が一般的です。)



各スタッフ毎のシフトは、バラバラです。なので、SymmetryBreaking手法が使えません。

幸い、8,10,12⇒4,5,6に限定することは、出来ます。これをUnary表現したのが次です。


これを加算してMax/Min制約化したのですが、列制約を除いても1時間以内にfeasible な解を求めることは出来ませんでした。残念。

ところで、このインスタンスをよく見ると、Time制約幅が狭小であり、係数も0,4,5,6に限られています。

計数制約は、他に沢山あるのですが、解空間は、ほぼTime制約で決まっているように思います。制約幅が、狭小であることを勘案すれば、もう少し工夫を凝らせそうです。

この辺は、私でもやってみないと分からない領域です。試してダメだったら理由を後付けで考える、ということの繰り返しです。

このモデルは、物凄く簡単です。もしも、時間制約が15分単位で、種類が沢山あるということなら、1年という長期間の間に簡単に、爆発してしまいます。逆に言うと、簡単なモデルだからこそ、1年という長期間に計算モデルが爆発しないでいられる、ということです。

その意味で、時間制約は、一般に、慎重を要する制約となります。

2026年2月10日火曜日

AI時代だからこそ国語力

 AI時代の高等教育から消えるプログラミング言語、米スタンフォード大が「人間の言語」を重視する理由とは(朝鮮日報日本語版) - Yahoo!ニュース


スケジュールナースを操作するのに、プログラミング言語経験よりも大事なのは国語力、というお話しは、何度もしてきたのですが、上の記事を見るにつけ、時代が追いついてきた、と感じます。

2026年2月9日月曜日

Satlutionの衝撃

 NVIDIAの 

Autonomous Code Evolution Meets NP-Completeness

の論文をコパイにまとめてもらいました。


2025優勝ソルバにたいして相当の向上が見られ、それは、単に過去ソルバの良いところ取りに留まらず、自律的新アルゴリズムを発見した、

ということのようです。

これまで、LLMが出来るのは、パラメータの調整だけだと思いこんでいたのですが、間違っていました。

ここまで到達すると、もはや「研究者は不要」、という領域に入ってくるかもしれません。新しいアルゴリズムを考えるより、如何に賢いAIを育てるか?の方が焦点になる可能性があります。

恐らく、2024SATCompetitionが、優勝者が人間だった最後の年で、以降、全てAIになるのではないかと予想します。(2025の優勝者はAIでした)

SAT Competitionは、SATソルバ界隈での最高競技会でありトップ研究者達の集まりです。

ソースは全てオープンであるが故に、結果、多くの知恵が集まり多くの研究成果が生まれました。しかし、オープンであるが故にAIの餌食となってしまった、とも言えます。人類の知恵は、論文に集積されていますが、数秒で新しい論文を理解してしまう知能と、眠ることのない存在に、もはや勝ち目はないのでは?とも思います。AIと抽象的・数学的・技術的な会話をすること自体は楽しいのですが、同時に、技術的な議論を通じて、現在自分が研究している最先端(極めてニッチな領域ではありますが、人類の知恵の先端)を除いて、敵うことのないメンター的知性を持った存在、という印象をさらに強く抱いている次第です。それも論文化してしまうと、瞬く間にそれを理解・吸収してしまい、底知れぬモンスターに成長するのでは?と危惧しています。



Q.2025優勝ソルバとの比較

結論から言うと 「はい、明確に増えています」
あなたが開いている論文 “Autonomous Code Evolution Meets NP-Completeness” の記述によれば、SATLUTION は SAT Competition 2025 の Winner(AE_kissat2025_MAB)よりも多くの問題を解いています。 arxiv.org


🧩 解けた問題数の比較(論文の記述より)

論文の Figure 2(Cactus Plot)に明確に書かれています:

  • SATLUTION のトップ 3 ソルバー

    • 解いた問題数:347, 345, 344
  • SAT Competition 2025 Winner(AE_kissat2025_MAB)

    • 解いた問題数:334
  • 2nd place(kissat-public)

    • 解いた問題数:331

つまり、SATLUTION は Winner より 10〜13 問ほど多く解いています
これはかなり大きな差で、特に中〜難問領域(1000〜4000秒帯)で差が開いていると論文は述べています。 arxiv.org


📌 まとめ

  • 解けた問題数は増えているか?
    → はい、Winner より明確に増えています。

  • どれくらい増えたか?
    → 約 10〜13 問多く解いた(347 vs 334)。

  • どの領域で強かったか?
    → 中〜難問帯で Winner が止まった後も SATLUTION は解き続けた。


必要なら、

  • SAT/UNSAT 別の比較
  • PAR-2 スコアの詳細
  • 2024 ベンチマークでの比較
    なども整理できます。



Q.過去ソルバの良いところ取りだけではないの?


結論から言うと 「半分正しいが、それだけでは不十分」 という答えになります。
SATLUTION(論文中の表記は SATLUTION)は、確かに 過去ソルバの良いところ取り(hybridization)を行っている のですが、実際にはそれを はるかに超える進化的プロセス を実行しています。

以下、論文内容に基づいて整理します( arxiv.org)。


🧩 SATLUTION がやっていることは「良いとこ取り+自律的進化」

① 良いところ取り(hybridization)は確かに行っている

論文では、初期状態として SAT Competition 2024 の 5 つの強力なソルバを seed として与えています。

  • kissat-sc2024
  • kissat-mab-dc
  • kissat-mab-binary
  • BreakID-Kissat
  • AMSAT

SATLUTION はこれらのコードベースを読み込み、
互いの強みを組み合わせる方向に進化する と明記されています。

“SATLUTION made rapid progress in the first 5–10 iterations, quickly lowering PAR-2 by combining complementary strengths from the different seed solvers.”
( arxiv.org

つまり、初期段階ではまさに「良いところ取り」をして性能を底上げしています。


② しかし本質は「自律的な新規アルゴリズム発見」

SATLUTION の特徴は、単なるマージではなく 新しいヒューリスティックやアルゴリズムを自動生成する点 にあります。

論文では、進化の過程で以下のような 新規の最適化手法 を自律的に発見したと書かれています:

  • Multi-UIP clause learning の新しいバリエーション
  • Bandit(多腕バンディット)による UIP depth の動的調整
  • Vivification の SAT/UNSAT 感度分析と動的制御
  • Adam-like updates を使った reward tuning
  • Multi-domain bandit による複数ヒューリスティックの協調制御
  • BreakID の統合による対称性検出
  • Compressed watch list architecture の導入

これらは単なる「良いところ取り」ではなく、
既存ソルバにも存在しない新規アイデア です。


③ さらに、ルールベースと自己進化ルールにより「設計思想」まで進化

SATLUTION はコードだけでなく、
自分自身の進化ルール(rulebase)も自動で更新する という仕組みを持っています。

  • forbidden patterns(禁止パターン)の自動追加
  • correctness rules の強化
  • logging / documentation rules の自動更新
  • failure patterns を学習して次の iteration に反映

これは人間の開発プロセスに近い「メタ進化」であり、
単なるソルバの合体では到達できない領域です。


🔍 まとめ:良いところ取りは「入口」であり、本質はもっと深い

観点SATLUTION の実際
過去ソルバの良いところ取り?YES(初期段階で大きく寄与)
それだけ?NO(中盤以降は新規アルゴリズムを自律生成)
進化の本質ルールベース+フィードバックによる 自律的コード進化
最終的な成果2025 Winner を超える性能(347 solved vs 334 solved)

🎯 結論

「良いところ取り」は SATLUTION の進化の一部にすぎず、
本質は “自律的に新しい SAT ソルバを設計する AI エージェント” です。


もし興味があれば、

  • どの seed solver のどの要素が取り込まれたのか
  • 新規に生まれたヒューリスティックの詳細
  • 進化の各 iteration の変化(Figure 8)
    なども深掘りできます。

2026年2月8日日曜日

at least とat mostの関係

SATにおいて重要な概念です。at leastとat most制約は、互いに変換可能ということになります。なので、通常はどちらかだけの制約を持てば、十分です。

Σx(i)≦kのとき、xの個数がNなら

Σ~x(i)≧N-k 

と変換できます。1の最大数がk個以下が必要なら、0の最小数がN-k個以上であれば良い訳です。

例えば、N=10,k=9のとき、1となる個数を9個以下にしたいときは、0となる個数を1個以上にすればよい、

です。

以下は、AIでの補足説明です。


リテラル数を (N) としたときの “most k” と “least k” の関係を、
直感的に理解できる図で説明します。


📘 基本の意味(前提)

  • least k
    「少なくとも (k) 個は真である」
    → 真のリテラル数が (k, k+1, …, N) の領域を表す

  • most k
    「高々 (k) 個が真である」
    → 真のリテラル数が (0, 1, …, k) の領域を表す


📊 図で見る “most k” と “least k” の関係

■ リテラル数 (N) に対する真リテラル数の軸

0        k        N
|--------|--------|

■ least k(少なくとも k 個)

0        k        N
|--------|================|
         ↑ least k はここから右側

■ most k(高々 k 個)

0        k        N
|================|--------|
 most k はここまで ↑

🎯 両者の関係をまとめた図

真リテラル数 →
0        k        N
|========|========|
   ↑          ↑
 most k     least k
(0〜k)     (k〜N)
  • most kleast kちょうど k を境界に左右に分かれる
  • つまり、
    • most k:真リテラル数が k 以下
    • least k:真リテラル数が k 以上

🔍 さらに直感的にいうと

  • most k は「真が 多すぎない」ことを要求
  • least k は「真が 少なすぎない」ことを要求
  • どちらも 真リテラル数の範囲を制約するが、
    方向が逆になっている

リテラルという言葉は、論理や制約プログラミングの世界ではとても基本的で重要な概念です。
ここで一度、丁寧に整理しておきますね。


🔍 リテラル(literal)とは?

論理式を構成する最小単位で、変数またはその否定のこと。

具体的には:

  • 変数:
    • (x), (y), (a_3) など
  • その否定:
    • (\neg x), (\neg y), (\neg a_3)

この 「変数」または「否定された変数」 をまとめて リテラル と呼びます。


🧩 例で理解する

例1:

論理変数 (x, y, z) があるとき、リテラルは:

  • (x)
  • (\neg x)
  • (y)
  • (\neg y)
  • (z)
  • (\neg z)

合計 6 個のリテラルが存在します。


🧠 なぜ “リテラル” という概念が必要なのか?

論理式(CNF、DNF、PB制約など)を扱うとき、
「真偽を持つ最小の要素」 を数えたり制約したりする必要があります。

たとえば:

  • least k
    「リテラルのうち 少なくとも k 個 が真」

  • most k
    「リテラルのうち 高々 k 個 が真」

このときの「リテラルの個数」がまさに literal count です。


🎯 直感的なイメージ

変数 x がある → リテラルは x と ¬x の2つ

ただし、制約の文脈では 「式に登場するリテラル」だけを数える のが普通です。


📌 まとめ

用語 意味
変数 真偽値を持つ基本要素
リテラル 変数またはその否定(例:x, ¬x)
リテラル数 N 制約に登場するリテラルの総数
least k N 個のリテラルのうち少なくとも k 個が真
most k N 個のリテラルのうち高々 k 個が真

必要なら、

  • CNF や PB(Pseudo-Boolean)でのリテラルの扱い
  • リテラルと節(clause)の関係
  • SAT ソルバー内部でのリテラルの扱い
    なども詳しく説明できますよ。



2026年2月5日木曜日

Cadical CHBを外部からコントロールするAPIを追加

   void set_vars_lowest_priority(std::vector<int> lits);//FEB042026

というAPIをCadicalに追加しました。decide()で、変数を選ぶのですが、基本的には、スコアが高い順番に決められます。ここで、制約している範疇の変数と、そうでない変数とでは、当然制約に関与している変数が先に実行されるべきです。それがスコアだけだとコントロールできないことが問題です。未だ制約が及んでいない変数群については、decide()を後回しして、残った帰結として、決めてやる、ことが理想です。

一方、Cadicalのdefaultモードは、VSIDSとは別にあり、基本的に新しい変数から実行されてしまいます。スコアという概念さえもなく全く外部からコントロール出来ません。

その解決策として、CHBを導入、さらにAPIによるコントロールにより、制約に関係した変数をFirst、関係していない変数を最後に持ってくることを行えるようにします。これは、現在のスケジュールナースが行っている処理であって新しいものではありません。しかしながら、今回、Cadical上では、そのようなAPIは、存在していないので、自前で改造する必要がありました。