运筹优化学习02:Lingo求解带容量约束的车辆路径问题(CVRP)(下)

简介: 运筹优化学习02:Lingo求解带容量约束的车辆路径问题(CVRP)

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)车辆数目约束


gif.gif

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 结果演示

20190609110149119.png

  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的求解过程进行分析,并给出源代码的编写过程,对于代码本身可能还有其他的编码方式,也希望高人无私共享,共同学习



相关文章
|
7月前
|
人工智能 算法 调度
优化问题之如何选择合适的优化求解器
优化问题之如何选择合适的优化求解器
|
7月前
|
调度 决策智能
优化问题之优化求解器有哪些主要的评估特性
优化问题之优化求解器有哪些主要的评估特性
|
7月前
|
机器学习/深度学习
深度之眼(二十四)——无约束最优化和约束最优化
深度之眼(二十四)——无约束最优化和约束最优化
|
9月前
|
机器学习/深度学习
R语言利用基线协变量提高随机对照试验的效率
R语言利用基线协变量提高随机对照试验的效率
|
9月前
R语言估计多元标记的潜过程混合效应模型(lcmm)分析心理测试的认知过程
R语言估计多元标记的潜过程混合效应模型(lcmm)分析心理测试的认知过程
|
调度
【机会约束、鲁棒优化】具有排放感知型经济调度中机会约束和鲁棒优化研究【IEEE6节点、IEEE118节点算例】(Matlab代码实现)2
【机会约束、鲁棒优化】具有排放感知型经济调度中机会约束和鲁棒优化研究【IEEE6节点、IEEE118节点算例】(Matlab代码实现)2
|
数据采集 监控 算法
【状态估计】基于二进制粒子群优化 (BPSO) 求解最佳 PMU优化配置研究【IEEE30、39、57、118节点】(Matlab代码实现)
【状态估计】基于二进制粒子群优化 (BPSO) 求解最佳 PMU优化配置研究【IEEE30、39、57、118节点】(Matlab代码实现)
【状态估计】基于二进制粒子群优化 (BPSO) 求解最佳 PMU优化配置研究【IEEE30、39、57、118节点】(Matlab代码实现)
|
Web App开发 资源调度 算法
【机组组合】基于Benders分解算法解决混合整数规划问题——机组组合问题(Matlab代码实现)
【机组组合】基于Benders分解算法解决混合整数规划问题——机组组合问题(Matlab代码实现)
212 1
第4章 MATLAB编程基础——4.2 变量
第4章 MATLAB编程基础——4.2 变量
|
机器学习/深度学习 传感器 算法
【优化分配】基于粒子群算法和萤火虫算法求解二次分配优化问题附matlab代码
【优化分配】基于粒子群算法和萤火虫算法求解二次分配优化问题附matlab代码