【问题标题】:Z3py SMT coding following variables and the formulasZ3py SMT 编码以下变量和公式
【发布时间】:2015-05-19 20:23:50
【问题描述】:

我对 Z3 和 SMT 求解器非常陌生。 我有以下问题,我不知道如何在 Z3py 中编写代码。

在上图中 N 是节点的集合,因此 N = {Node1, Node2, Node3, Node4, Node5, Node6, Node7}

I 是一组输入,I = {I1, I2, I3, I4}

O 是一组输出,O = {O1, O2, O3}

G 是一个组,其中对于任何连续的 2 个输出(Oi,Oj),如果 Oi 是第一个输出,并且Oj 是生成的第二个输出,Gk 是在 Oi 生成之后和 O 生成之前调度的节点集j, but 如果 Oj 在 Oi 之前生成,则 Gk 包含在生成 Oj 之前调度的所有块。 节点的调度由另一个程序给出。 例如在上面的框图中,节点的调度以及输出的生成如下:

  • 计划的第一个节点 = 节点 1
  • 计划的第二个节点 = Node2
  • 计划的第三个节点 = Node5
  • 生成的输出 = O1
  • 计划的第四个节点 = Node3
  • 计划的第五个节点 = 节点 6
  • 生成的输出 = O2
  • 计划的第六个节点 = Node4
  • 计划的第五个节点 = Node7
  • 生成的输出 = O3

因此从上面我们可以说 G1 for (O1, O2) 是 = {Node3, Node6}

但是 (O2, O1) 的 G2 是 = {Node1, Node2, Node5}

要执行每个节点,我们需要一个任务,一个任务一次可以实现一个节点或一组节点。

Noder,i 表示组 Gr 中的第 ith 个节点。 Taskr,m 表示 Gr 组中的第 mth 个任务。

布尔变量(可以是 0 或 1):

  • fNoder,iTaskr,m 表示如果 Noder,i 映射到 Taskr,m
  • DNNoder,iNodes,j 表示如果 Nodes,j 取决于 Noder,i 即是否存在从 Noder,i 到 Nodes,j 的路径
  • DTTaskr,mTasks,n 表示如果 Tasks,n 依赖于 Taskr,m
  • MTaskr,m表示是否有节点映射到Taskr,m

基于以上信息,我必须在 SMT 中制定以下方程式。

  1. 最小化(Σr,m M任务r,m)
  2. M任务r,m >= fNoder,iTaskr,m(对于所有i)
  3. Σm fNoder,iTaskr,m = 1(对于所有 r != I,O) 例子: fNoder,iTaskr,m + f节点r,i任务r,m+1 + f节点r,i任务r ,m+2 = 1 + 0 + 0 = 这告诉我们 Noder,i 映射到 Taskr,m 因为 f Noder,iTaskr,m = 1(一次只能将一个节点映射到1个任务,但可以映射一个任务一次连接到多个节点)
  4. fNoder,iTasks,m = 0(对于所有 r != s)
  5. fNoder,iTaskr,m = 1(对于所有 r = I,O 和 m = i)李>
  6. fNoder,iTaskr,m = 0(对于所有 r = I,O 和 m != i)
  7. DTTaskr,mTasks,n >= fNoder,i任务r,m + f节点s,j任务s,n + DN节点r,i节点s,j - 2
  8. DTTaskr,mTasks,n >= DTTaskr,m任务t,l + DT任务t,l任务s,n - 1李>
  9. DTTaskr,mTasks,n + DTTasks,nTask r,m

我不明白如何用 SMT 格式表示变量和这些公式。

【问题讨论】:

    标签: z3 smt z3py


    【解决方案1】:

    我不确定如何最好地回答,因为该问题包含很多未完全指定的细节参考。 例如,什么是 I 和 O? 您可能在问如何添加线性不等式系统。或者如何指定可以为 0 或 1 的整数变量的问题。

    一种方法是引入如下函数:

           a = Function('a', IntSort(), IntSort(), IntSort())
    

    那么'a'是一个将整数对映射到整数的函数。 您可以以类似的方式声明函数“n”(但我猜您的示例实际上有一些拼写错误,并且您将 n 用作函数和索引变量)。 您也可以用类似的方式声明函数 f、h、q。

    然后在python中你可以写:

         N = 5
         s = Solver()  # create a solver context
         for r in range(N):
             for i in range(N):
                 for m in range(N):
                     if m != i:
                         s.add(f(n(r,i),a(r,m)) == 0)
    

    这会在您指定的 f 上添加等式约束。 可以以类似的方式添加其他等式和不等式约束。 最后你问结果状态是否可以满足。

        print s.check()
        print s.model()   # print model for satisfiable outcome.
    

    其他方法是为不同的变量声明不同的常量 f的版本。毕竟你建议的问题表明你只是 写下一个庞大的不等式系统 方式。

    例如,您可以创建常量 v:

        v = Const('f(a[%d][%d],a[%d][%d])' % (r,m,r,i), IntSort())
    

    而不是函数应用程序。

    【讨论】:

    • 感谢您回答我的问题,我已重新格式化问题。上述问题的答案是否仍然相同?也请您帮我理解如何表示上述术语的总和。上面的函数比如f,会不会用不同的方式来表示依赖??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多