2.2.4 定义模型约束条件
(1)限定变量x_{ij}为二进制变量
1. !设置整数约束; 2. @for(cxc : @bin(x)); !规定变量x_{ij}为二进制变量,只能取值为0或者1
(2)为x_{ij}赋值:
程序逻辑:
第一步,将矩阵X的对角线元素赋值为0;
第二步:为非对角线元素赋值
若下一个节点为depot节点则设置为x_{ij} = 1,否则为0
若为非depot节点,判断累加需求量是否大于车辆约束C,若是设置x_{ij} = 1
对应Lingo源码:
@for(city(k) | k #gt# 1 : x(k,k) = 0; @sum(city (i) | i #ne# k #and# (i #eq# 1 #or# Q(i) + Q(k) < C) : x(i,k) = 1; @sum(city (j) | j #ne# k #and# (j #eq# 1 #or# Q(i) + Q(k) < C) : x(k,j) = 1; @for(city(i) | i #ne# k #and# i #ne# 1 : U(k) >= U(i) + Q(k) - C + C * (x(k,i) + x(i,k)) - (Q(k) + Q(i)) * x(k,i); ); U(k) <= C - (C - Q(k)) * x(1, k); U(k) >= Q(k) + @sum(city(i) | i #gt# 1: Q(i) * x(i,k)); );
(3)车辆数目约束
vechileCnt = @SUM( city(i) | i #gt# : Q(i)) / C; vehicleR = vechileCnt + 1.999 - @wrap(vechileCnt - 0.001, 1); @sum(city(j) | j #gt# 1 : x(1,j) >= vehicleR;必须有足够的车辆离开车场
3 结果演示
Local optimal solution found. Objective value: 15.00000 Objective bound: 15.00000 Infeasibilities: 0.000000 Extended solver steps: 2 Total solver iterations: 113 Variable Value C 5.000000 VCAP 37766.16 VEHCLF 0.2647873E-03 VEHCLR 1.000000 Q( 1) 0.000000 Q( 2) 2.000000 Q( 3) 3.000000 Q( 4) 5.000000 U( 1) 0.000000 U( 2) 2.000000 U( 3) 5.000000 U( 4) 5.000000 DIST( 1, 1) 0.000000 DIST( 1, 2) 3.000000 DIST( 1, 3) 4.000000 DIST( 1, 4) 2.000000 DIST( 2, 1) 3.000000 DIST( 2, 2) 0.000000 DIST( 2, 3) 4.000000 DIST( 2, 4) 5.000000 DIST( 3, 1) 4.000000 DIST( 3, 2) 4.000000 DIST( 3, 3) 0.000000 DIST( 3, 4) 7.000000 DIST( 4, 1) 2.000000 DIST( 4, 2) 5.000000 DIST( 4, 3) 7.000000 DIST( 4, 4) 0.000000 X( 1, 1) 0.000000 X( 1, 2) 1.000000 X( 1, 3) 0.000000 X( 1, 4) 1.000000 X( 2, 1) 0.000000 X( 2, 2) 0.000000 X( 2, 3) 1.000000 X( 2, 4) 0.000000 X( 3, 1) 1.000000 X( 3, 2) 0.000000 X( 3, 3) 0.000000 X( 3, 4) 0.000000 X( 4, 1) 1.000000 X( 4, 2) 0.000000 X( 4, 3) 0.000000 X( 4, 4) 0.000000 Row Slack or Surplus 1 15.00000 2 0.000000 3 0.000000 4 0.000000 5 0.000000 6 37761.16 7 0.000000 8 0.000000 9 0.000000 10 0.000000 11 0.000000 12 0.000000 13 37763.16 14 37761.16 15 0.000000 16 0.000000 17 0.000000 18 0.000000 19 37764.16 20 37761.16 21 0.000000 22 0.000000 23 0.000000 24 0.000000 25 1.000000
最优解: 1 --> 4 --> 1; 1-->2-->3-->1
对CVRP的求解过程进行分析,并给出源代码的编写过程,对于代码本身可能还有其他的编码方式,也希望高人无私共享,共同学习