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

使用Z3 Python寻找指定图属性不符图时的约束问题

Z3库图着色约束组合问题高效实现

背景与问题

目前使用Python的Z3库测试图着色相关属性,核心逻辑为:给求解器添加约束后,若Z3无法求解(unsat),则当前图符合目标属性。已知参数:

  • Nt:节点总数
  • M:邻接矩阵
  • X[i]:节点i的颜色(0或1,Z3变量)
  • Nborder:边界子图节点数(前Nborder个节点为边界节点)
  • 已存在部分着色相关基础约束

原有逻辑(正常运行)

检测边界节点颜色全相同的图:
添加约束强制边界存在异色节点,若求解失败则图的边界在所有合法着色中均全同:

const1 = [sum([X[i]*(1-X[j]) for i in range(Nborder) for j in range(Nborder)]) >= 1]

新需求与问题

需额外筛选满足边界中至少两个节点恰好有2个颜色为1的邻居的图,原约束写法及组合方式存在问题:

  1. 原约束const2意图限制符合条件的边界节点数≤1,但因Z3不支持直接对布尔表达式求和,逻辑无效:
const2= [sum([(sum([M[i][j]*X[j] for j in range(Nt)]) ==2) for i in range(Nborder)]) <=1]
  1. 尝试用z3.Or(const1, const2)组合约束时触发报错,原因是将列表作为Or的参数,且布尔求和不合法:
z3.z3types.Z3Exception: Python bool, int, long or float expected

临时方案为创建两个独立求解器分别检查,但效率较低,需高效实现方式。

错误分析

  1. 布尔求和不合法:Z3中布尔表达式(如sum(...) ==2)不能直接参与整数求和,需用z3.If将布尔值转换为1或0后再统计数量。
  2. 约束组合参数错误:z3.Or需传入单个Z3表达式,而非表达式列表,原代码误将列表作为参数传入。

正确实现方案

1. 修正约束const2的写法

使用z3.If将布尔条件转换为整数,正确统计符合条件的节点数量:

from z3 import *

# 定义颜色变量(用Int类型更方便求和)
X = [Int(f"X_{i}") for i in range(Nt)]
s = Solver()

# 添加颜色取值约束(0或1)
for x in X:
    s.add(Or(x == 0, x == 1))

# 添加其他基础着色约束(如相邻节点颜色不同等,按需补充)
# ...

# 修正后的const2:限制符合条件的边界节点数≤1
count_valid = Sum([
    If(Sum([M[i][j] * X[j] for j in range(Nt)]) == 2, 1, 0)
    for i in range(Nborder)
])
const2 = count_valid <= 1

2. 高效复用求解器(替代双求解器方案)

利用Z3的push()/pop()机制复用同一个求解器,避免重复添加基础约束,提升效率:

# 先检查基础约束是否可满足(若不可满足则无需后续检查)
if s.check() == sat:
    # 检查const1约束是否不可满足(即边界全同色)
    s.push()
    s.add(sum([X[i]*(1-X[j]) for i in range(Nborder) for j in range(Nborder)]) >= 1)
    is_border_uniform = (s.check() == unsat)
    s.pop()

    # 检查const2约束是否不可满足(即符合条件的节点数≥2)
    s.push()
    s.add(const2)
    has_enough_valid_nodes = (s.check() == unsat)
    s.pop()

    # 同时满足两个条件则为目标图
    if is_border_uniform and has_enough_valid_nodes:
        print("找到符合要求的目标图")
else:
    print("基础着色约束不可满足,跳过当前图")

说明

  • push()会保存当前求解器状态,pop()会回滚到之前的状态,因此基础约束只需添加一次,每次检查仅临时添加目标约束。
  • 核心逻辑:当添加const1后求解失败,说明图的边界在所有合法着色中均全同;当添加const2后求解失败,说明所有合法着色中边界符合条件的节点数≥2,两者同时满足即为目标图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:00:15