如何在 Cplex (java) 中添加关于 argmax o min 的约束?

Posted

技术标签:

【中文标题】如何在 Cplex (java) 中添加关于 argmax o min 的约束?【英文标题】:How can I add a constraint in Cplex (java) about an 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/… 这是我指的模型。 如果您提出一个非常具体的问题,而不仅仅是“我做不到 [...]”,那么可能会帮助您的人肯定会更容易做到这一点。 . 请先解释你想要实现的约束到底应该达到什么,而不是假设人们会在论文中弄清楚这一点。解释你尝试了什么,以及你遇到了什么错误...... 嗨,对不起。我必须添加约束:max0, qi ≤ Qki ≤ minQk,Qk + qi。 我的问题是我如何在 java 中编写一个数量必须小于等于一个范围的最大值? 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于如何在 Cplex (java) 中添加关于 argmax o min 的约束?的主要内容,如果未能解决你的问题,请参考以下文章

我可以从 c# 代码运行 IloOplExec() Cplex 函数吗?

CPLEX教程03java调用cplex求解一个TSP问题模型

您如何在 cplex 中编写唯一性符号?

由docplex.mp.model.add_if_then添加的约束导致CPlex读取错误

PYOMO:如何创建约束松弛? (从 Pyomo 中的 CPLEX 重写约束)

如何用python结合cplex求解混合整数规划问题