基于遗传算法的CVRP建模求解(Python)

news2025/1/26 15:43:40

带容量约束的车辆路径优化问题,CVRP,对一系列装卸货点进行适当的路径规划,在满足约束条件(客户需求、车辆载重和容积、车型、车辆行驶里程、配送中心数量等限制)和目标最优化(路程最短、成本最低、使用车辆数最少、配送时间最快等)下,将客户的配送需求从配送中心送达客户点,或从客户点送回配送中心。

1问题描述

1.1场景

单向:纯取货/纯送货;
单配送中心:只有一个配送中心/车场;
单车型:只考虑一种车型,
需求不可拆分:客户需求只能有一辆车满足;
车辆封闭:完成配送任务的车辆需回到配送中心;
车辆充足:不限制车辆数量,即配送车辆需求均能满足;
非满载:任意客户点的需求量小于车辆最大载重;

1.2要求

优化目标:最小化车辆启动成本和车辆行驶成本之和;
约束条件:车辆行驶距离约束,重量约束;
已知信息:配送中心位置、客户点位置、客户点需求、车辆最大载重、车辆最大行驶距离、车辆启动成本、车辆单位距离行驶成本;

2数学模型

2.1符号定义

2.2数学模型

\

2.3参数设置

车辆启动成本 C0 =30,车辆单位距离行驶成本C1 =1
详见problem.py

3遗传算法设计

3.1编码、解码

同TSP问题生成方式,以客户点(编号为1,2,3…)为自然数编码(不包含配送中心0)
解码:考虑车辆载重和行驶距离约束的8客户点染色体[8,4,1,5,2,3,6,7]解码为
【0,8,4,1,0】
【0,5,2,0】
【0,3,6,7,0】

3.2交叉变异

采用两点交叉、和2-opt变异

4程序设计

分为四个模块,populatioin.py、algorithm.py,problem.py 和程序运行接口run-cvrp.py
algorithm.py如下:

import datetime
import heapq
import time

import numpy as np
from matplotlib import pyplot as plt

import 路径优化.CVRP.problem as problem
from 路径优化.CVRP.population import Population


class Algorithm:
    def __init__(self, problem: problem.CVRP):
        self.problem = problem
        np.random.seed(47)
        self.currentGen = 0
        self.MAXGEN = 10000
        self.trace = {"obj": [], "solution": []}
        pass

    def mutation(self, pop):
        for i in range(10, 100):
            r1, r2 = np.random.randint(low=0, high=len(pop.chromMatrix[0]), size=2)
            chrom = pop.chromMatrix[i]
            chrom[r1], chrom[r2] = chrom[r2], chrom[r1]
        pass

    def crossover(self):
        pass

    def selection(self, pop: Population):
        off = Population(self.problem)
        fitV = pop.fitV
        if not isinstance(fitV, np.ndarray):
            fitV = np.asarray(fitV)

        elites_idx = heapq.nlargest(10, range(pop.NIND), pop.fitV.__getitem__)
        for i in range(0, 10):
            off.chromMatrix[i] = pop.chromMatrix[elites_idx[i]]
        # print(off)
        ps = fitV / np.sum(fitV)
        pc = np.cumsum(ps)

        for i in range(10, 100):
            r = np.random.random()
            select = 0
            for j in range(pop.NIND):
                if r < pc[j]:
                    select = j
                    break
            off.chromMatrix[i] = pop.chromMatrix[select]
        return off

    def run(self):
        population = Population(self.problem)
        population.initPop()
        self.problem.evaluate(population)

        while not self.terminated(population):
            offspring = self.selection(population)
            self.mutation(offspring)
            self.problem.evaluate(offspring)  # 计算目标函数值
            population = offspring
        return self.finish(population)

    def terminated(self, population):
        self.log(population)
        if self.currentGen + 1 >= self.MAXGEN:
            return True
        self.currentGen += 1
        return False

    def log(self, pop: Population):
        idx = np.argmax(pop.fitV)
        self.trace["obj"].append(pop.objV[idx])
        self.trace["solution"].append(pop.phenMatrix[idx])
        print("obj=", pop.objV[idx])

    def finish(self, pop: Population):
        print("final solution:")
        idx = np.argmax(pop.fitV)
        routes = pop.phenMatrix[idx]
        print(routes)
        print("veh used:", len(routes))
        self.draw(routes)
        self.save(pop)

    def save(self, pop: Population):
        with open('final result.txt', 'a') as f:
            idx = np.argmax(pop.fitV)
            routes = pop.phenMatrix[idx]
            f.write("veh used:%d\n" % len(routes))
            f.write("%s\n" % routes)
            f.write("%s\n" % pop.objV[idx])

    def draw(self, routes):
        customers = self.problem.customers
        for route in routes:
            x = []
            y = []
            for i in route:
                x.append(customers[i].x)
                y.append(customers[i].y)
            plt.plot(x, y, 'o-', alpha=0.8, linewidth=0.8)
        plt.xlabel('x')
        plt.ylabel('y')
        currentTime = datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d%H%M%S')
        plt.savefig("cg" + currentTime, bbox_inches="tight")

        plt.show()

