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



相关文章
|
2月前
|
机器学习/深度学习 算法 调度
基于ACO蚁群优化的VRPSD问题求解matlab仿真,输出规划路径结果和满载率
基于ACO蚁群优化的VRPSD问题求解MATLAB仿真,输出ACO优化的收敛曲线、规划路径结果及每条路径的满载率。在MATLAB2022a版本中运行,展示了优化过程和最终路径规划结果。核心程序通过迭代搜索最优路径,更新信息素矩阵,确保找到满足客户需求且总行程成本最小的车辆调度方案。
|
6月前
|
机器学习/深度学习
深度之眼(二十四)——无约束最优化和约束最优化
深度之眼(二十四)——无约束最优化和约束最优化
|
8月前
|
数据可视化 Java 数据挖掘
R语言Fama-French三因子模型实际应用:优化投资组合
R语言Fama-French三因子模型实际应用:优化投资组合
|
8月前
R语言估计多元标记的潜过程混合效应模型(lcmm)分析心理测试的认知过程
R语言估计多元标记的潜过程混合效应模型(lcmm)分析心理测试的认知过程
|
调度
【机会约束、鲁棒优化】具有排放感知型经济调度中机会约束和鲁棒优化研究【IEEE6节点、IEEE118节点算例】(Matlab代码实现)2
【机会约束、鲁棒优化】具有排放感知型经济调度中机会约束和鲁棒优化研究【IEEE6节点、IEEE118节点算例】(Matlab代码实现)2
|
数据采集 算法 安全
基于启发式算法与单目优化和马尔科夫模型的进出口公司的货物装运策略——整数线性规划 随机模拟(一)
基于启发式算法与单目优化和马尔科夫模型的进出口公司的货物装运策略——整数线性规划 随机模拟
449 0
基于启发式算法与单目优化和马尔科夫模型的进出口公司的货物装运策略——整数线性规划 随机模拟(一)
|
Web App开发 资源调度 算法
【机组组合】基于Benders分解算法解决混合整数规划问题——机组组合问题(Matlab代码实现)
【机组组合】基于Benders分解算法解决混合整数规划问题——机组组合问题(Matlab代码实现)
212 1
|
算法 安全 调度
混合整数规划的机组组合(Matlab代码实现)
混合整数规划的机组组合(Matlab代码实现)
144 0
|
算法 决策智能
投资组合优化的人工蜂群算法(Matlab代码实现)
投资组合优化的人工蜂群算法(Matlab代码实现)
150 0
|
Python
【英】考虑多能负荷不确定性的区域综合能源系统鲁棒规划(Python代码实现)
【英】考虑多能负荷不确定性的区域综合能源系统鲁棒规划(Python代码实现)
127 0