Logic 如何将Z3中的频率分配问题编码为Max SMT
我试图使用本文中的信息,通过Python中的Z3对(更具体地说,是实例6)进行编码,我将尝试简要描述这些信息 该问题包括为成对的无线链路分配频率,以满足某些约束条件。每个频率应从有限集合Di中选择,且约束的形式如下: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
|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)