【发布时间】: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 中制定以下方程式。
- 最小化(Σr,m M任务r,m)
- M任务r,m >= fNoder,iTaskr,m(对于所有i)
- Σ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个任务,但可以映射一个任务一次连接到多个节点)
- fNoder,iTasks,m = 0(对于所有 r != s)
- fNoder,iTaskr,m = 1(对于所有 r = I,O 和 m = i)李>
- fNoder,iTaskr,m = 0(对于所有 r = I,O 和 m != i)
- DTTaskr,mTasks,n >= fNoder,i任务r,m + f节点s,j任务s,n + DN节点r,i节点s,j - 2
- DTTaskr,mTasks,n >= DTTaskr,m任务t,l + DT任务t,l任务s,n - 1李>
- DTTaskr,mTasks,n + DTTasks,nTask r,m
我不明白如何用 SMT 格式表示变量和这些公式。
【问题讨论】: