【问题标题】:How can I add a constraint in Cplex (java) about an argmax o min?如何在 Cplex (java) 中添加关于 argmax o min 的约束?
【发布时间】:2019-03-26 14:56:41
【问题描述】:

我是编程初学者,我正在尝试为 Cplex 编写 Java 代码以解决 DIAL A RIDE 问题。这是模型和代码。 我不能写关于容量的最后一个约束,也许代码中还有其他错误。 你能帮帮我吗?

公共类dialaride { public static void main(String[] args) {

    int P= ;
    int V=;
    double M = ; //big M
            int [] q= ;
            int []T= ;
    float[] d =;
    double [] e=;
    double[] l=;
    int G=300;




    int [][][] c= new int[P][P][V];
    for(int i = 0; i < P; i++) {
        for(int j = 0; j < P; j++) {
            for(int k = 0; k < V; k++) {
            if (i==j) {
                c[i][j][k]=0;
            }else {
                c[i][j][k]=12;

            }
}   

    }
    }
        double[][] t = new double[P][P];
        for(int i = 0; i < P; i++) {
            for(int j = 0; j < P; j++) {
                if (i==j) {
                    t[i][j]=0;
                }else {
                t[i][j] = 10+ d[i];
                }
            }
        } 

try {

    //model def
    IloCplex cplex = new IloCplex();

    IloIntVar [][][] x = new IloIntVar [P][][]; 
    for (int i = 0; i < P; i++) {
        x[i] = new IloIntVar [P][];
        for (int j = 0; j < P; j++) {
            x[i][j] = cplex.boolVarArray(V); 
        }
    }
  //arrival time of vehicle k at customer i
    IloNumVar [][]B = new IloNumVar [P][];
        for(int i = 0; i < P; i++) {
            B[i] =cplex.numVarArray(V, 0, Double.MAX_VALUE);
    } 
      //load of vehicle k after visiting customer i
        IloNumVar [][]Q = new IloNumVar [P][];
            for(int i = 0; i < P; i++) {
                Q[i] =cplex.numVarArray(V, 0, Double.MAX_VALUE);
        } 
          //ride time of user i on vehicle k
            IloNumVar [][]L = new IloNumVar [P][];
                for(int i = 0; i < P; i++) {
                    L[i] =cplex.numVarArray(V, 0, Double.MAX_VALUE);
            } 
              //Objective Expression
                IloLinearNumExpr objective = cplex.linearNumExpr();
                for (int i = 0; i < P; i++) {
                    for (int j = 0; j < P; j++) {
                        for (int k = 0; k < V; k++) {
                            objective.addTerm(c[i][j][k], x[i][j][k]);
                            }
                        }
                    }
            //Define objective
                cplex.addMinimize(objective);

              // constraint 1: Each customer is visited only once
                for(int i = 1; i < P/2; i++) {  
                    IloLinearNumExpr expr1 = cplex.linearNumExpr();
                        for(int j = 1; j < P; j++) {
                            for(int k = 0; k < V; k++) {
                                if(i != j) {

                                    expr1.addTerm(1.0, x[i][j][k]);
                                }
                            }
                        }       
                        cplex.addEq(expr1, 1.0);
                }
              //constraint 2: the pickup and delivery nodes are visited by the same vehicle
                    for(int k = 0; k < V; k++) {
                        for (int i =1; i <P/2; i++) {
                        IloLinearNumExpr expr2 = cplex.linearNumExpr();
                            for(int j = 1; j < P; j++) {
                                for(int h = 0; h < P; h++) {
                                    if(i != j) {
                                        expr2.addTerm(1.0, x[i][j][k]);
                                        if(h!=(P/2)+i) { 
                                        expr2.addTerm(-1.0, x[(P/2)+i][h][k]);
                                    }
                                }
                            }
                          }
                            cplex.addEq(expr2, 0);


                        }
                    }
               //Constraint 3: Each vehicle must start from depot 0

               for(int k = 0; k < V; k++) {
                IloLinearNumExpr expr3 = cplex.linearNumExpr();
                    for(int j = 0; j < (P/2)+1; j++) {
                        expr3.addTerm(1.0, x[0][j][k]);
                    }
                    cplex.addEq(expr3, 1.0);
               }

               //Constraint 4: Each vehicle must finish at the final depot 
               for(int k = 0; k < V; k++) {
                IloLinearNumExpr expr4 = cplex.linearNumExpr();
                    for(int i = 0; i < P; i++) {
                        expr4.addTerm(1.0, x[i][P-1][k]);
                    }
                    cplex.addEq(expr4, 1.0);
               }
               //constraint 5: after arriving to customer vehicle must leave for next
                for(int h = 1; h <P/2 ; h++) {
                    for(int k = 0; k <V ; k++) {
                        IloLinearNumExpr expr5 = cplex.linearNumExpr();
                            for(int i = 0; i <P; i++) {
                                for(int j = 1; j <P ; j++) {
                                    if(i != j) {
                                        expr5.addTerm(1.0, x[h][i][k]);
                                        expr5.addTerm(-1.0, x[i][j][k]);
                                    }
                                }
                            }
                            cplex.addEq(expr5, 0);
                    }
                }
              //constraint 6: time
                for(int i = 0; i < P; i++) {
                    for(int j = 0; j < P; j++) {
                        for(int k = 0; k < V; k++) {
                            if(i != j) {
                                IloLinearNumExpr expr6 = cplex.linearNumExpr();
                                expr6.addTerm(1.0, B[i][k]);
                                expr6.setConstant(t[i][j]);
                                expr6.setConstant(d[i]);
                                expr6.addTerm(-1.0, B[j][k]);
                                expr6.addTerm(M, x[i][j][k]);
                                cplex.addLe(expr6, M);
                            } 
                        }
                    }
                }
              //constraint 7: load
                for(int i = 0; i < P; i++) {
                    for(int j = 0; j < P; j++) {
                        for(int k = 0; k < V; k++) {
                            if(i != j) {
                                IloLinearNumExpr expr7 = cplex.linearNumExpr();
                                expr7.addTerm(1.0, Q[i][k]);
                                expr7.setConstant(q[j]);
                                expr7.addTerm(-1.0, Q[j][k]);
                                expr7.addTerm(M, x[i][j][k]);
                                cplex.addLe(expr7, M);
                            } 
                        }
                    }
                }
              //constraint 8: time window-earliest arrival time
                for(int i = 0; i < P; i++) {
                    for(int k = 0; k < V; k++) {
                        IloLinearNumExpr expr8 = cplex.linearNumExpr();
                                    expr8.addTerm(1.0, B[i][k]);
                                    cplex.addGe(expr8, e[i]);
                    }   
                }

                //constraint 9: time window-latest arrival time
                for(int i = 0; i < P; i++) {
                    for(int k = 0; k < V; k++) {
                        IloLinearNumExpr expr9 = cplex.linearNumExpr();
                                    expr9.addTerm(1.0, B[i][k]);
                                    cplex.addLe(expr9, l[i]);
                    }   
                }
                //constraint 10: 
                for(int i = 0; i < P/2; i++) {
                    for(int k = 0; k < V; k++) {
                        IloLinearNumExpr expr10 = cplex.linearNumExpr();
                                    expr10.addTerm(1.0, L[i][k]);
                                    cplex.addGe(expr10,t[i][(P/2)+i] );
                    }   
                }

                //constraint 11: 
                for(int i = 0; i < P/2; i++) {
                    for(int k = 0; k < V; k++) {
                        IloLinearNumExpr expr11 = cplex.linearNumExpr();
                                    expr11.addTerm(1.0, L[i][k]);
                                    cplex.addLe(expr11,G);
                    }   
                }
                //constraint 12
                for(int i = 0; i <P/2 ; i++) {
                    for(int k = 0; k <V ; k++) {
                        IloLinearNumExpr expr12 = cplex.linearNumExpr();
                        expr12.addTerm(1.0, L[i][k]);
                        expr12.addTerm(1.0, B[i][k]);
                        expr12.setConstant(d[i]);
                        cplex.addEq(expr12, B[(P/2)+i][k]);

                    }
                }
                //constraint 13
                for(int k = 0; k <V ; k++) {
                    IloLinearNumExpr expr13 = cplex.linearNumExpr();
                    expr13.addTerm(1.0, B[(P/2)+1][k]);
                    expr13.addTerm(-1.0, B[0][k]);
                    cplex.addEq(expr13, T[k]);
                }[enter link description here][1]

【问题讨论】:

  • pdfs.semanticscholar.org/a047/… 这是我指的模型。
  • 如果您提出一个非常具体的问题,而不仅仅是“我做不到 [...]”,那么可能会帮助您的人肯定会更容易做到这一点。 . 请先解释你想要实现的约束到底应该达到什么,而不是假设人们会在论文中弄清楚这一点。解释你尝试了什么,以及你遇到了什么错误......
  • 嗨,对不起。我必须添加约束:max{0, qi} ≤ Qki ≤ min{Qk,Qk + qi}。
  • 我的问题是我如何在 java 中编写一个数量必须小于等于一个范围的最大值?

标签: java eclipse cplex


【解决方案1】:

您声明要添加约束max{0, qi} ≤ Qki ≤ min{Qk,Qk + qi}。你没有提到你的符号是什么,所以我假设 Q 是变量,而 q 是事先知道的常量。

对于任何变量 Qki,您可以计算值 max{0, qi} 并将其设置为变量的下限。

对于上限,您的意思并不完全清楚。但是您似乎想指定给定变量(让我将其命名为X)必须小于其他两个变量(YZ)的最小值。这相当于声明X ≤ YX ≤ Z。您只需要说明这两个约束即可。

如果我误解或假设不正确,也许这会有所帮助:https://www.leandro-coelho.com/how-to-linearize-max-min-and-abs-functions/ 解释了如何线性化 minmax

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    相关资源
    最近更新 更多