【进阶六】Python实现SDVRPTW常见求解算法——自适应大邻域算法(ALNS)

ALNS算法(自适应大领域搜索算法) ALNS的C++实现 阅读详情

基于python语言,采用经典自适应大邻域算法(ALNS)对 带硬时间窗的需求拆分车辆路径规划问题(SDVRPTW) 进行求解。

往期优质资源


经过一年多的创作,目前已经成熟的代码列举如下,如有需求可私信联系,表明需要的 **问题与算法**,原创不宜,有偿获取。
VRP问题GAACOALNSDEDPSOQDPSOTSSA
CVRP√√√√√√√√
VRPTW√√√√√√√√
MDVRP√√√√√√√√
MDHVRP√√√√√√√√
MDHVRPTW√√√√√√√√
SDVRP√√√√√√√√
SDVRPTW√√√

1. 适用场景

  • 求解SDVRPTW
  • 车辆类型单一
  • 车辆容量小于部分需求节点需求
  • 单一车辆基地
  • 带硬时间窗

2. 代码调整


2.1 需求拆分


与SDVRP问题相比,SDVRPTW问题不仅允许客户需求大于车辆载重,而且考虑了客户节点的时间窗约束。为了使得每个客户的需求得到满足,必须派遣一辆或多辆车辆在规定时间窗内对客户进行服务。对于需求节点的拆分,这里依然采取先验拆分策略,本文采用文献[1]提出的先验分割策略,表述如下:

(1)20/10/5/1拆分规则

  • m20 =max{ m ∈ Z + ∪ { 0 } ∣ 0.20 Q m < = D i m\in Z^+ \cup \{0\} | 0.20Qm <= D_i m∈Z+∪{0}∣0.20Qm<=Di​ }
  • m10 =max{ m ∈ Z + ∪ { 0 } ∣ 0.10 Q m < = D i − 0.20 Q m 20   m\in Z^+ \cup \{0\} | 0.10Qm <= D_i-0.20Qm_{20}~ m∈Z+∪{0}∣0.10Qm<=Di​−0.20Qm20​  }
  • m5 =max{ m ∈ Z + ∪ { 0 } ∣ 0.05 Q m < = D i − 0.20 Q m 20 − 0.10 Q m 10 m\in Z^+ \cup \{0\} | 0.05Qm <= D_i-0.20Qm_{20}-0.10Qm_{10} m∈Z+∪{0}∣0.05Qm<=Di​−0.20Qm20​−0.10Qm10​ }
  • m1 =max{ m ∈ Z + ∪ { 0 } ∣ 0.01 Q m < = D i − 0.20 Q m 20 − 0.10 Q m 10 − 0.05 Q m 5 m\in Z^+ \cup \{0\} | 0.01Qm <= D_i-0.20Qm_{20}-0.10Qm_{10}-0.05Qm_{5} m∈Z+∪{0}∣0.01Qm<=Di​−0.20Qm20​−0.10Qm10​−0.05Qm5​ }

(2)25/10/5/1拆分规则

  • m25 =max{ m ∈ Z + ∪ { 0 } ∣ 0.25 Q m < = D i m\in Z^+ \cup \{0\} | 0.25Qm <= D_i m∈Z+∪{0}∣0.25Qm<=Di​ }
  • m10 =max{ m ∈ Z + ∪ { 0 } ∣ 0.10 Q m < = D i − 0.25 Q m 25   m\in Z^+ \cup \{0\} | 0.10Qm <= D_i-0.25Qm_{25}~ m∈Z+∪{0}∣0.10Qm<=Di​−0.25Qm25​  }
  • m5 =max{ m ∈ Z + ∪ { 0 } ∣ 0.05 Q m < = D i − 0.25 Q m 25 − 0.10 Q m 10 m\in Z^+ \cup \{0\} | 0.05Qm <= D_i-0.25Qm_{25}-0.10Qm_{10} m∈Z+∪{0}∣0.05Qm<=Di​−0.25Qm25​−0.10Qm10​ }
  • m1 =max{ m ∈ Z + ∪ { 0 } ∣ 0.01 Q m < = D i − 0.25 Q m 25 − 0.10 Q m 10 − 0.05 Q m 5 m\in Z^+ \cup \{0\} | 0.01Qm <= D_i-0.25Qm_{25}-0.10Qm_{10}-0.05Qm_{5} m∈Z+∪{0}∣0.01Qm<=Di​−0.25Qm25​−0.10Qm10​−0.05Qm5​ }

