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



相关文章
|
5月前
|
SQL 开发框架 算法
【MFAC】基于偏格式动态线性化的无模型自适应控制
【MFAC】基于偏格式动态线性化的无模型自适应控制
|
4月前
|
算法 调度
基于变异混合蛙跳算法的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图
**摘要:** 实现变异混合蛙跳算法的MATLAB2022a版车间调度优化程序,支持动态调整工件和机器数,输出甘特图。核心算法结合SFLA与变异策略,解决Job-Shop Scheduling Problem,最小化总完成时间。SFLA模拟蛙群行为,分组进行局部搜索和全局信息交换。变异策略增强全局探索,避免局部最优。程序初始化随机解,按规则更新,经多次迭代和信息交换后终止。
|
3月前
|
机器学习/深度学习
深度之眼(二十四)——无约束最优化和约束最优化
深度之眼(二十四)——无约束最优化和约束最优化
|
5月前
R语言用GAM广义相加模型研究公交专用道对行程时间变异度数据的影响
R语言用GAM广义相加模型研究公交专用道对行程时间变异度数据的影响
|
5月前
|
数据可视化
R语言两层2^k析因试验设计(因子设计)分析工厂产量数据和Lenth方法检验显著性可视化|数据分享(一)
R语言两层2^k析因试验设计(因子设计)分析工厂产量数据和Lenth方法检验显著性可视化|数据分享(一)
|
5月前
|
移动开发 数据可视化
R语言两层2^k析因试验设计(因子设计)分析工厂产量数据和Lenth方法检验显著性可视化|数据分享(二)
R语言两层2^k析因试验设计(因子设计)分析工厂产量数据和Lenth方法检验显著性可视化|数据分享(二)
Matlab:如何利用层次分析法(升级版)计算具有多重指标的判断矩阵的一致性检验和权重
Matlab:如何利用层次分析法(升级版)计算具有多重指标的判断矩阵的一致性检验和权重
333 0
|
5月前
【MFAC】基于紧格式动态线性化的无模型自适应控制(Matlab代码)
【MFAC】基于紧格式动态线性化的无模型自适应控制(Matlab代码)
|
数据采集 监控 算法
【状态估计】基于二进制粒子群优化 (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代码实现)
191 1