实际上,我尝试的是在特定条件下连接巡视而不是整个节点的选择性TSP。(例如:如果有20个节点,这个问题将选择12个节点进行巡视)
我从https://www.gurobi.com/documentation/7.0/examples/tsp_java.html复制了这个地下消除代码。
protected void callback() {
try {
if (where == GRB.CB_MIPSOL) {
// Found an integer feasible solution - does it visit every
// node?
int n = vars.length;
int[] tour = findsubtour(getSolution(vars));
if (tour.length < n && tour.length>=2) {
// Add subtour elimination constraint
GRBLinExpr expr = new GRBLinExpr();
for (int i = 0; i < tour.length; i++)
for (int j = i + 1; j < tour.length; j++)
expr.addTerm(1.0, vars[tour[i]][tour[j]]);
addLazy(expr, GRB.LESS_EQUAL, tour.length - 1);
addLazy(expr, GRB.GREATER_EQUAL, 1);
}
}
} catch (GRBException e) {
System.out.println("Error code: " + e.getErrorCode() + ". " + e.getMessage());
e.printStackTrace();
}
}
并将主要功能的上半部分加载为
if (model.get(GRB.IntAttr.SolCount) > 0) {
int[] tour = findsubtour(model.get(GRB.DoubleAttr.X, y_j1_j2));
assert tour.length == cent_x.length;
System.out.print("Tour: ");
for (int i = 0; i < tour.length; i++)
System.out.print(String.valueOf(tour[i]) + " ");
System.out.println();
}
但是,当我运行此代码时,它会继续使用subour进行解决方案。 有没有办法消除这一点? 对不起我的英语技能,如果有难以理解的部分,请添加评论。我真的想解决这个问题。