在实现过程中,对于需求超过车辆容量的客户必须进行需求拆分,而对于未超过车辆容量的客户可以拆分也可以不拆分,这里设置了参数比例进行限制。

2.2 需求拆分后的服务时长取值问题


节点的服务时长会影响车辆的行进时间,进而会影响与节点时间窗的匹配问题。一般来说,节点的服务时长与需求量成正比关系,在进行节点需求拆分后,新节点的需求量降低,其服务时长理应也降低。但从标准数据集来看,各需求节点的服务时长均采用同一数值。因此本文在代码实现过程中也采用固定值,不考虑新节点服务时长的变化。当然,如有需要,也可以设置单位货物的服务时长,根据拆分后节点的具体需求量设置相应的服务时长。


3. 求解结果


(1)收敛曲线
在这里插入图片描述

(2)车辆路径
在这里插入图片描述

(3)输出内容

在这里插入图片描述


4. 代码片段


(1)数据结构

import math
import random
import numpy as np
import copy
import xlsxwriter
import matplotlib.pyplot as plt
import csv
import time
# 数据结构:解
class Sol():
    def __init__(self):
        self.obj=None # 目标函数值
        self.node_no_seq=[] # 解的编码
        self.route_list=[] # 解的解码
        self.timetable_list=[] # 车辆访问各点的时间
        self.route_distance_list = None
# 数据结构:需求节点
class Node():
    def __init__(self):
        self.id=0 # 节点id
        self.x_coord=0 # 节点平面横坐标
        self.y_coord=0  # 节点平面纵坐标
        self.demand=0 # 节点需求
        self.start_time=0 # 节点开始服务时间
        self.end_time=1440 # 节点结束服务时间
        self.service_time=0 # 单次服务时长
        self.vehicle_speed = 0 # 行驶速度
# 数据结构:车场节点
class Depot():
    def __init__(self):
        self.id=0 # 节点id
        self.x_coord=0 # 节点平面横坐标
        self.y_coord=0  # 节点平面纵坐标
        self.start_time=0 # 节点开始服务时间
        self.end_time=1440 # 节点结束服务时间
        self.v_speed = 0 # 行驶速度
        self.v_cap = 80 # 车辆容量
# 数据结构:全局参数
class Model():
    def __init__(self):
        self.best_sol=None # 全局最优解
        self.sol_list=[] # 解的集合
        self.demand_dict = {}  # 需求节点集合
        self.depot = None  # 车场节点集合
        self.demand_id_list = [] # 需求节点id集合
        self.distance_matrix = {}  # 距离矩阵
        self.time_matrix = {}  # 时间矩阵
        self.number_of_demands = 0 # 需求点数量
        self.demand_id_list_ = []  # 经先验需求分割后的节点集合
        self.demand_dict_ = {}  # 需求分割后的节点需求集合
        self.distance_matrix_ = {}  # 原始节点id间的距离矩阵
        self.time_matrix_ = {}  # 原始节点id间的时间矩阵
        self.mapping = {}  # 需求分割前后的节点对应关系
        self.split_rate = 0.5 # 控制需求分割的比例(需求超出车辆容量的除外)

        self.rand_d_max = 0.4  # 随机破坏最大破坏比例
        self.rand_d_min = 0.1  # 随机破坏最小破坏比例
        self.worst_d_min = 5  # 最坏值破坏最少破坏数量
        self.worst_d_max = 20  # 最坏值破坏最多破坏数量
        self.regret_n = 5  # 后悔值破坏数量
        self.r1 = 30  # 一等得分值
        self.r2 = 18  # 二等得分值
        self.r3 = 12  # 三等得分值
        self.rho = 0.6  # 权重衰减比例
        self.d_weight = np.ones(2) * 10  # 破坏算子权重
        self.d_select = np.zeros(2)  # 破坏算子选择次数
        self.d_score = np.zeros(2)  # 破坏算子得分
        self.d_history_select = np.zeros(2)  # 破坏算子累计选择次数
        self.d_history_score = np.zeros(2)  # 破坏算子累计得分
        self.r_weight = np.ones(3) * 10  # 修复算子权重
        self.r_select = np.zeros(3)  # 修复算子选择次数
        self.r_score = np.zeros(3)  # 修复算子得分
        self.r_history_select = np.zeros(3)  # 修复算子累计选择次数
        self.r_history_score = np.zeros(3)  # 修复算子累计得分

(2)距离矩阵

# 读取csv文件
def readCSVFile(demand_file,depot_file,model):
    with open(demand_file,'r') as f:
        demand_reader=csv.DictReader(f)
        for row in demand_reader:
            node = Node()
            node.id = int(row['id'])
            node.x_coord = float(row['x_coord'])
            node.y_coord = float(row['y_coord'])
            node.demand = float(row['demand'])
            node.start_time=float(row['start_time'])
            node.end_time=float(row['end_time'])
            node.service_time=float(row['service_time'])
            model.demand_dict[node.id] = node
            model.demand_id_list.append(node.id)
        model.number_of_demands=len(model.demand_id_list)

    with open(depot_file, 'r') as f:
        depot_reader = csv.DictReader(f)
        for row in depot_reader:
            depot = Depot()
            depot.id = row['id']
            depot.x_coord = float(row['x_coord'])
            depot.y_coord = float(row['y_coord'])
            depot.start_time=float(row['start_time'])
            depot.end_time=float(row['end_time'])
            depot.v_speed = float(row['v_speed'])
            depot.v_cap = float(row['v_cap'])
            model.depot = depot
# 初始化参数:计算距离矩阵时间矩阵
def calDistanceTimeMatrix(model):
    for i in range(len(model.demand_id_list)):
        from_node_id = model.demand_id_list[i]
        for j in range(len(model.demand_id_list)):
            to_node_id = model.demand_id_list[j]
            dist = math.sqrt((model.demand_dict[from_node_id].x_coord - model.demand_dict[to_node_id].x_coord) ** 2
                             + (model.demand_dict[from_node_id].y_coord - model.demand_dict[to_node_id].y_coord) ** 2)
            model.distance_matrix[from_node_id, to_node_id] = dist
            model.time_matrix[from_node_id,to_node_id] = math.ceil(dist/model.depot.v_speed)
        dist = math.sqrt((model.demand_dict[from_node_id].x_coord - model.depot.x_coord) ** 2 +
                         (model.demand_dict[from_node_id].y_coord - model.depot.y_coord) ** 2)
        model.distance_matrix[from_node_id, model.depot.id] = dist
        model.distance_matrix[model.depot.id, from_node_id] = dist
        model.time_matrix[from_node_id,model.depot.id] = math.ceil(dist/model.depot.v_speed)
        model.time_matrix[model.depot.id,from_node_id] = math.ceil(dist/model.depot.v_speed)

(3)邻域搜索

# 随机破坏
def createRandomDestory(model):
    d=random.uniform(model.rand_d_min,model.rand_d_max)
    return random.sample(model.demand_id_list_,int(d*(len(model.demand_id_list_)-1)))

# 随机修复
def createRandomRepair(remove_list,model,sol):
    unassigned_node_no_seq = remove_list
    assigned_node_no_seq = [node_no for node_no in sol.node_no_seq if node_no not in remove_list]
    # insert
    for node_no in unassigned_node_no_seq:
        index=random.randint(0,len(assigned_node_no_seq)-1)
        assigned_node_no_seq.insert(index,node_no)
    new_sol=Sol()
    new_sol.node_no_seq=copy.deepcopy(assigned_node_no_seq)
    new_sol.timetable_list, new_sol.obj, new_sol.route_distance,new_sol.route_list=calObj(assigned_node_no_seq,model)
    return new_sol

参考

【1】 A novel approach to solve the split delivery vehicle routing problem

自适应大领域搜索算法(ALNS) 详解及python示例 1 前言 TSP问题的求解方法层出不穷,遗传算法、模拟退火、粒子群算法之类的介绍已经比较多了,同时发现关于自适应大领域搜索算法(Adaptive Large Neighborhood Search, ALNS)的介绍比较少,而且示例代码注释不太详细,刚接触的时候学起来有点费劲,就把学习资料和自己理解的过程写一下,造福和我一样的菜鸟吧。 2 什么是自适应大领域搜索 概念理解:干货 | 自适应大邻域搜索(Adaptive Large Neighborhood Search)入门到精通超详细解析-概念篇 优点、步 阅读详情

