TSP中的Gurobi JAVA子任务消除约束

TSP中的Gurobi JAVA子任务消除约束,java,traveling-salesman,gurobi,Java,Traveling Salesman,Gurobi,实际上,我正在尝试的是选择性TSP,它在特定条件下将tour与非整个节点连接起来。(示例:如果有20个节点,此问题将选择12个节点进行tour) 我从中复制了这个代码 protectedvoid callback(){ 试一试{ if(其中==GRB.CB_MIPSOL){ //找到一个整数可行的解决方案-它是否每次访问 //节点? int n=可变长度; int[]tour=findsubtour(getSolution(vars)); if(tour.length=2){ //添加子目标消除

实际上,我正在尝试的是选择性TSP,它在特定条件下将tour与非整个节点连接起来。(示例:如果有20个节点,此问题将选择12个节点进行tour)

我从中复制了这个代码

protectedvoid callback(){
试一试{
if(其中==GRB.CB_MIPSOL){
//找到一个整数可行的解决方案-它是否每次访问
//节点?
int n=可变长度;
int[]tour=findsubtour(getSolution(vars));
if(tour.length=2){
//添加子目标消除约束
GRBLinExpr expr=新GRBLinExpr();
对于(int i=0;i
它在主功能中加载上半部分,如下所示

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();
        }
if(model.get(GRB.IntAttr.SolCount)>0){
int[]tour=findsubtour(model.get(GRB.DoubleAttr.X,y_j1_j2));
断言tour.length==cent_x.length;
系统输出打印(“Tour:”);
对于(int i=0;i
但是,当我运行这段代码时,它会不断使用subtour生成解决方案。 有什么办法可以消除这个问题吗?
对不起,我的英语能力,如果有难理解的部分,请添加评论。我真的很想解决这个问题。

是否在回调中添加subtour消除约束?查看tsp.java示例了解详细信息。我的操作与tsp.java示例相同。我所做的是添加其他约束,例如选择约束和时间窗口约束
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();
        }