Как добавить ограничение захвата в TSP на Java / Cplex? - PullRequest
0 голосов
/ 12 октября 2018

Я хочу добавить ограничение Pickup для моего TSP, чтобы водитель сначала выбирал элемент, а затем отбрасывал его.Я использую cplex в java и не знаю, как правильно его настроить.
V[i] = a decision variable: мощность транспортного средства в точке i, которая зависит от 3-х точек снабжения и 3-х точек спроса q [] = [1, 1, 1, -1, -1, -1];

                IloCplex cplex = new IloCplex();

                IloNumVar[][] x = new IloNumVar[t.length][t.length];

                for (int i = 0; i < t.length; i++) {
                    for (int j = 0; j < t.length; j++) {
                        if (i != j) {
                            x[i][j] = cplex.boolVar("x." + i + "." + j);
                        }
                    }
                }

                IloNumVar[] u = new IloNumVar[t.length];
                for (int i = 1; i <t.length; i++) {
                    u[i] = cplex.numVar(0, Double.MAX_VALUE, "u." + i);
                }


                IloNumVar[] V = new IloNumVar[t.length];
                for (int i = 1; i <t.length; i++) {
                    V[i] = cplex.numVar(Math.max(0,q[i]), Math.min(Capacity, Capacity + q[i]), "V." + i);
                }


                IloLinearNumExpr obj = cplex.linearNumExpr();
                for (int i = 0; i < t.length; i++) {
                    for (int j = 0; j < t.length; j++) {
                        if (i != j) {
                            obj.addTerm(costs[i][j], x[i][j]);
                        }
                    }
                }
                cplex.addMinimize(obj);

                //
                for (int j = 0; j < t.length; j++) {
                    IloLinearNumExpr expr0 = cplex.linearNumExpr();
                    for (int i = 0; i < t.length; i++) {
                        if (i != j) {
                            expr0.addTerm(1, x[i][j]);
                        }
                    }
                    cplex.addEq(expr0, 1);
                }

                //
                for (int i = 0; i <t.length; i++) {
                    IloLinearNumExpr expr1 = cplex.linearNumExpr();
                    for (int j = 0; j < t.length; j++) {
                        if (j != i) {
                            expr1.addTerm(1, x[i][j]);
                        }
                    }
                    cplex.addEq(expr1, 1) ;
                }

                //route connectivity MTZ constraint
                for (int i = 1; i < t.length; i++) {
                    for (int j = 1; j < t.length; j++) {
                         if (i!=j){
                            IloLinearNumExpr expr2 = cplex.linearNumExpr();
                            expr2.addTerm(1, u[i]);
                            expr2.addTerm(-1, u[j]);
                            expr2.addTerm(t.length - 1, x[i][j]);
                            cplex.addLe(expr2, t.length - 2);
                        }
                    }

                 }

// пикап примирения ??который выглядит как

V [j] = V [i] + q [i];

cplex.solve();

            } catch (IloException e) {
                    e.printStackTrace();
                }
            }

        }
...