相关推荐

邻域搜索(Neighborhood Search ,NS)、大邻域搜索(Large NS , LNS)和自适应大邻域搜索(Adaptive LNS, ALNS)算法的联系与区别

邻域搜索算法、大邻域搜索算法和自适应大邻域搜索算法是一类用于求解组合优化问题的算法,它们在搜索问题解空间时有一些联系和区别。这些算法使用不同的策略来生成邻域解,并选择改进的解进行移动。自适应大邻域搜索算法结合了邻域搜索和大邻域搜索的思想,并具备自适应性,即根据问题的特性动态地调整搜索策略。自适应大邻域搜索算法试图在不同阶段充分利用大邻域的优势,同时避免因搜索空间过大而导致搜索难度增加的问题。大邻域搜索算法与邻域搜索算法类似,但它更加聚焦于探索更大规模的邻域,通常会涉及到更多的解的改变。

再来一下! 6410

着实不错的自适应大邻域搜索算法ALNS

着实不错的自适应大邻域搜索算法ALNS

taozibaby的博客 3589

【运筹优化】自适应大邻域搜索(ALNS)算法实战:从原理到代码实现与性能调优

本文深入解析自适应大邻域搜索(ALNS)算法,从核心原理到代码实现与性能调优。ALNS作为元启发式算法,通过智能化的破坏-重建策略解决组合优化问题,特别适用于车辆路径规划(VRP)等场景。文章详细介绍了破坏算子、修复算子的设计技巧,以及自适应权重更新机制,并提供了Python实现框架和实战案例,帮助开发者掌握这一高效运筹优化工具。

weixin_31364787的博客 272

运筹系列39:ALNS使用

1. ALNS介绍 ALNS(Adaptive Large Neighborhood Search)是现在用的很多的启发式算法,发表于2010年。其基本思路是不断destroying和repairing问题。 定义XXX为问题III的可行解集,c(X)表示要优化的目标。我们从一个初始解x1出发,搜索N(x1)领域范围内的最优值x2,然后再搜索N(x2)范围内的最优值x3……,这是最优梯度下降法。 ...

kittyzc的博客 8178

从零构建PEMFC仿真模型:MATLAB/Simulink中的模块化拆解与系统集成

本文详细介绍了如何在MATLAB/Simulink环境中从零构建质子交换膜燃料电池(PEMFC)仿真模型,包括电化学模型、气体供应系统和热管理系统的模块化实现。通过多物理场耦合技巧和系统集成策略,帮助工程师和研究者高效开发PEMFC控制策略,优化性能并实现实时仿真。

weixin_29294975的博客 361

Argoverse2数据集保姆级导入教程:从下载到预处理全流程解析

本文详细解析了Argoverse2数据集的完整导入流程,从环境配置、数据下载到预处理和高效加载策略。作为自动驾驶领域的标杆数据集,Argoverse2提供多模态传感器数据和高精地图信息,帮助研究者快速搭建数据处理流水线。文章包含实用代码示例和性能优化技巧,特别适合自动驾驶算法开发者参考。

weixin_29035405的博客 338

自适应大规模邻域算法(ALNS)解决VRPTW问题(JAVA)

本文介绍了一种启发式算法(ALNS)的Java代码,并用该算法求解了VRPTW问题实例(SolomnC101(100)算例)。结果显示算法的运行时间在可接受范围内。

Made-In-China-0711的博客 8660

STM32F4驱动ADS1220高精度ADC:从SPI配置到数据校准的完整实战指南

本文详细介绍了如何使用STM32F4微控制器驱动ADS1220高精度ADC,涵盖从SPI接口配置、寄存器设置到数据采集与校准的全过程。通过实战代码示例和硬件设计要点,帮助开发者快速构建高精度数据采集系统,适用于工业测量和精密仪器等应用场景。

weixin_26918763的博客 225

10分钟彻底理解自适应大邻域搜索算法

阅读本文大概需要 10分钟。算法介绍自适应大邻域搜索算法(Adaptive Large Neighborhood Search),简称(ALNS),是由Ropke与Pisinger在20...

