遗传算法优化最大化效应的某些需求点可不配送的vrptw问题

本文主要是介绍遗传算法优化最大化效应的某些需求点可不配送的vrptw问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

标题:遗传算法优化最大化效应的某些需求点可不配送的vrptw问题

摘要:

在可不配送的车辆路径配送问题(VRPTW)中,我们面临着优化路径规划以最大化效用的挑战。本文提出了一种基于遗传算法的方法,旨在解决具有硬时间窗约束的可不配送VRPTW问题。该方法通过多个遗传算法操作符,如选择、交叉和变异,逐代优化车辆的路径规划,以实现效用的最大化。

引言

可不配送的VRPTW问题是一种经典的组合优化问题,它要求在考虑车辆容量限制和时间窗约束的情况下,将货物从中心仓库配送到多个客户地点。然而,在实际应用中,某些客户可能不愿意接受配送,因此我们需要优化路径规划以最大化效用,同时满足硬时间窗约束。

方法

本文提出的方法基于遗传算法,它是一种启发式算法,通过模拟生物进化过程来求解优化问题。遗传算法操作符包括选择、交叉和变异。

2.1 个体表示

每个个体都表示一个车辆路径规划方案,其中包括从中心仓库出发,经过一系列客户地点,最后返回仓库的路径。

2.2 适应度函数

适应度函数用于评估每个个体的优劣程度。在这里,我们将效用最大化作为目标函数。效用的计算可以根据具体问题进行定义,例如货物价值的总和或客户满意度的加权和。

2.3 选择操作

选择操作用于根据适应度函数的结果选择优秀的个体。在本方法中,我们采用轮盘赌选择策略,根据个体适应度与总适应度的比例进行选择。

2.4 交叉操作

交叉操作用于生成新的个体。在本方法中,我们采用部分映射交叉(PMX)算子,将两个个体的染色体部分交换,以产生具有新路径规划的个体。

2.5 变异操作

变异操作用于引入新的基因组合。在本方法中,我们采用交换变异算子,随机选择两个客户地点,并交换它们在路径中的位置。

实验与结果

我们使用一组模拟数据对提出的方法进行实验。实验结果表明,遗传算法能够有效地优化可不配送的VRPTW问题中的效用最大化。通过多轮迭代,算法逐渐收敛于较优解。

主程序如下:

数据如下:

需求地序号

x坐标(千米)

y坐标(千米)

需求量

时间窗开始

时间窗结束

利润

缺货成本

0

125

85

0

6

12

0

0

1

185

35

6

6

12

100

200

2

153

165

9

6

12

100

200

3

38

107

10

6

12

100

200

4

0

0

4

6

12

100

200

5

8

11

3

6

12

100

200

6

87

85

2

6

12

100

200

7

68

160

5

6

12

100

200

8

118

197

8

6

12

100

200

9

65

10

2

6

12

100

200

10

170

120

2

6

12

100

200

11

190

80

7

6

12

100

200

12

130

40

9

6

12

100

200

13

110

121

9

6

12

100

200

14

188

151

3

6

12

100

200

15

107

75

1

6

12

100

200

16

137

51

7

6

12

100

200

17

149

27

4

6

12

100

200

18

19

86

7

6

12

100

200

19

97

149

4

6

12

100

200

20

131

157

5

6

12

100

200

程序结果如下:

程序运行时间(s)

runtime201 =

                 63.243826

遗传算法优化得到的最优目标函数

ans =

          6655.92002859396

遗传算法优化得到的最优染色体

bestChrom =

  1 至 28 列

     0     1     1     0     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     7     8    20     5     2    14    10    11

  29 至 40 列

    17    12    15     4     1     9    16     3    18     6    13    19

显示各个路径(遗传算法)

第1辆车的路径

route1 =

     0     7     8    20     0

loadline =

     0     0    18

    18    18    13

    13    13     5

     5     5     0

     0     0     0

运行时间表

