如何在 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
)必须小于其他两个变量(Y
和Z
)的最小值。这相当于声明X ≤ Y
和X ≤ Z
。您只需要说明这两个约束即可。
如果我误解或假设不正确,也许这会有所帮助:https://www.leandro-coelho.com/how-to-linearize-max-min-and-abs-functions/ 解释了如何线性化 min 和 max。
【讨论】:
以上是关于如何在 Cplex (java) 中添加关于 argmax o min 的约束?的主要内容,如果未能解决你的问题,请参考以下文章
我可以从 c# 代码运行 IloOplExec() Cplex 函数吗?
CPLEX教程03java调用cplex求解一个TSP问题模型
由docplex.mp.model.add_if_then添加的约束导致CPlex读取错误