问题描述
我是 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";