🚀 USolver
USolver 是一个模型上下文协议(MCP)服务器,它提供了用于解决组合优化、凸优化、整数规划和非线性优化问题的工具。该服务器提供了与以下求解器的接口:
🚀 快速开始
要安装 USolver,运行 install.py 脚本。这将为 Claude Desktop 和/或 Cursor 安装 MPC 服务器。
uv run install.py
然后打开 Claude 或 Cursor,你应该能在工具列表中看到 MCP 工具 usolver。
✨ 主要特性
- 提供多种优化问题的求解接口,包括组合优化、凸优化、整数规划和非线性优化。
- 支持多个知名求解器,如
highs、ortools、cvxpy 和 z3。
- 提供丰富的使用示例,涵盖化学工程、物流、投资组合理论等多个领域。
📦 安装指南
运行以下命令安装:
uv run install.py
💻 使用示例
基础用法
以下是一些不同场景下的使用示例:
逻辑谜题
你和一个朋友路过一台标准的投币式自动售货机,你决定买一块糖果棒。价格是 0.95 美元,但你翻遍口袋后发现只有一美元,而且机器只接受硬币。你转向你的朋友,有了以下对话:
你:嘿,你有一美元的零钱吗?
朋友:让我看看。我有 6 枚美国硬币,虽然它们加起来是 1.15 美元,但我没法破开一美元。
你:嗯?那你有半美元的零钱吗?
朋友:没有。
你:那 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{其中每个 } 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{如果 } x = 50 \ x & \text{如果 } x \neq 50 \end{cases}
$$
约束 0:6 枚硬币的总价值为 115 美分。
$$
\sum_{i=1}^{6} c_i = 115
$$
约束 1:无法破开一美元。
$$
\forall S \in \mathcal{S}, \quad \sum_{x \in S} x \neq 100
$$
约束 2:无法破开半美元。
$$
\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:如果排除半美元硬币,则无法购买 95 美分的糖果棒。
$$
\forall S \in \mathcal{S}, \quad \sum_{x \in S} v(x) \neq 95
$$
如果将这个问题输入到求解器中,它将合成上述约束系统,使用 Z3 求解,并返回解决方案。
你的朋友有:1 枚半美元硬币、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$ = 第二个决策变量(连续、有界)
最优解是:
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 天(周一、周二、周三)内的 3 个班次
* 班次:早班(7 点 - 15 点)、晚班(15 点 - 23 点)、夜班(23 点 - 7 点)
* 每天每个班次必须恰好分配给一名护士
* 每名护士每天最多工作一个班次
* 均匀分配班次(每名护士在这段时间内工作 2 - 3 个班次)
* Charlie 不能在周二工作。
链式示例
一个链式示例,使用 OR - Tools 优化餐桌布局,使用 CVXPY 优化员工排班。
使用 usolver 优化餐厅的布局和员工排班,分两部分满足以下要求。使用组合优化优化餐桌布局,使用凸优化优化员工排班。
* 第一部分:优化餐桌布局
- 混合 2 人桌、4 人桌和 6 人桌
- 最大占地面积:150 m²
- 空间要求:2 人桌 4 m²、4 人桌 6 m²、6 人桌 9 m²
- 最多 20 张桌子
- 最小组合:2 张 2 人桌、3 张 4 人桌、1 张 6 人桌
- 目标:最大化总座位数
* 第二部分:使用第一部分的座位数优化员工排班
- 营业时间为 12 小时
- 每名员工可以处理 20 个座位
- 每小时至少 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 文件。