CP-SAT でコルンのパズルを解く

2026/09/28 5:58

CP-SAT でコルンのパズルを解く

RSS: https://news.ycombinator.com/rss

要約▶

日本語翻訳:

ルール

  • 元の意味を正確に保持する(追加、省略なし)。
  • ドキュメントの構造(見出し、箇条書きなど)を保持する。
  • 技術用語は正確に保つ(API、LLM、zero-trust は自然な日本語の対義語が存在しない限りそのままにする)。
  • トーンと確実性のレベルを維持する。
  • まとめ、説明、改変は行わず、翻訳のみを行う。

出力形式

日本語翻訳:

(ここに日本語翻訳を記述)

翻訳対象となるテキスト:

(必要に応じて貼り付けてください;そうでなければ元のテキストを繰り返します):オリジナルサマリー

本文

3D プリンターパズルの自動解法:蛮力法から CP-SAT へ

🤖 AI に任せた結果、工业レベルの手法が適用された話

退屈していた金曜日の午後、誰かが 3D プリンターで作ってくれたパズルをいじっていました。
それは**溝が刻まれた白い「コブ(cobs)」**と、**3〜10 個の粒が集まった多数の「コーンピース」**で構成される物理的なパズルです。

  • 目的: コーンピースを溝にスライドさせ、重ね合わさらずに隙間なくぴったり収めること。
  • 状況: ソフトウェアエンジニアとして 2026 年まで生きながらえる私の短命な熱中ぶりを考えると、すぐに手動での解法が退屈しました。「これらを私がやる必要はない」と判断し、Claude に解決を委ねることにしました。

少しの手間をかけて形状説明を行いましたが、コンピュータビジョン技術の進歩もあって、Claude は Python スクリプトを作成して解法を提示してくれました。
そのコードは私が独自に書くよりも遥かに洗練されており、私自身が多くのことを学ぶことができました。


🔍 私が期待していたアプローチ:再帰的バックトラック

もし私がこの問題を独自で解こうとした場合、真っ先に思い浮かぶのは**再帰的バックトラック(recursive backtracking)**です。
プログラミング入門コースでは必ず触れるべき手法であり、本質的には以下のような蛮力法(brute force)の一種です。

  1. 試行錯誤: ランダムな手を試し、合法であれば次の手を試す。
  2. バックトラック: 行き詰まって合法な移動がなくなったら、直前の手を戻して再度挑戦する。これを繰り返す。

独自の実装でできる最適化

単に選択肢を網羅的に試すだけでなく、問題構造に基づく以下の工夫が可能です。

  • 対称性の利用: コブ全体を回転させたとしても解が変わらない場合を考慮し、計算量を削減する。
  • 早期失敗判定: 「孤立した 1 つの粒しかない空間」ができたり、「どのピースも覆えない状態」になったりしたら、即座に失敗と判断して探索を終了させる。

十分に吟味された再帰的バックトラックなら、この問題に対処できるでしょう。


⚙️ クラスメソッドの真実:車輪はすでに完成していた

Claude が提示したスクリプトの最初の行を見て、直ちに自分が愚かだったことに気づきました。

from ortools.sat.python import cp_model

バックトラックという単純な試行錯誤ではなく、工業用レベルのライブラリをそのまま利用していました。
Google が提供する OR-Tools CP-SAT は、制約付き最適化問題や充足可能性(satisfiability)問題に特化して設計されています。

本質:変数と制約によるモデル化

このアプローチの本質は、以下のステップです。

  1. モデル化: 問題を「変数の集合」と「変数が同時に満たすべき制約の集合」として表現する。
  2. 変数の定義: 伝統的にバイナリ(真偽)で表現され、最適化問題では目的関数も設定される。
  3. 解探索: 数十年にわたる研究知見を活用し、すべての制約を満たす効率的な変数の設定を見つける。

コーンパズルにおける「正確な被覆問題」

コーンパズルは**「正確な被覆問題(Exact Cover Problem)」**の一種です。
各ピースと配置をバイナリ変数 $V_{i,n}$ で定義します。

  • $V_{i,n} = 1$: ピース $i$ が配置方法 $n$ で使用されている。
  • $V_{i,n} = 0$: ピース $i$ が配置方法 $n$ で使用されていない。

