我试图将图形问题(“定向运动问题”)表达为线性程序,以使用GLPK的独立求解器GLPSOL进行求解。
问题如下:
定向越野问题(OP)是连接的正边加权图G =(V,E)上的路由问题。一条边的权重表示遍历该边的成本,该边通过该边从一个节点移动到另一个节点。此外,每个顶点都有一个正整数奖励,该奖励是在初次访问该节点时收集的。可以重新访问节点,但是后续访问不会获得额外的奖励。在指定的节点(不一定相同)上开始和结束,并在给定边缘预算的情况下,目标是确定要访问的节点的子集,并确定顺序(即游览),以使收集到的奖励总和为最大化并且不超出边缘预算。
如上所述,我正在尝试设置此问题,以便可以使用GLPSOL将其作为LP解决。我在下面的示例代码(用于TSP)之后构造代码:https://github.com/PetterS/glpk/blob/master/examples/tsp.mod
到目前为止,我有以下内容:
param n, integer, >= 1;
/* number of nodes */
param budget, integer, >= 0;
/* edge budget */
param src, integer, <= n;
/* source node, tours start here */
param dest, integer, <= n;
/* destination node, tours end here */
set N := 1..n;
/* set of nodes */
set E, within N cross N;
/* set of edges */
param rewards{i in N};
/* reward from the ith node */
param c{(i, j) in E};
/* distance from node i to j */
var x{(i, j) in E}, binary;
/* x[i, j] means that edge (i, j) was traversed */
var visited{i in N}, binary;
/* visited: visited[i] means that node i was visited */
maximize total: sum{i in N} rewards[i] * visited[i];
/* objective is to collect as many rewards as possible */
s.t. cost: sum{(i,j) in E} c[i,j] * x[i,j] <= budget;
/* Edge budget must not be exceeded */
s.t. start{src}: visited[src] = 1;
/* Must visit source node */
s.t. end{dest}: visited[dest] = 1;
/* Must visit destination node */
solve;
但是,我不确定如何跟踪游览中的哪些边缘。能够将图形问题设置为线性程序的经验丰富的人可以提供一些指导吗?