outcell01 =

    '路径点'    '到达时间'             '开始服务时间'          '结束时间'        

    [    0]    [               6]    [               6]    [               6]

    [    7]    [7.88403821617291]    [7.88403821617291]    [7.96737154950624]

    [    8]    [9.21139727271296]    [9.21139727271296]    [9.34473060604629]

    [   20]    [10.1859202398388]    [10.1859202398388]    [10.2692535731722]

    [    0]    [11.7142449226272]    [11.7142449226272]    [11.7142449226272]

第2辆车的路径

route1 =

     0     5     0

loadline =

     0     0     3

     3     3     0

     0     0     0

运行时间表

outcell01 =

    '路径点'    '到达时间'             '开始服务时间'          '结束时间'        

    [    0]    [               6]    [               6]    [               6]

    [    5]    [8.76875423250241]    [8.76875423250241]    [8.81875423250241]

    [    0]    [11.5875084650048]    [11.5875084650048]    [11.5875084650048]

第3辆车的路径

route1 =

     0     2    14    10     0

loadline =

     0     0    14

    14    14     5

     5     5     2

     2     2     0

     0     0     0

运行时间表

outcell01 =

    '路径点'    '到达时间'             '开始服务时间'          '结束时间'        

    [    0]    [               6]    [               6]    [               6]

    [    2]    [7.69516960803337]    [7.69516960803337]    [7.84516960803337]

    [   14]    [ 8.5990926810322]    [ 8.5990926810322]    [ 8.6490926810322]

    [   10]    [ 9.3660306141896]    [ 9.3660306141896]    [9.39936394752293]

    [    0]    [10.5395393726221]    [10.5395393726221]    [10.5395393726221]

第4辆车的路径

route1 =

     0    11    17    12     0

loadline =

     0     0    20

    20    20    13

    13    13     9

     9     9     0

     0     0     0

运行时间表

outcell01 =

    '路径点'    '到达时间'             '开始服务时间'          '结束时间'        

    [    0]    [               6]    [               6]    [               6]

    [   11]    [7.30384048104053]    [7.30384048104053]    [ 7.4205071477072]

    [   17]    [8.76065639312727]    [8.76065639312727]    [8.82732305979394]

    [   12]    [9.28775763712279]    [9.28775763712279]    [9.43775763712279]

    [    0]    [10.3432961509365]    [10.3432961509365]    [10.3432961509365]

第5辆车的路径

route1 =

     0    15     9    16     0

loadline =

     0     0    10

    10    10     9

     9     9     7

     7     7     0

     0     0     0

运行时间表

outcell01 =

    '路径点'    '到达时间'             '开始服务时间'          '结束时间'        

    [    0]    [               6]    [               6]    [               6]

    [   15]    [6.41182520563948]    [6.41182520563948]    [6.42849187230615]

    [    9]    [7.97626446542181]    [7.97626446542181]    [8.00959779875515]

    [   16]    [9.66670370967334]    [9.66670370967334]    [   9.78337037634]

    [    0]    [10.5044806314328]    [10.5044806314328]    [10.5044806314328]

第6辆车的路径

route1 =

     0     3    18     6     0

loadline =

     0     0    19

    19    19     9

     9     9     2

     2     2     0

     0     0     0

运行时间表

outcell01 =

    '路径点'    '到达时间'             '开始服务时间'          '结束时间'        

    [    0]    [               6]    [               6]    [               6]

    [    3]    [7.79477018027379]    [7.79477018027379]    [7.96143684694045]

    [   18]    [8.52782893728071]    [8.52782893728071]    [8.64449560394737]

    [    6]    [10.0046426548209]    [10.0046426548209]    [10.0379759881543]

    [    0]    [10.7979759881543]    [10.7979759881543]    [10.7979759881543]

第7辆车的路径

route1 =

     0    13    19     0

loadline =

     0     0    13

    13    13     4

     4     4     0

     0     0     0

运行时间表

outcell01 =

    '路径点'    '到达时间'             '开始服务时间'          '结束时间'        

    [    0]    [               6]    [               6]    [               6]

    [   13]    [            6.78]    [            6.78]    [            6.93]

    [   19]    [7.54741396161733]    [7.54741396161733]    [7.61408062828399]

    [    0]    [9.01122056400983]    [9.01122056400983]    [9.01122056400983]