5求解结果

本文求解结果,图左 obj= 566.6042140064762 final solution: [[0, 23, 30, 12, 7,
1, 13, 11, 0], [0, 6, 3, 2, 28, 4, 9, 18, 0], [0, 24, 29, 10, 25, 14,
0]] veh used: 3


6中博客求解结果:图右,运算结果最优解为728.1, 路径为[0, 6, 19, 11, 3, 2, 28, 4, 9, 22, 8,
27, 18, 0], [0, 24, 29, 15, 10, 25, 5, 20, 16, 14, 0], [0, 23, 17, 21,
31, 26, 30, 12, 1, 13, 7, 0]

本文结果 对比结果

6参考

版权声明:参考CSDN博主「_2312」原创文章进行复现,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tangshishe/article/details/116197720

7CVRP标准算例测试集

https://blog.csdn.net/meiyoushui_/article/details/110367916
http://iescm.com/vrp/instances/P1CVRP.asp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396721.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

点灯大师--点个正点原子阿尔法开发板的灯

点灯大师–点个正点原子阿尔法开发板的灯 文章目录点灯大师--点个正点原子阿尔法开发板的灯正点原子阿尔法开发板点灯1、使能 GPIO1 时钟2、设置 GPIO1_IO03 的复用功能3、配置 GPIO1_IO034、设置 GPIO5、控制 GPIO 的输出电平五种点灯的方法1.在一个驱动文件中实现寄存器初始化…

【C语言】编译+链接

一、程序的翻译环境和执行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境&#xff0c;它用于实际执行代码。详解编译链接翻译环境1.组成一个程序的每个源文件通过…

STM32电动车报警器

目录 项目需求 项目框图 硬件清单 振动传感器介绍及实战 振动传感器介绍 振动传感器编程实现 继电器介绍及实战 继电器工作原理 433M无线发射接收模块介绍及实战 433M无线发射接收模块介绍 ​编辑 433M编程实现 项目设计及实现 编程实现 项目需求 点击遥控器A 按键…

规约第二章

文章目录有限域的定义Definition of Finite Field单位元运算举例素数域群阿贝尔群阿贝尔循环群循环子群阿贝尔循环群且阶是素数的有限域的定义Definition of Finite Field 单位元 这里一般只需要记住2个0&#xff0c;1 。0是加法的单位元&#xff0c;1是乘法的单位元。以及逆…

【JavaScript UI库和框架】上海道宁与Webix为您提供用于跨平台Web应用程序开发的JS框架及UI小部件

Webix是Javascript库 一种软件产品 用于加速Web开发的 JavaScript UI库和框架 Webix用于跨平台Web应用程序开发的JS框架&#xff0c;为您提供102个UI小部件和功能丰富的CSS/HTML5 JavaScript控件 开发商介绍 Webix团队由由热衷于创建高质量网络产品的专业人士组成&#xff…

docker desktop安装K8S

文章目录一、配置镜像源二、使用步骤1.引入库2.安装k8s3.加载资源4.K8S官方dashboard总结摘抄这个&#xff0c;因为这个有些不全 导致走了一些弯路 一、配置镜像源 国外特别的慢 {"debug": true,"experimental": false,"insecure-registries":…

CSS的常用元素属性,显示模式,盒模型,弹性布局

目录 1.常用元素属性 1.1字体属性 设置字体 设置大小 字体粗细 文字样式 1.2文本属性 文字颜色 文字对齐 ​编辑文本装饰 文本缩进 ​编辑行高 ​编辑1.3背景属性 背景颜色 背景位置 背景尺寸 1.4圆角矩形 2.元素的显示模式 2.1块级元素(display:block) 2.…

Excel绘制数据对比表格-表格可视化

Word中生成的表格一般比较单调&#xff0c;若一组数据存在对比的情况时&#xff0c;读者/审稿人难以直接通过详细对比数据来分析&#xff0c;此时若可以将该组数据可视化来对比则为好&#xff0c;Excel则可实现该功能。 关于有些期刊需要提供表格中的数据便于复制等情况时&…

新闻发布网站分析及适用场景

