用Z3求解一个简单的TSP问题

用Z3求解一个简单的TSP问题,z3,traveling-salesman,Z3,Traveling Salesman,我是SMT解决方案的新手。我想知道,如何对具有4/6个节点的简单TSP问题进行编码?我不知道如何使用Z3pay APA设置约束。任何提示或帮助都将不胜感激。有一个很好的示例可能对您有用: 有一个很好的示例可能对您有用: 您可以将TSP问题表述为一个问题。现在的问题是如何将TSP编码为ILP。有两个众所周知的答案:和 基本思想如下:假设我们有n个城市。让我们用d_ij表示城市i和j之间的距离,并用x_{ij}表示布尔值(0或1)表示TSP是否包含从i到j的边。那么找到最小的旅行就意味着 minim

我是SMT解决方案的新手。我想知道,如何对具有4/6个节点的简单TSP问题进行编码?我不知道如何使用Z3pay APA设置约束。任何提示或帮助都将不胜感激。

有一个很好的示例可能对您有用:
有一个很好的示例可能对您有用:

您可以将TSP问题表述为一个问题。现在的问题是如何将TSP编码为ILP。有两个众所周知的答案:和

基本思想如下:假设我们有n个城市。让我们用d_ij表示城市i和j之间的距离,并用x_{ij}表示布尔值(0或1)表示TSP是否包含从i到j的边。那么找到最小的旅行就意味着

minimize sum_{i,j} x_{ij} d_{ij}
这样x{ij}描述了一个循环。在这两个条件下,我们得到一个或多个循环:

sum_{j} x_{ij} = 1 for all i              exactly one outgoing edge per city
sum_{i} x_{ij} = 1 for all j              exactly one ingoing edge per city
现在我们必须排除解决方案包含多个周期的情况。我们可以添加指数数量的条件:

sum_{i in S} sum_{j in S} x_{ij} < |S| for all proper subsets S of {1, ..., n}
sum{i in S}sum{j in S}x{ij}<|S}对于{1,…,n}的所有适当子集S
请注意,如果我们的解决方案包含两个循环,那么S是其中一个循环的顶点集,那么x{ij}和将是| S |。另一方面,如果只有一个循环,那么x{ij}-和永远不会达到| S |,例如,如果从{1,…,n}中移除一个顶点,那么剩余的边数是n-2,但| S |=n-1

当然,指数数量的约束不是我们想要的,所以我们寻找一种更聪明的方法来排除子循环情况。这里是跳跃的地方


另一种方法是忽略子循环问题,计算解决方案并检查解决方案是否包含子循环。如果是,则通过将其添加为惰性约束来排除该解决方案,并重复该操作,直到获得单周期解决方案。这里的关键词是。

您可以将TSP问题表述为问题。现在的问题是如何将TSP编码为ILP。有两个众所周知的答案:和

基本思想如下:假设我们有n个城市。让我们用d_ij表示城市i和j之间的距离,并用x_{ij}表示布尔值(0或1)表示TSP是否包含从i到j的边。那么找到最小的旅行就意味着

minimize sum_{i,j} x_{ij} d_{ij}
这样x{ij}描述了一个循环。在这两个条件下,我们得到一个或多个循环:

sum_{j} x_{ij} = 1 for all i              exactly one outgoing edge per city
sum_{i} x_{ij} = 1 for all j              exactly one ingoing edge per city
现在我们必须排除解决方案包含多个周期的情况。我们可以添加指数数量的条件:

sum_{i in S} sum_{j in S} x_{ij} < |S| for all proper subsets S of {1, ..., n}
sum{i in S}sum{j in S}x{ij}<|S}对于{1,…,n}的所有适当子集S
请注意,如果我们的解决方案包含两个循环,那么S是其中一个循环的顶点集,那么x{ij}和将是| S |。另一方面,如果只有一个循环,那么x{ij}-和永远不会达到| S |,例如,如果从{1,…,n}中移除一个顶点,那么剩余的边数是n-2,但| S |=n-1

当然,指数数量的约束不是我们想要的,所以我们寻找一种更聪明的方法来排除子循环情况。这里是跳跃的地方


另一种方法是忽略子循环问题,计算解决方案并检查解决方案是否包含子循环。如果是,则通过将其添加为惰性约束来排除该解决方案,并重复该操作,直到获得单周期解决方案。这里的关键词是。

如果你能发布你已经尝试过的内容,你可能会得到更多答案。如果问题是Z3py API,您是否尝试使用SMTLib2标准对其进行编码?或者使用伪代码编码?嗨,实际上我很困惑如何在Z3中编码优化问题?我认为解决TSP问题可能是伪布尔解算器中最好的!!但是Z3不是一个伪布尔解算器,对吗?你能给我推荐一些实现TSP问题伪布尔编码的论文或文档吗?我很感激你的建议。。谢谢,如果你能发布你已经尝试过的东西,你可能会得到更多的答案。如果问题是Z3py API,您是否尝试使用SMTLib2标准对其进行编码?或者使用伪代码编码?嗨,实际上我很困惑如何在Z3中编码优化问题?我认为解决TSP问题可能是伪布尔解算器中最好的!!但是Z3不是一个伪布尔解算器,对吗?你能给我推荐一些实现TSP问题伪布尔编码的论文或文档吗?我很感激你的建议。。谢谢比约纳,谢谢你的链接。。我以前已经看过你的链接了。它只是检查给定的间隙是否有循环?但TSP问题是一个优化问题,其中所选路径的成本之和必须最小化。。你还有别的建议吗?谢谢比约纳,谢谢你的链接。。我以前已经看过你的链接了。它只是检查给定的间隙是否有循环?但TSP问题是一个优化问题,其中所选路径的成本之和必须最小化。。你还有别的建议吗?谢谢