zimpl 中的广义旅行商问题
Generalized Traveling Salesman Problem in 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
中对节点 1,2
、集群 2
中的 3,4
和集群中的 5,6
进行分组3
.
也许有人可以提供帮助!
谢谢
您可以使用索引集(就像您实现 C
的幂集一样)并根据需要分配集。例如试试这个:
set Clusters[C]:= <1> {1,2}, <2> {3,4}, <3> {5,6};
使用以下行检查您输入的内容是否正确:
do forall <p> in C do print Clusters[p];
这将打印
List: |1|{<1>,<2>}
List: |1|{<3>,<4>}
List: |1|{<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";
我是 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
中对节点 1,2
、集群 2
中的 3,4
和集群中的 5,6
进行分组3
.
也许有人可以提供帮助! 谢谢
您可以使用索引集(就像您实现 C
的幂集一样)并根据需要分配集。例如试试这个:
set Clusters[C]:= <1> {1,2}, <2> {3,4}, <3> {5,6};
使用以下行检查您输入的内容是否正确:
do forall <p> in C do print Clusters[p];
这将打印
List: |1|{<1>,<2>}
List: |1|{<3>,<4>}
List: |1|{<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";