木川的技术之路 6242

Linux CentOS 8系统离线升级内核版本

CentOS 8操作系统离线场景下升级内核版本

WQwinter的博客 3237

生物信息学工具链搭建:用conda一键搞定MCScanX所有依赖(Ubuntu20.04实测)

本文详细介绍了在Ubuntu20.04系统上使用conda一键部署MCScanX及其所有依赖的高效方法,解决了传统源码编译安装中的依赖冲突问题。通过conda环境管理工具,研究者可以快速搭建生物信息学工具链,实现基因组共线性分析的高效运行,显著提升研究效率。

backprop5master的博客 247

【运筹优化】元启发式算法详解:(自适应)大邻域搜索算法(( Adaptive) Large Neighborhood Search,(A)LNS)+ 案例讲解&代码实现

在过去的15年中,基于大邻域搜索(LNS)和变异自适应大邻域搜索(ALNS)的启发式算法已经成为解决各种运输和调度问题的一些最成功的范例。大邻域搜索方法通过使用试探法来探索复杂的邻域(交替地破坏和修复解来逐渐改进初始解)。使用大邻域使得在每次迭代中找到更好的候选解成为可能,并因此遵循更有希望的搜索路径。本博客从大邻域搜索的一般框架出发,深入研究了自适应大邻域搜索,讨论了该框架的设计思想和性质。讨论了大邻域搜索方法在路由和调度中的应用。

知不足而奋进,望远山而前行 1万+

Dify使用教程3:Dify创建工作流

Dify使用教程3:Dify创建工作流 接着,我们连接下一个节点:“LLM”填入上下文变量为:result。这时候知识库就添加成功了。添加新节点:结束节点。

拥抱具身智能,昇腾Ascend C 5129

【进阶二】Python实现VRPTW常见求解算法——自适应大邻域搜索算法(ALNS)

基于python语言,实现经典自适应大邻域搜索算法(ALNS)对带有时间窗的车辆路径规划问题( VRPTW )进行求解。

Better.C的博客 7452

硬件电路RS485通信EMC 设计

RS485通讯硬件设计与STM32实现要点 本文详细介绍了RS485通讯系统的硬件设计和STM32实现方案。硬件设计重点包括:采用总线型拓扑结构、120Ω终端电阻匹配、屏蔽双绞线布线、TVS管和自恢复保险丝保护等核心要素。EMC设计强调共模电感抑制干扰、屏蔽层单端接地、光电隔离等技术。软件实现方面,提供了基于STM32F103的完整程序框架,包括UART初始化、收发控制逻辑和中断处理机制,特别强调了收发切换时机、波特率精度等关键注意事项。文中还给出了工业传感器节点的实际应用案例,展示了一个完整的EMC防护电

qq_37999850的博客 1384

【优化模型】求解混合整数线性规划 MILP 问题

混合整数线性规划(Mixed Integer Linear Programming,MILP)是一类优化问题,其中目标函数和约束条件均为线性,并且包含整数变量。MILP 在实际应用中具有广泛的应用,可以解决很多实际问题,如生产调度、网络设计、资源分配等。f — 系数向量。系数向量,指定为实数向量或实数数组。intcon — 整数约束组成的向量。整数约束组成的向量,指定为正整数向量。intcon 中的值指示决策变量 x 中应取整数值的分量。A — 线性不等式约束。线性不等式约束,指定为实矩阵。

Fanjufei的博客 2501

ALNS-自适应大邻域搜索算法

是由Ropke与Pisinger在2006年提出的一种启发式方法,其在邻域搜索的基础上增加了对算子的作用效果的衡量,使算法能够自动选择好的算子对解进行破坏与修复,得到一个成本(cost)最低的一个解。由于算法的自动反馈更新权重机制,根据算子的历史表现与使用次数选择下一次迭代使用的算子,通过算子间的相互竞争来生成当前解的邻域结构,而在这种结构中有很大概率能够找到更好的解,同时可以尽可能地避免出现局部最优解的情况。

Lukkkka77的博客 4349

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

智能优化系列|第一期:自适应大领域搜索算法(ALNS算法)详解与实战案例(附python代码)