punish_early =

     0

punish_late =

     0

outcell =

    '节点编号'    '达到时间'             '离开时间'        

    [      1]    [               0]    [               0]

    [      2]    [7.69516960803337]    [7.84516960803337]

    [      3]    [7.79477018027379]    [7.96143684694045]

    [      4]    [               0]    [               0]

    [      5]    [8.76875423250241]    [8.81875423250241]

    [      6]    [10.0046426548209]    [10.0379759881543]

    [      7]    [7.88403821617291]    [7.96737154950624]

    [      8]    [9.21139727271296]    [9.34473060604629]

    [      9]    [7.97626446542181]    [8.00959779875515]

    [     10]    [ 9.3660306141896]    [9.39936394752293]

    [     11]    [7.30384048104053]    [ 7.4205071477072]

    [     12]    [9.28775763712279]    [9.43775763712279]

    [     13]    [            6.78]    [            6.93]

    [     14]    [ 8.5990926810322]    [ 8.6490926810322]

    [     15]    [6.41182520563948]    [6.42849187230615]

    [     16]    [9.66670370967334]    [   9.78337037634]

    [     17]    [8.76065639312727]    [8.82732305979394]

    [     18]    [8.52782893728071]    [8.64449560394737]

    [     19]    [7.54741396161733]    [7.61408062828399]

    [     20]    [10.1859202398388]    [10.2692535731722]

>>

结论

本文提出了一种基于遗传算法的方法,用于解决具有硬时间窗约束的可不配送VRPTW问题。实验结果表明,该方法能够有效地优化路径规划,从而达到效用的最大化。未来的研究可以探索其他启发式算法或改进遗传算法的操作符,以进一步提高问题求解效果。

参考文献:

[1] Goldberg, D. E. (1989). Genetic algorithms in search, optimization, and machine learning. Addison-Wesley.

[2] Braysy, O., & Gendreau, M. (2005). Vehicle routing problem with time windows, part I: Route construction and local search algorithms. Transportation Science, 39(1), 104-118.

程序运行时间(s)

runtime201 =

          36.6331173795092

遗传算法优化得到的最优目标函数

ans =

          4561.10885596154

遗传算法优化得到的最优染色体

bestChrom =

  1 至 25 列

     0     1     1     0     1     1     1     0     1     1     1     1     1     1     1     1     1     1     1     1    10    14     2    20     3

  26 至 40 列

    18     6     1    15     4     9     8    12    16    17    11     5     7    19    13

显示各个路径(遗传算法)

第1辆车的路径

route1 =

     0    10    14     2    20     0

loadline =

     0     0    19

    19    19    17

    17    17    14

    14    14     5

     5     5     0

     0     0     0

运行时间表

outcell01 =

    '路径点'    '到达时间'             '开始服务时间'          '结束时间'        

    [    0]    [               6]    [               6]    [               6]

    [   10]    [7.14017542509914]    [7.14017542509914]    [7.17350875843247]

    [   14]    [7.89044669158987]    [7.89044669158987]    [7.94044669158987]

    [    2]    [ 8.6943697645887]    [ 8.6943697645887]    [ 8.8443697645887]

    [   20]    [9.31255776101749]    [9.31255776101749]    [9.39589109435082]

    [    0]    [10.8408824438059]    [10.8408824438059]    [10.8408824438059]

第2辆车的路径

route1 =

     0     3    18     6    15     0

loadline =

     0     0    20

    20    20    10

    10    10     3

     3     3     1

     1     1     0

     0     0     0

运行时间表

outcell01 =

    '路径点'    '到达时间'             '开始服务时间'          '结束时间'        

    [    0]    [               6]    [               6]    [               6]

    [    3]    [7.79477018027379]    [7.79477018027379]    [7.96143684694045]

    [   18]    [8.52782893728071]    [8.52782893728071]    [8.64449560394737]

    [    6]    [10.0046426548209]    [10.0046426548209]    [10.0379759881543]

    [   15]    [10.4851895836542]    [10.4851895836542]    [10.5018562503209]

    [    0]    [10.9136814559604]    [10.9136814559604]    [10.9136814559604]