在当今数字时代&#xff0c;发布新闻的渠道已经不再局限于传统媒体&#xff0c;越来越多的企业、组织和个人开始使用互联网平台发布新闻稿&#xff0c;以提升品牌知名度和影响力。本文将介绍一些可以发布新闻的网站&#xff0c;并分析其特点和适用场景。一、新闻稿发布平台1.新…

SpringCloud+SpringCloudAlibaba

架构的演进1.1单体架构将所有业务场景的表示层、业务逻辑层和数据访问层放在一个工程中&#xff0c;最终经过编译、打包&#xff0c;部署在一台服务器上。◆ 1.1.1单体架构的优点1&#xff09;部署简单: 由于是完整的结构体&#xff0c;可以直接部署在一个服务器上即可。2&…

启动Idea报Failed to create JVM. JVM Path:

一、如果设置Idea自定义虚拟内存错误导致无法正常打开Idea 1.1、打开自定义Idea虚拟内存&#xff1a;Help - Edit Custom VM Options 1.2、如果idea64.exe.vmoptions设置非法字符&#xff0c;会导致打开idea报错 1.3、打开Idea提示如下 内容如下&#xff1a; ----------------…

信号、signal 函数、sigaction 函数

文章目录1.信号的基本概念2.利用 kill 命令发送信号3.信号处理的相关动作4.信号与 signal 函数4.1 signal 函数示例一4.2 signal 函数示例二5.利用 sigaction 函数进行信号处理6.利用信号处理技术消灭僵尸进程1.信号的基本概念 发送信号是进程之间常用的通信手段。信号用来通知…

算法刷题-只出现一次的数字、输出每天是应该学习还是休息还是锻炼、将有序数组转换为二叉搜索树

只出现一次的数字&#xff08;位运算、数组&#xff09; 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 说明&#xff1a; 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗&…

有java基础学习大数据该如何规划

大数据开发对于Java语言的依赖程度比较高&#xff0c;如果想尝试大数据开发&#xff0c;学习过Java语言就很容易上手 Java是目前使用广泛的编程语言之一&#xff0c;具有的众多特性&#xff0c;特别适合作为大数据应用的开发语言。 目前很多大数据开发团队都在使用Java语言&a…

MySQL——插入加锁/唯一索引插入死锁/批量插入效率

本篇主要介绍MySQL跟加锁相关的一些概念、MySQL执行插入Insert时的加锁过程、唯一索引下批量插入可能导致的死锁情况&#xff0c;以及分别从业务角度和MySQL配置角度介绍提升批量插入的效率的方法&#xff1b;MySQL跟加锁相关的一些概念在介绍MySQL执行插入的加锁过程之前&…

核酸检测信息管理系统

目录前言一、功能与需求分析二、详细设计与实现1、data包&#xff08;1&#xff09;DataDataBase&#xff08;2&#xff09;NaPaNamePassword2、operation包&#xff08;1&#xff09;操作接口&#xff08;2&#xff09;Resident用户功能&#xff08;3&#xff09;Simper用户功…

Java基础总结(jdk,jvm,异常,对象等)

文章目录前言一、Java基础part 1JDKJRE字节码位运算变量成员变量与局部变量的区别&#xff1f;基本数据类型装箱拆箱JVM1.Java内存区域Hotspot对象对象的创建&#xff1a;对象的内存布局part2面向对象面向对象三大特征构造方法接口&#xff1b;抽象类深拷贝和浅拷贝ObjectStrin…

阿里HPCC算法简介

摘要&#xff1a;HPCC&#xff08;高精度拥塞控制&#xff09;基于INT&#xff08;带内遥测&#xff09;技术&#xff0c;可以非常精确的获取网络的拥塞状态&#xff0c;能够实现快速的收敛以及利用带宽&#xff0c;并通过实现“零队列”来实现超低的延迟&#xff0c;下面将主要…

Presto本地开发,plugin的设置

1. 新的问题 之前搭建Presto的本地开发环境时&#xff0c;一直使用config.properties中的plugin.bundles配置项定义需要加载的plugin模块&#xff0c;详细可以参考博客《win10基于IDEA&#xff0c;搭建Presto开发环境》presto服务启动时&#xff0c;指定加载哪些组件&#xff…

kubernetes--监控容器运行时:Falco

目录 Falco介绍 Falco架构 Falco的安装 告警规则示列 威胁场景测试&#xff1a; 监控容器创建的不可信任进程&#xff08;自定义规则&#xff09; Falco支持五种输出告警方式falco.yaml&#xff1a; Falco告警集中化展示&#xff1a; Falco介绍 Falco是一个Linux安全工具…