zimpl中的广义旅行商问题

问题描述

我是 zimpl 的新手,我目前正在尝试对 GTSP 进行建模。设置是我们将节点分组为集群。 我的问题是我不知道如何在zimpl中实现哪个节点属于哪个集群。

到目前为止我做了什么:

set V:= {1..6}; set A:= {<i,j> in V*V with i < j};
set C:= {1,2,3};
set W:= {<p,q> in C*C with p < q};
set P[]:= powerset(C); set K:= indexset(P);

我猜测缺少某些东西,因为我想将集群 1,2 中的节点 1、集群 3,4 中的 2 和集群 {{ 中的 5,6 分组1}}。

也许有人可以帮忙! 谢谢

解决方法

您可以使用索引集(就像您实现 catch 的幂集一样)并根据需要分配集。试试这个,例如:

async/await

使用以下行检查您的输入是否正确:

C

这将打印

set Clusters[C]:= <1> {1,2},<2> {3,4},<3> {5,6};

到控制台。

,

如果您想从文件中读取集群-城市对应关系,ZIMPL user guide 中有大量关于如何实现这一点的部分。 不过,我认为它不能在一行中读取任意数量的条目。 因此,我会将 GTSP 实例文件的集群部分转换为节点集群分配列表,即(以 here 中的示例为例):

GTSP_SET_SECTION:
1 4 5 -1
2 1 2 3 10 11 12 13 14 -1
3 8 9 17 -1
4 6 7 15 16 -1

我会先变成

1 4
1 5
2 1
2 2
2 3
2 10
...

然后你可以把它读成:

members[C] := read "cluster.txt" as "<1n> 2n";