第3辆车的路径

route1 =

     0     9    12    16     0

loadline =

     0     0    18

    18    18    16

    16    16     7

     7     7     0

     0     0     0

运行时间表

outcell01 =

    '路径点'    '到达时间'             '开始服务时间'          '结束时间'        

    [    0]    [               6]    [               6]    [               6]

    [    9]    [7.92093727122985]    [7.92093727122985]    [7.95427060456319]

    [   12]    [9.38605271089082]    [9.38605271089082]    [9.53605271089082]

    [   16]    [9.79682080709893]    [9.79682080709893]    [ 9.9134874737656]

    [    0]    [10.6345977288584]    [10.6345977288584]    [10.6345977288584]

第4辆车的路径

route1 =

     0    17    11     0

loadline =

     0     0    11

    11    11     7

     7     7     0

     0     0     0

运行时间表

outcell01 =

    '路径点'    '到达时间'             '开始服务时间'          '结束时间'        

    [    0]    [               6]    [               6]    [               6]

    [   17]    [7.25538838611802]    [7.25538838611802]    [7.32205505278468]

    [   11]    [8.66220429820476]    [8.66220429820476]    [8.77887096487143]

    [    0]    [ 10.082711445912]    [ 10.082711445912]    [ 10.082711445912]

第5辆车的路径

route1 =

     0     5     0

loadline =

     0     0     3

     3     3     0

     0     0     0

运行时间表

outcell01 =

    '路径点'    '到达时间'             '开始服务时间'          '结束时间'        

    [    0]    [               6]    [               6]    [               6]

    [    5]    [8.76875423250241]    [8.76875423250241]    [8.81875423250241]

    [    0]    [11.5875084650048]    [11.5875084650048]    [11.5875084650048]

第6辆车的路径

route1 =

     0     7    19    13     0

loadline =

     0     0    18

    18    18    13

    13    13     9

     9     9     0

     0     0     0

运行时间表

outcell01 =

    '路径点'    '到达时间'             '开始服务时间'          '结束时间'        

    [    0]    [               6]    [               6]    [               6]

    [    7]    [7.88403821617291]    [7.88403821617291]    [7.96737154950624]

    [   19]    [8.58769404627708]    [8.58769404627708]    [8.65436071294374]

    [   13]    [9.27177467456107]    [9.27177467456107]    [9.42177467456107]

    [    0]    [10.2017746745611]    [10.2017746745611]    [10.2017746745611]

punish_early =

     0

punish_late =

     0

outcell =

    '节点编号'    '达到时间'             '离开时间'        

    [      1]    [               0]    [               0]

    [      2]    [ 8.6943697645887]    [ 8.8443697645887]

    [      3]    [7.79477018027379]    [7.96143684694045]

    [      4]    [               0]    [               0]

    [      5]    [8.76875423250241]    [8.81875423250241]

    [      6]    [10.0046426548209]    [10.0379759881543]

    [      7]    [7.88403821617291]    [7.96737154950624]

    [      8]    [               0]    [               0]

    [      9]    [7.92093727122985]    [7.95427060456319]

    [     10]    [7.14017542509914]    [7.17350875843247]

    [     11]    [8.66220429820476]    [8.77887096487143]

    [     12]    [9.38605271089082]    [9.53605271089082]

    [     13]    [9.27177467456107]    [9.42177467456107]

    [     14]    [7.89044669158987]    [7.94044669158987]

    [     15]    [10.4851895836542]    [10.5018562503209]

    [     16]    [9.79682080709893]    [ 9.9134874737656]

    [     17]    [7.25538838611802]    [7.32205505278468]

    [     18]    [8.52782893728071]    [8.64449560394737]

    [     19]    [8.58769404627708]    [8.65436071294374]

    [     20]    [9.31255776101749]    [9.39589109435082]

>>

这篇关于遗传算法优化最大化效应的某些需求点可不配送的vrptw问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/658583

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2