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

SMT(Z3求解器)语法下矩形排布CSP问题实现方案问询

基于SMT的矩形网格布局约束实现方案

我们以常用的Z3求解器为例,提供完整的实现逻辑,你可以直接基于这个逻辑封装参数化生成脚本:

1. 核心约束定义

你提到的公式对应以下三层约束,所有约束都可以直接映射为SMT语法:

  • 变量定义:为每个矩形i定义两个整数坐标变量x_i、y_i,表示矩形左下角在网格上的坐标,提前预设每个矩形的宽w_i、高h_i,网格总宽度W、总高度H
  • 边界约束:保证所有矩形不会超出网格范围
    x_i ≥ 0
    x_i + w_i ≤ W
    y_i ≥ 0
    y_i + h_i ≤ H
    
  • 不重叠约束:任意两个矩形i和j满足以下四个条件之一即可,边缘接触是合法的
    // i在j左侧
    x_i + w_i ≤ x_j 
    // i在j右侧
    x_j + w_j ≤ x_i
    // i在j下方
    y_i + h_i ≤ y_j
    // i在j上方
    y_j + h_j ≤ y_i
    

2. 完整示例(4个2x2矩形放入8x8网格)

以下是可直接运行的SMT-LIB格式代码:

; 定义变量:4个矩形的x、y坐标
(declare-const x0 Int)
(declare-const y0 Int)
(declare-const x1 Int)
(declare-const y1 Int)
(declare-const x2 Int)
(declare-const y2 Int)
(declare-const x3 Int)
(declare-const y3 Int)

; 通用参数定义
(define-fun W () Int 8)
(define-fun H () Int 8)
(define-fun w_i () Int 2)
(define-fun h_i () Int 2)

; 边界约束
(assert (and (>= x0 0) (<= (+ x0 w_i) W)))
(assert (and (>= y0 0) (<= (+ y0 h_i) H)))
(assert (and (>= x1 0) (<= (+ x1 w_i) W)))
(assert (and (>= y1 0) (<= (+ y1 h_i) H)))
(assert (and (>= x2 0) (<= (+ x2 w_i) W)))
(assert (and (>= y2 0) (<= (+ y2 h_i) H)))
(assert (and (>= x3 0) (<= (+ x3 w_i) W)))
(assert (and (>= y3 0) (<= (+ y3 h_i) H)))

; 两两不重叠约束,共C(4,2)=6对
; 矩形0和1
(assert (or (<= (+ x0 w_i) x1) (<= (+ x1 w_i) x0) (<= (+ y0 h_i) y1) (<= (+ y1 h_i) y0)))
; 矩形0和2
(assert (or (<= (+ x0 w_i) x2) (<= (+ x2 w_i) x0) (<= (+ y0 h_i) y2) (<= (+ y2 h_i) y0)))
; 矩形0和3
(assert (or (<= (+ x0 w_i) x3) (<= (+ x3 w_i) x0) (<= (+ y0 h_i) y3) (<= (+ y3 h_i) y0)))
; 矩形1和2
(assert (or (<= (+ x1 w_i) x2) (<= (+ x2 w_i) x1) (<= (+ y1 h_i) y2) (<= (+ y2 h_i) y1)))
; 矩形1和3
(assert (or (<= (+ x1 w_i) x3) (<= (+ x3 w_i) x1) (<= (+ y1 h_i) y3) (<= (+ y3 h_i) y1)))
; 矩形2和3
(assert (or (<= (+ x2 w_i) x3) (<= (+ x3 w_i) x2) (<= (+ y2 h_i) y3) (<= (+ y3 h_i) y2)))

; 求解
(check-sat)
(get-model)

3. 参数化脚本生成建议

如果需要适配不同的矩形数量、尺寸、网格尺寸,直接用Python实现生成逻辑即可:

  • 遍历所有矩形生成对应的declare-const语句
  • 遍历所有矩形生成边界约束
  • 双层遍历所有矩形对(i<j)生成不重叠约束
    如果不想手动拼接SMT语句,也可以直接用Z3的Python绑定z3py实现,语法更简洁,不需要处理SMT语法细节。

运行上述SMT代码后Z3会输出sat,以及每个矩形的坐标值,就是合法的布局方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:45:00