You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Z3Py求解不等式组的极大解(任意其他解含更小变量)

用Z3Py求解满足条件的极大解

你需要的是帕累托极大解:不存在另一个解,使得所有变量的值都大于等于该解的对应变量值(即任意其他解至少有一个变量的值小于该解的变量)。以下是具体实现步骤和代码:

核心思路

  1. 先求解初始约束,得到一个可行解。
  2. 尝试寻找一个所有变量都严格大于当前解的新解:
    • 如果找到,就用这个新解替换当前解,重复此步骤。
    • 如果找不到,说明当前解就是符合要求的极大解——因为不存在任何解能在所有变量上都超过它,任意其他解必然至少有一个变量更小。

完整代码示例

from z3 import *

# 定义实数变量
a = Real('a')
b = Real('b')
c = Real('c')

# 初始约束集合
constraints = [
    a + b >= 1.5,
    a <= 1.5 + b,
    b <= 1.5 + a,
    2.27 + c >= 1.41
]

# 初始化求解器
s = Solver()
s.add(constraints)

current_solution = None

while True:
    # 检查当前约束是否有可行解
    if s.check() != sat:
        break  # 无解或找不到更大的解,终止循环
    
    model = s.model()
    # 保存当前解(保留5位小数,可调整精度)
    current_solution = {
        str(a): model[a].as_decimal(5),
        str(b): model[b].as_decimal(5),
        str(c): model[c].as_decimal(5)
    }
    
    # 添加约束:要求所有变量严格大于当前解的值
    greater_constraints = []
    for var in [a, b, c]:
        var_val = model[var]
        greater_constraints.append(var > var_val)
    
    s.add(And(greater_constraints))

# 输出结果
if current_solution:
    print("找到的极大解:")
    for var, val in current_solution.items():
        print(f"{var} = {val}")
else:
    print("约束系统无解")

补充说明

  • 精度控制:as_decimal(5)指定保留5位小数,你可以根据需求调整位数,也可以用as_fraction()获取精确分数形式,或as_float()转换为浮点数(注意浮点数的精度限制)。
  • 字典序极大解:如果你需要按变量顺序逐个最大化(比如先最大化a,再在a最大的前提下最大化b,最后最大化c),可以用Z3的maximize工具,代码如下:
from z3 import *

a = Real('a')
b = Real('b')
c = Real('c')

constraints = [
    a + b >= 1.5,
    a <= 1.5 + b,
    b <= 1.5 + a,
    2.27 + c >= 1.41
]

s = Solver()
s.add(constraints)

# 第一步:最大化a
obj = maximize(a)
s.check()
max_a = obj.value()
s.add(a == max_a)

# 第二步:在a最大的情况下最大化b
obj = maximize(b)
s.check()
max_b = obj.value()
s.add(b == max_b)

# 第三步:在a、b最大的情况下最大化c
obj = maximize(c)
s.check()
max_c = obj.value()

print(f"字典序极大解:a={max_a}, b={max_b}, c={max_c}")

这种方式得到的是唯一的字典序极大解,适合有明确优先级的场景。

内容的提问来源于stack exchange,提问作者kjakeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:40:38