Logic 如何将Z3中的频率分配问题编码为Max SMT

Logic 如何将Z3中的频率分配问题编码为Max SMT,logic,z3,solver,smt,z3py,Logic,Z3,Solver,Smt,Z3py,我试图使用本文中的信息,通过Python中的Z3对(更具体地说,是实例6)进行编码,我将尝试简要描述这些信息 该问题包括为成对的无线链路分配频率,以满足某些约束条件。每个频率应从有限集合Di中选择,且约束的形式如下: |fi − fj| > k (soft, comes with a cost associated ) |fi - fj| = d (hard) fi = pi (pre-assignment, hard) 本文描述了如何将域视为四个集合的不相交并集: {2 + 14m

我试图使用本文中的信息,通过Python中的Z3对(更具体地说,是实例6)进行编码,我将尝试简要描述这些信息

该问题包括为成对的无线链路分配频率,以满足某些约束条件。每个频率应从有限集合Di中选择,且约束的形式如下:

|fi − fj| > k (soft, comes with a cost associated )

|fi - fj| = d (hard)

fi = pi (pre-assignment, hard)
本文描述了如何将域视为四个集合的不相交并集:

{2 + 14m | 1 ≤ m ≤ 11}
{2 + 14m | 18 ≤ m ≤ 28}
{8 + 14km | 29 ≤ m ≤ 39}
{8 + 14m | 46 ≤ m ≤ 56}
我们可以表示fi在Di中与:

其中ti表示fi是否为2模14,mi表示fi模14

至于约束条件,则取决于ti和tj。它们可以写成

| 2 + 14mi - 8 - 14mj | > k
何时(ti)∧ 经过一些操作,我们得到:

(ti ∧ ¬tj ) → ( mi−mj ≥ floor((k+6)/14 + 1 ∨  mi−mj ≤ ceil((-k-6)/14) - 1)
我已经设法将这种编码与SolverFor('QF_LIA')和 它确实返回unsat,因为实例不可行

我还没有设法把它编码成一个Max SMT问题

我试着使用Optimize来代替,并将软约束和它们的权重一起添加,而只是断言硬约束,但是Z3持续了几个小时,没有给我一个答案

本文讨论了每一个转折加权子句

(Ci, wi) into (Ci ∨ pi)
其中pi是一个新的命题变量,然后使用:

pi → (ki = wi)         ¬pi → (ki = 0)
为了重量。但我还没有完全理解

问题1

这意味着什么

 (ti ∧ ¬tj ) → ( mi−mj ≥ floor((k+6)/14 + 1 ∨  mi−mj ≤ ceil((-k-6)/14) - 1)
变成

  ((ti ∧ ¬tj ) → ( mi−mj ≥ floor((k+6)/14 + 1 ∨  mi−mj ≤ ceil((-k-6)/14) - 1) ∨ pi)
?

问题2

如果我想最小化成本并看到它的价值,我应该如何对它进行编码? 谢谢

编辑 在发布了这个问题之后,我花了一些时间来破解它。 设法让它在另一个实例(SUBCELAR6/CELAR6-SUB0,它是实例6的一个小子实例)上工作,但发现的成本(574)大于最佳成本(159)

但主要部分是:

以我的身份导入mongoengine
从模型导入图形
从z3进口*
从数学导入单元、楼层
me.connect(db='tcc')
instance=next(Graph.objects(name='scen06'))
Vars=instance.var
Doms=instance.dom
Ctrs=instance.ctr
权重={
1 : 1000,
2 :  100,
3 :   10,
4 :    1
}
s=优化()
对于ctr中的ctr:
ti=Bool('t\u%d'%ctr.first\u var)
tj=Bool('t\ud%ctr.second\uvar)
mi=Int('m\u%d'%ctr.first\u var)
mj=Int('m_u%d'%ctr.second_var)
k=中心偏差
#钛→ (1  ≤ 惯性矩≤ 11∨ 18≤ 惯性矩≤ 28)
#埃蒂→ (29 ≤ 惯性矩≤ 39∨ 46≤ 惯性矩≤ 56)
#Fi域的编码

s、 添加(暗示)ti,或(和)(1我怀疑@PatrickTrentin会在他着手时给你一个更好的答案。同时,在Z3py中分享你的编码会很有用,特别是如果你能简化它,使它最小化,但它能演示“运行数小时”问题。当您有可供共享的代码段供用户独立运行时,堆栈溢出效果最佳。1)不要将
(Ci,wi)转换为(Ci)∨ pi)
transformation。相反,使用
s.add_soft(Ci,wi)
,这可以通过更高效的MaxSMT算法来处理2)当使用
add_soft()
3时,
和权的最小化隐含在
z3
中不正确的最佳结果可能是约束操作问题的结果,如果没有适当的背景,我很难说。试着“按原样”编写等式,让
z3
进行操作。4)如果你能提供一个
smt2
公式,我可以仔细看看。我从解算器那里得到了s表达式,这就是你需要的吗?哦,天哪,我发现了问题。在为(ti)添加软子句时∧ 我不小心输入了“==”而不是“>=”。最后发现花费了160英镑!
  ((ti ∧ ¬tj ) → ( mi−mj ≥ floor((k+6)/14 + 1 ∨  mi−mj ≤ ceil((-k-6)/14) - 1) ∨ pi)