Gurobi JAVA在TSP中消除了约束

时间:2017-01-12 08:23:16

标签: java traveling-salesman gurobi

实际上,我尝试的是在特定条件下连接巡视而不是整个节点的选择性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进行解决方案。 有没有办法消除这一点? 对不起我的英语技能,如果有难以理解的部分,请添加评论。我真的想解决这个问题。

0 个答案:

没有答案