🛑 制約の定義

制約クラス 1:各ピースは恰好いい回数だけ使われる

各ピース $i$ に対して、以下の式で記述します。

$$ \sum_{n=1}^{N_i} V_{i,n} = 1 $$

  • 意味: ピース $V_{i,n}$ のうち正確に一つだけが 1 で、それ以外は 0 になることを保証します。

制約クラス 2:コブ上の各場所は恰好いい回数だけ覆われる

こちらは複雑に見えますが、単に面倒な作業です。
各ピースの配置について、そのピースが覆うコブ上のすべての空間を精査し、「その空間を覆うピースの集合 $C_s$」を作成します。

$$ \sum_{V_{i,n} \in C_s} V_{i,n} = 1 $$

  • 意味: 「各ピースは一回だけ使用され、各場所も一回だけ覆われる」という条件が満たされます。
  • 前提: パズルが適切に設計されている(ピースの総粒数とコブ上の空間数が等しい)ことを仮定します。これだけで必要な制約を網羅できます!

💻 クリーンなソルバー呼び出し

Claude のスクリプト自体は、すべてのピースの可能な位置を列挙する部分で複雑に見えますが、ソルバーを呼び出す部分は非常に簡潔です。

for plist in by_piece:
    m.Add(sum(v for v, _ in plist) == 1)
for clist in by_cell:
    m.Add(sum(clist) == 1)

# ... (モデル化の完了) ...

s.solve(m)

まさに手作業で丁寧に仕込んだ CP-SAT の呼び出しです。
これにより、問題の探索空間を効率的に削減し、最善の解を短時間で発見することが可能になります。


📚 結論と教訓

今後、CP-SAT を必要とするような問題が発生したら、再び車輪を自作する代わりに以下を実践すべきです。

  • 既存のソルバーを活用する: OR-Tools などの強力なライブラリを利用する。
  • ドキュメントを参照する: 必要な追加機能を仕様書で確認し、正しく実装する。

🔗 リンク情報

  • Claude との対話ログ: コーンパズルの解法について行った会話(Claude が書いた Python スクリプトを含む)
  • 作成した Sudoku ソルバー: 私たちのチームが以前作成したスルードーソルバー
  • 短講資料: 私は RC でこの話題についての短講を行いました;関連するスライド資料

同じ日のほかのニュース

一覧に戻る →

2026/09/30 4:30

米国郵政当局が偽造郵便ラベル販売サイトを閉鎖しました。

## 日本語訳: 9 月 24 日、2026 年、米国郵政検査サービス(USPS)およびパートナーとなる連邦機関は、パキスタンのカーネワール出身の33歳ファヘーム・アフラムに対する起訴状に基づき、LabelsBank.com ドメインを没収し、同サイトを閉鎖するための裁判所命令を発令した。アフラムは、合法的な USPS 配送サービス料金を回避させるため、5,100 万件を超える偽造 USPS 郵便ラベルを5,000 人以上の顧客に販売していたとされる不正ウェブサイト運営容疑で告訴された。同スキームでは、パッケージの重量、サイズ、宛先にかかわらず、ラベルあたり通常2ドルという固定価格で課金され、USPS の確認された損失は1億2,600 万ドルを超えている。調査当局は、同サイトが正当なパッケージ仕様を無視し、顧客が公式費用を回避できるよう、低価格(ラベルあたり最低2ドル)で偽造ラベルを販売していたことを突き止めた。 アフラムは、米国に対する詐欺共謀罪1件、偽造郵便切手ラベルの製造・販売罪5件、電信詐欺罪4件の容疑に直面している。マイアミ支部の郵政検査官らは、アフラムの起訴に伴い同ドメインを没収した。フロリダ南区米国検察官のジェイソン・A・レディング・キニョネス氏によると、この事件は「正当な費用を回避するため、減額された価格で偽造切手をオンラインで販売する」とされるスキームである。マイアミ支部郵政検査官のブラジスミール・ロホ氏は、「私たちの影響力は国境を超えている」と強調し、「どこから活動しても、郵政サービスを欺こうとする者どもが法廷に立たされることを示している」と述べた。今回の没収により、さらにの財務的損失を防ぎ、消費者が無自覚的に偽造商品を購入するのを防止した。当局は、同ウェブサイトは閉鎖され、アフラムに対する連邦での起訴が行われたことを確認した。すべての刑事事件において、これらの容疑はあくまで告発であり、被告人が有罪と証明されるか、またはそれまでは無罪推定を受けるのが原則である。この取り締まりは、類似のオンラインラベルリングに対する抑止となり、そのような活動は深刻な連邦上の結果をもたらす可能性があると再確認するものでもある。