​ Adaptive Large Neighborhood Search (ALNS) 算法是一种元启发式算法,用于解决组合优化问题。ALNS 算法结合了离散优化中的邻域搜索和元启发式算法的特点,能够有效地应对各种复杂的优化问题。 ALNS 算法的核心思想自适应大领域搜索的核心思想是:破坏解、修复解、动态调整权重并选择(自适应)。通过设计多组破坏算子和修复算子,扩大解空间搜索范围,对当前解进行改进,表现好的破坏和修复方法相应地得到高分,权重也越高。在每次迭代中,根据以往表现对各个破坏和修复算子进行选择..

扎实耕耘,终有所获 5681

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【进阶六】Python实现SDVRPTW常见求解算法——遗传算法(GA)

基于python语言,采用经典遗传算法(GA)对 带硬时间窗的需求拆分车辆路径规划问题(SDVRP) 进行求解。

Better.C的博客 1547

【改进篇】Python实现VRP常见求解算法——自适应大邻域算法(ALNS)

基于python语言,实现经典自适应大邻域算法(ALNS)对车辆路径规划问题(CVRP)进行求解, 优化代码结构,改进Split函数

Better.C的博客 2717

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——自适应大邻域算法(ALNS)

基于python语言,采用经典自适应大邻域算法(ALNS)对 需求拆分车辆路径规划问题(SDVRP) 进行求解。

Better.C的博客 1475

【进阶六】Python实现SDVRPTW常见求解算法——离散粒子群算法(DPSO)

基于python语言,采用经典离散粒子群算法(DPSO)对 带硬时间窗的需求拆分车辆路径规划问题(SDVRPTW) 进行求解。

Better.C的博客 1330

自适应大邻域搜索算法(Adaptive Large Neighborhood Search——ALNS)

这又是一种基于邻域的搜索算法,邻域及其邻域的相关知识可以看这篇——禁忌搜索(TS——Tabu Search)与邻域搜索基础知识。之所以单独拿出来,是因为邻域搜索Neighborhood Search(NS)(本质也是一种启发式算法)也是一个奇妙的分支。 1.邻域搜索及其大家族 1.1 邻域搜索涉及概念 邻域搜索算法(或称为局部搜索算法)是一类非常常见的改进算法,在每次迭代时通过搜索当前解的“邻域”找到更优的解。邻域搜索算法设计中的关键是邻域结构的选择,即邻域定义的方式。根据以往的经验,邻域越大,局..

sinat_41348401的博客 1万+

Python实现VRP常见求解算法——自适应大邻域搜索算法(ALNS)

基于python语言,实现经典自适应大邻域搜索算法(ALNS)对车辆路径规划问题(CVRP)进行求解。

Better.C的博客 1万+

干货|自适应大邻域搜索(ALNS)算法求解带时间窗的车辆路径规划问题(附java代码)

转眼距离开学又过去一个多月了,不知道大家在家里学习的怎么样?这段时间小编在家里也没闲着,时隔多日,再次为大家带来干货内容。 邻域搜索类启发式算法有很多种,比如禁忌搜索啦,模拟退火啦,变邻域搜索啦等等。这次带来的自适应大邻域搜索代码,相对上述几种会更复杂,编写相对全面。 小编在编写代码时,主要采用git-hub上一位作者de.markusziller的代码,参考他的ALNS框架下写出了解决带时间窗的...

zll_hust的博客 1万+

ALNS算法——一、主逻辑结构解析

转载自:https://mp.weixin.qq.com/s/NenKRjYbsbQiOw3bMx8jSA 一、C++基础 1.1 C++中虚函数的作用 1、简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。 2、实现多态性,多态性是将接口与实现进行分离。 3、当基类指针指向一个子类对象,通过这个指针调用子类和基类同名成员函数的时候,基类声明为虚函数就会调子类的这个函数,不声明就会调用基类的。 1.2 纯虚函数 纯虚函数指明一个虚拟函数只是提供了一个可被子类型改写的接口。.

sky的博客 2424
上一篇: 【进阶六】Python实现SDVRPTW常见求解算法——蚁群算法(ACO)
下一篇: 【进阶六】Python实现SDVRPTW常见求解算法——差分进化算法(DE)
Better.C
博客等级 码龄9年 1万+粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Better.C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值