🚀 USolver
USolverは、組合せ最適化、凸最適化、整数計画法、非線形最適化問題を解くためのツールを公開するモデルコンテキストプロトコルサーバーです。以下のソルバーへのインターフェースを公開しています。
🚀 クイックスタート
install.py スクリプトを実行してインストールします。これにより、Claude Desktopおよび/またはCursor用のMPCサーバーがインストールされます。
uv run install.py
その後、ClaudeまたはCursorを開くと、ツールリストにMCPツール usolver が表示されます。
✨ 主な機能
USolverは、様々な最適化問題を解くためのソルバーへのインターフェースを提供します。具体的には、線形計画法、混合整数計画法、組合せ最適化、凸最適化、SMT問題などを解くことができます。
📦 インストール
install.py スクリプトを実行することで、Claude Desktopおよび/またはCursor用のMPCサーバーをインストールできます。
uv run install.py
💻 使用例
基本的な使用法
個々のソルバーの例を実行するには、個々の例モジュールを呼び出すことができます。各モジュールには、言語モデルに問題を解かせるために使用できるドキュメント文字列が含まれています。
- Chemical Engineering - 流量の連続性、圧力損失、経済的制約を持つ流体輸送システムのパイプライン設計最適化にZ3 SMTソルバーを使用
- Chained Solvers - テーブルレイアウトにOR-Tools、スタッフスケジューリングにCVXPYを組み合わせた多段階レストラン最適化
- Job Shop Scheduling - 操作の先行順序と機械の容量を考慮して、OR-Toolsを使用してメイクスパンを最小化する複雑なスケジューリング問題
- Logistics - 多段階サプライチェーンにおける輸送コストを最小化するためにHiGHSを使用した輸送ネットワーク最適化
- Nurse Scheduling - 公平性と可用性の制約を持つ看護師のシフト割り当てにOR-Toolsを使用した病院のスタッフスケジューリング
- Portfolio Theory - 資産クラス全体のリスクを制約しながら収益を最大化するためにCVXPYを使用した現代的ポートフォリオ最適化
- Production Planning - 機械、労働、材料の制約を考慮して利益を最大化するためにHiGHSを使用した製造最適化
- Resource Allocation - 予算とリソースの制限内で価値を最大化するためにHiGHS混合整数計画法を使用したプロジェクトポートフォリオ選択
- Network Flow - 流量保存制約を持つ有向グラフを通る最小コストルートを見つけるためにHiGHS線形計画法を使用した最短経路最適化
- Coin Problem - 6枚の米国硬貨が合計1.15ドルになり、さまざまな金額の両替ができない場合、どの硬貨を持っているかをZ3を使用して解く古典的な論理パズル
- Cryptarithmetic - Z3制約プログラミングを使用して、SEND + MORE = MONEYなどの暗号算術パズルを解く
- Knapsack Problem - 重量制約内で価値を最大化するためにOR-Toolsを使用した古典的な0/1ナップサック最適化
- Multilinear Optimization - 線形不等式に従って目的関数を最小化するためにZ3を使用した混合制約付き線形計画法
- N-Queens - OR-Tools制約プログラミングを使用して、N×Nのチェスボード上にN個のクイーンを攻撃しない位置に配置する
- Sparse Solver - 大規模最適化において、施設と期間を通じたメモリ効率の良いリソース割り当てのための疎行列形式を示す
高度な使用法
論理パズル
あなたと友人が標準的なコイン式自動販売機の前を通り、あなたはキャンディバーを買うことにしました。
価格は0.95ドルですが、ポケットを探してみると、あなたは1ドルしか持っておらず、自動販売機はコインしか受け付けません。
あなたは友人に声をかけ、以下のような会話をします。
あなた: ねえ、1ドルの両替を持っている?
友人: ちょっと待って。私は6枚の米国硬貨を持っているけど、合計が1.15ドルになるけれど、1ドルを両替できないんだ。
あなた: え?50セントの両替はできる?
友人: できない。
あなた: 25セントは?
友人: できないよ、それから、聞く前に言っておくけど、10セントや5セントの両替もできないよ。
あなた: 本当?そしてこの6枚の硬貨はすべて現在発行されている米国政府の硬貨?
友人: そうだ。
あなた: じゃあ、あなたの硬貨を自動販売機に入れてキャンディバーを買ってくれない?私は返しますよ。
友人: 申し訳ないけど、持っている硬貨ではできないんだ。
友人はどの硬貨を持っているでしょうか?
これを usolver に入力すると、制約システムが生成されます。
$C$ は6つの未知の硬貨の価値の集合で、$c_1$ から $c_6$ まで、それぞれセントを表す正の整数です。
$$
C = {c_1, c_2, c_3, c_4, c_5, c_6}, \quad \text{where each } c_i \in \mathbb{Z}^+
$$
$\mathcal{S}$ は、6枚の硬貨から2枚以上を選ぶすべての可能な方法の集合です。
$$
\mathcal{S} = {S \mid S \subseteq C \land |S| \ge 2 }
$$
自動販売機では50セント硬貨を使用できないとします。
$$
v(x) = \begin{cases} 0 & \text{if } x = 50 \ x & \text{if } x \neq 50 \end{cases}
$$
制約0: 6枚の硬貨の価値の合計は115セントです。
$$
\sum_{i=1}^{6} c_i = 115
$$
制約1: 1ドルの両替ができません。
$$
\forall S \in \mathcal{S}, \quad \sum_{x \in S} x \neq 100
$$
制約2: 50セントの両替ができません。
$$
\forall S \in \mathcal{S}, \quad \sum_{x \in S} x \neq 50
$$
制約3: 25セントの両替ができません。
$$
\forall S \in \mathcal{S}, \quad \sum_{x \in S} x \neq 25
$$
制約4: 10セントの両替ができません。
$$
\forall S \in \mathcal{S}, \quad \sum_{x \in S} x \neq 10
$$
制約5: 5セントの両替ができません。
$$
\forall S \in \mathcal{S}, \quad \sum_{x \in S} x \neq 5
$$
制約6: 50セント硬貨を除いた場合、0.95ドルのキャンディバーを買うことができません。
$$
\forall S \in \mathcal{S}, \quad \sum_{x \in S} v(x) \neq 95
$$
これをソルバーに入力すると、上記の制約システムが合成され、Z3で解かれ、解が返されます。
友人は: 1枚の50セント硬貨、1枚の25セント硬貨、4枚の10セント硬貨を持っています。
合計は50セント + 25セント + 40セント = 115セント = 1.15ドル ✓
正確に6枚の硬貨です ✓
現代的ポートフォリオ理論
金融の例:
目的: ポートフォリオの期待収益を最大化する
制約:
債券の割り当ては40%を超えてはならない
株式の割り当ては60%を超えてはならない
不動産の割り当ては30%を超えてはならない
商品の割り当ては20%を超えてはならない
すべての割り当ては非負でなければならない
総割り当ては正確に100%に等しくなければならない
ポートフォリオの総加重リスクは10%を超えてはならない
与えられたデータ:
期待収益: 債券8%、株式12%、不動産10%、商品15%
リスク係数: 債券2%、株式15%、不動産8%、商品20%
これは、言語モデルによって凸最適化問題にコンパイルされ、cvxopt で解くことができます。
$$
\begin{align}
\text{最大化} \quad & 0.08x_1 + 0.12x_2 + 0.10x_3 + 0.15x_4 \
\text{制約条件} \quad & x_1 + x_2 + x_3 + x_4 = 1 \
& x_1 \leq 0.4 \
& x_2 \leq 0.6 \
& x_3 \leq 0.3 \
& x_4 \leq 0.2 \
& 0.02x_1 + 0.15x_2 + 0.08x_3 + 0.20x_4 \leq 0.10 \
& x_1, x_2, x_3, x_4 \geq 0
\end{align}
$$
ここで:
- $x_1$ = 債券の割り当て
- $x_2$ = 株式の割り当て
- $x_3$ = 不動産の割り当て
- $x_4$ = 商品の割り当て
答えは次の通りです。
債券: 30.0%
株式: 20.0%
不動産: 30.0% (許容最大値)
商品: 20.0% (許容最大値)
最大期待収益: 年率10.8%
Z3
化学工学の例:
次の要件を持つ水輸送パイプラインを設計するために `usolver` を使用します。
* 体積流量: 0.05 m³/s
* パイプの長さ: 100 m
* 水の密度: 1000 kg/m³
* 許容最大圧力損失: 50 kPa
* 流量の連続性: Q = π(D/2)² × v
* 圧力損失: ΔP = f(L/D)(ρv²/2)、ここでf ≈ 0.02(乱流の場合)
* 実用的な制限: 0.05 ≤ D ≤ 0.5 m、0.5 ≤ v ≤ 8 m/s
* 圧力制約: ΔP ≤ 50,000 Pa
* 求めるもの: 最適なパイプ直径と流速
線形計画法
多線形最適化の例:
次の線形計画問題を解くために `usolver` を使用します。
最小化: 12x + 20y
制約条件: 6x + 8y ≥ 100
7x + 12y ≥ 120
x ≥ 0
y ∈ [0, 3]
これは、言語モデルによって制約充足問題にコンパイルされ、Z3で解くことができます。
$$
\begin{aligned}
\text{最小化} \quad & 12x + 20y \
\text{制約条件} \quad & 6x + 8y \geq 100 \
& 7x + 12y \geq 120 \
& x \geq 0 \
& y \in [0, 3]
\end{aligned}
$$
ここで:
- $x$ = 最初の決定変数(連続、非負)
- $y$ = 2番目の決定変数(連続、有界)
最適解は次の通りです。
x = 15.0
y = 1.25
目的関数値 = 205.0
CVXPY
線形システムの2-ノルムを最小化する単純な凸最適化問題:
次の凸最適化問題を解くために `usolver` を使用します。
最小化: ||Ax - b||₂²
制約条件: 0 ≤ x ≤ 1
ここで
A = [1.0, -0.5; 0.5, 2.0; 0.0, 1.0]
b = [2.0, 1.0, -1.0]
OR-Tools
古典的な労働者シフトスケジューリング問題:
次の要件を持つ看護師スケジューリング問題を解くために `usolver` を使用します。
* 4人の看護師(Alice、Bob、Charlie、Diana)を(月曜日、火曜日、水曜日)の3つのシフトに割り当てる
* シフト: 午前(7時 - 15時)、夕方(15時 - 23時)、夜(23時 - 7時)
* 各シフトには、毎日正確に1人の看護師が割り当てられなければならない
* 各看護師は、1日に最大1つのシフトしか勤務できない
* シフトを均等に配分する(期間中に看護師ごとに2 - 3シフト)
* Charlieは火曜日に勤務できない。
連鎖例
OR-Toolsを使用してテーブルレイアウトを最適化し、CVXPYを使用してスタッフスケジューリングを最適化する連鎖例。
次の要件を持つレストランのレイアウトと人員配置を最適化するために `usolver` を使用します。組合せ最適化を使用してテーブルレイアウトを最適化し、凸最適化を使用してスタッフスケジューリングを最適化します。
* 第1部: テーブルレイアウトを最適化する
- 2人用、4人用、6人用のテーブルの組み合わせ
- 最大床面積: 150 m²
- スペース要件: 4m²(2人用)、6m²(4人用)、9m²(6人用)
- 合計最大20台のテーブル
- 最小構成: 2台の2人用、3台の4人用、1台の6人用
- 目的: 総座席数を最大化する
* 第2部: 第1部の容量を使用してスタッフスケジューリングを最適化する
- 12時間の営業日
- 各スタッフは20席を担当できる
- 1時間あたり最小2人のスタッフ
- 時間ごとの最大スタッフ変更: 2人
- 可変需要: 容量の40% - 100%
- 目的: 労働コスト(スタッフあたり25ドル/時間)を最小化する
📚 ドキュメント
Dockerの使用方法
GitHub Container Registryから直接MCPサーバーを実行することもできます。
docker run -p 8081:8081 ghcr.io/sdiehl/usolver:latest
その後、クライアントに以下を追加します。
{
"mcpServers": {
"sympy-mcp": {
"command": "docker",
"args": [
"run",
"-i",
"-p",
"8081:8081",
"--rm",
"ghcr.io/sdiehl/usolver:latest"
]
}
}
}
📄 ライセンス
このプロジェクトはApache License 2.0の下で公開されています。詳細については、LICENSE ファイルを参照してください。