2026/09/30 0:44

PS5 リラップス_EXPloit_

## Japanese Translation: 本ドキュメントは、PlayStation 5 のファームウェアバージョン 7.00 から 13.60 までのexploit に係る技術ガイドを提供し、Primary DNS を 45.56.67.85 と設定し、ペイロード配信のためにポート 9021 でリスニングすることを要する。その手法は Python の `serve.py` をローカルで実行するか、提供された HTTPS URL を訪れることで実現される。exploit は WebKit の脆弱性を活用しており、ブラウザ段階では JSC の情報漏洩と構造クローンオブジェクトプールの不整合を用いて typedarray を破損させ、カーネル段階ではアドレス漏洩と aio_multi_wait UAF レースを組み合わせることで完全な読み書きアクセスを実現する。両段階の安定性問題のため、成功には複数回の試行が必要な可能性がある。本プロジェクトは多数の貢献者をクレジットしており、目的は教育的研究および許可されたテストに限定されると明確にし、システムクラッシュ、データ損失、オンラインサービスの恒久的な禁止、デバイス所有権またはテスト認可がない機器に対する法的制限といったリスクについても警告している。

2026/09/29 21:43

デリーが電気損失を 50 パーセントから 5 パーセントに削減した方法

## Japanese Translation: デリーは電力グリッドの歴史的な変革を遂げ、頻繁な停電に悩まされ高次な信頼性を欠いていたシステムから、約 2300 万人の住民に高い安定性を供給する堅牢なインフラへと進化しました。この転換の具体例として、2026 年 8 月の独立記念日にフマイーンの陵が完全に明かりを灯したことが挙げられます。これは、二年前ほど前には市全域を麻痺させた深刻な停電と鮮明な対比を成します。当時の家計は毎日の停電により学校への送迎バスに乗り遅れたり、出勤が遅れるなどの影響を受けました。 グリッドの悪化は 1980 年代から 1990 年代にかけて進行し、大規模な財政不足を引き起こしてインフラ投資を停滞させるに至りました。2002 年初頭には老朽化した設備と窃盗による損失が 50% を超えていました。これを逆転させるためにデリーは州営の公用事業を解体し(BSES とタタ・パワーの創設)、一連の改革を実施しました:約 5 km の架空送電線を実地ケーブルに置き換える、SCADA デジタル監視システムを導入する、トランスフォーマーを更新し、コンデンサーバンクを設置する、送電線の窃盗対策として絶縁化する、デジタルメータリングを導入して請求詐欺を終息させるなどです。これらの取り組みは 2002 年の技術的・商業的損失が 50% を超えていたのを、現在の 5–6% にまで削減すると同時に、グリッドの信頼性指数を約 70% から 99.9% 以上に引き上げました。これはフランスやベルギーと同等の水準です。 現在、デリーのピーク需要は史上最高纪录である 8,748 メガワットに達しており、公用事業は石炭、天然ガス、水力発電といった多様な地域発電源を活用しながら、中央または州からの購入も実施しています。継続的な戦略には屋上太陽光の採用、詐欺検出のための人工知能の活用、コミュニティ参加プログラム(スラム地区で電気を収集する女性「アバス」による請求書配布など)、そして 24 時間・7 日体制のカイスクおよびモバイルアプリといった利便性の高い支払いオプションが含まれています。究極的には、これらのアップグレードにより家計および企業への日常的中断は消滅し、電気自動車などのモダンテクノロジーに必要な安定した電力供給を可能にしました。

CP-SAT でコルンのパズルを解く | そっか~ニュース