【进阶六】Python实现SDVRPTW(需求拆分)常见求解算法——禁忌搜索+模拟退火算法(TS+SA)

《Science》期刊发表的经典优化算法:模拟退火算法(Simulated Annealing,SA) 1.回归/时序/分类预测类:BP、RF、XGBoost、RBF、LSSVM、SVM、ELM、DELM、ESN、RELM等等均可,优化算法优化BP为例,可达到以下效果:(1)优化BP神经网络的数据时序预测(2)优化BP神经网络的数据回归(多输入多输出)预测(3)优化BP神经网络的数据回归预测2.分解类:EEMD、VMD、REMD、CEEMDAN、ICEEMDAN、SVMD等分解模型均可,优化算法优化为例,可达到以下效果:(1)基于改进天鹰优化算法(IAO)优化的VMD参数(2) 阅读详情

基于python语言,采用经典禁忌搜索(TS)+模拟退火(SA)对 带硬时间窗的需求拆分车辆路径规划问题(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. 求解结果


3.1 TS


(1)收敛曲线
在这里插入图片描述
(2)车辆路径
在这里插入图片描述

(3)输出内容
在这里插入图片描述

3.2 SA


(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
        self.action_id = None  # 对应的算子id
# 数据结构:需求节点
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.popsize = 100 # 种群规模
        self.split_rate = 0.5 # 控制需求分割的比例(需求超出车辆容量的除外)
        self.tabu_list=None # 禁忌表
        self.TL=30 # 禁忌长度

(2)距离矩阵

# 初始化参数
def cal_distance_matrix(model):
    for i in model.demand_id_list:
        for j in model.demand_id_list:
            d=math.sqrt((model.demand_dict[i].x_coord-model.demand_dict[j].x_coord)**2+
                        (model.demand_dict[i].y_coord-model.demand_dict[j].y_coord)**2)
            model.distance_matrix[i,j]=max(d,0.0001) if i != j else d
        dist = math.sqrt((model.demand_dict[i].x_coord - model.depot.x_coord) ** 2 + (model.demand_dict[i].y_coord - model.depot.y_coord) ** 2)
        model.distance_matrix[i, model.depot.id] = dist
        model.distance_matrix[model.depot.id, i] = dist

(3)邻域

# 构造初始解
def genInitialSol(node_no_seq):
    node_no_seq=copy.deepcopy(node_no_seq)
    random.shuffle(node_no_seq)
    return node_no_seq
# 定义邻域算子
def createActions(n):
    action_list=[]
    nswap=n//2
    #第一种算子(Swap):前半段与后半段对应位置一对一交换
    for i in range(nswap):
        action_list.append([1,i,i+nswap])
    #第二中算子(DSwap):前半段与后半段对应位置二对二交换
    for i in range(0,nswap-1,2):
        action_list.append([2,i,i+nswap])
    #第三种算子(Reverse):指定长度的序列反序
    for i in range(0,n,4):
        action_list.append([3,i,i+3])
    return action_list
# 执行邻域搜索
def doAction(node_no_seq,action):
    node_no_seq=copy.deepcopy(node_no_seq)
    if action[0]==1:
        index_1=action[1]
        index_2=action[2]
        temporary=node_no_seq[index_1]
        node_no_seq[index_1]=node_no_seq[index_2]
        node_no_seq[index_2]=temporary
        return node_no_seq
    elif action[0]==2:
        index_1 = action[1]
        index_2 = action[2]
        temporary=[node_no_seq[index_1],node_no_seq[index_1+1]]
        node_no_seq[index_1]=node_no_seq[index_2]
        node_no_seq[index_1+1]=node_no_seq[index_2+1]
        node_no_seq[index_2]=temporary[0]
        node_no_seq[index_2+1]=temporary[1]
        return node_no_seq
    elif action[0]==3:
        index_1=action[1]
        index_2=action[2]
        node_no_seq[index_1:index_2+1]=list(reversed(node_no_seq[index_1:index_2+1]))
        return node_no_seq

参考

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

禁忌搜索算法(TABU)解决路线规划问题(CVRP) 文章目录禁忌搜索算法解决路线规划问题问题定义CVRP问题解决算法禁忌搜索算法局部搜索的两种策略局部搜索的缺点禁忌搜索算法的提出禁忌搜索算法流程图禁忌搜索算法伪码算法结果统计结果详细结果结论代码清单读取测试数据初始解禁忌搜索解法 禁忌搜索算法解决路线规划问题 问题定义 车辆路线规划问题是一个经典的组合优化问题,也是旅行商问题的泛化。该问题的定义为: 有给定数量的客户有运输需求; 为从某个固定地点出... 阅读详情

相关推荐

基于改进雷达图模型的热电联供型微网系统多目标优化配置附Matlab代码

一、引言在能源结构转型与低碳发展的大背景下,热电联供型微网系统凭借能源综合利用率高、灵活性强等优势,成为实现能源高效利用与可持续发展的重要途径。然而,其配置需同时兼顾经济性、环保性、可靠性等多个目标,传统方法难以全面、直观地评估优化方案。改进雷达图模型通过对传统雷达图的优化,能够更科学、全面地展示多目标优化结果,为热电联供型微网系统的配置决策提供有力支持。二、热电联供型微网系统分析2.1 系统组成热电联供型微网系统主要由能源生产单元、能源转换单元、能源存储单元和负荷单元构成。

qq_59747472的博客 396

【进阶一】Python实现MDCVRP常见求解算法——模拟退火(SA)

基于python语言,实现模拟退火算法(SA)对多车场车辆路径规划问题(MDCVRP)进行求解。

Better.C的博客 1704

模拟退火算法求解VRPTW问题,内附MATLAB源代码以及相关运算案例

模拟退火算法求解VRPTW问题,内附MATLAB源代码以及相关运算案例

【进阶二】Python实现VRPTW常见求解算法——禁忌搜索(TS)

基于python语言,实现经典禁忌搜索算法(TS)对带有时间窗的车辆路径规划问题(VRPTW )进行求解。

Better.C的博客 4038

模拟退火算法解决vrptw

使用模拟退火算法解决带时间窗的车辆路径问题,matlab代码

python实现VRPTW求解禁忌搜索算法

python实现VRPTW求解禁忌搜索+变邻域搜索代码,完美支持所罗门算例!

【ESPPRC问题】模拟退火算法(SA)求解

精确解算法启发式算法优化算法求解器精确解算法: 指可求出最优解的算法。已提出的精确算法种类较多,有分支定界法、割平面法、整数规划算法和动态规划算法等。精确解可以求得优化算法的最优解,但是相对应其时间成本较大,当算例的规模较大时求解速率极低。启发式算法: 通过某些特定的原理在一个解集空间中去搜寻相对最优的解,常见的启发式算法有遗传算法、粒子群算法等等。本文采用的模拟退火算法也是启发式算法中的一种。

weixin_51291300的博客 1301

Sparse4Dv3 代码复现

打包数据集的元信息和标签,并生成所需的.pkl文件。最后还输出了很多跟踪相关的东西...然后通过K-means生成锚点。编译可变形聚合CUDA算子。安装motmetrics。

m0_60857098的博客 4489

经典算法之—模拟退火

一.爬山算法 介绍模拟退火前,先介绍爬山算法。爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解。   图1 二.模

呵呵 2090

SQL Prompt 9.0插件突然无法使用解决办法(附防联网激活)多图+文字

可能由于Redgate公司最近抓盗版抓得严,导致激活后的SQL Prompt联网后突然无法使用,无论卸载重装都没办法继续使用,本人同时使用SQL Assistant和SQL Prompt,我喜欢SQL Assistant代码提示功能,而SQL Prompt我喜欢将查询结果复制后可以直接生产插入脚本,这是最爽的一件事,即便对表有多么熟悉,没有这些插件,几行语法都要敲大半天,目前本人已经离不开这两个插...

骚团长的博客 1万+

速腾聚创多激光雷达点云采集,并用RVIZ进行显示

在ubuntu20.04系统下,使用速腾聚创官方提供的软件RSView,对激光雷达的默认IP地址、MSOP 包端口号、 DIFOP包端口号和时间模式等配置进行查看和修改。使用交换机对两个激光雷达进行组网,实现多激光雷达数据采集,并用RVIZ同时显示两个雷达点云。使用wireshark对比两个雷达数据包。

abanchao的博客 5889

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

基于python语言,实现经典遗传算法(GA)对带有时间窗的车辆路径规划问题(VRPTW)进行求解。

Better.C的博客 9932

浙政钉H5应用上架实战:从环境配置到发布避坑指南

本文详细解析浙政钉H5应用上架全流程,从环境配置到发布避坑指南。重点介绍Vue 2.6 + Node 14.21.3的稳定开发环境搭建、项目结构规范及常见报错解决方案,帮助开发者高效完成浙政钉H5应用上架流程。

weixin_27943395的博客 286

模拟退火算法(附python代码)

https://www.cnblogs.com/ranjiewen/p/6084052.html这篇文章把模拟退火的来龙去脉讲得十分清楚,下面直接上代码。值得注意的是对于不同的问题,其中的关键一步随机扰动的选择是不一样的,如果选择不当会导致搜索域变小或者很难达到最优解(较优),并且求得的解不一定就是最优解。 Q1:第一个例子就是求一个一元函数y=x+10sin(5x)+7cos(4x)的最小值:...

To_be_thinking的博客 1万+

EDKII实战:手把手调试PciHostBridge.c,看UEFI如何分配你的PCIe设备资源(IO/Memory空间)

本文深入解析EDKII中PciHostBridge.c模块的工作原理,详细指导如何调试PCIe设备资源分配(IO/Memory空间)。通过实战案例展示UEFI环境下Root Bridge初始化、地址空间转换及协议安装等核心流程,提供常见问题排查方法与性能优化建议,帮助开发者解决PCIe设备兼容性问题。

weixin_29201933的博客 209

Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)

目录1 编译 Matterport3D Simulator 源码1.1 源码下载1.2 编译 1 编译 Matterport3D Simulator 源码   在 Windows 下编译 Matterport3D Simulator 稍微有些不方便,需要对 CMakeLists.txt 进行一些修改,如果有更好的方法欢迎大家评论。 1.1 源码下载   还是直接在 Github 上搜索 Matterport3D Simulator 的 repo,下载源码。如果用 zip 方式,那么直接在下即可。如果使用

weixin_44110393的博客 4845

模拟退火算法

  引言 在实际日常中,人们会经常遇到如下问题:在某个给定的定义域X内,求函数f(x)对应的最优值。此处以最小值问题举例(最大值问题可以等价转化成最小值问题),形式化为:  如果X是离散有限取值,那么可以通过穷取法获得问题的最优解;如果X连续,但f(x)是凸的,那可以通过梯度下降等方法获得最优解;如果X连续且f(x)非凸,虽说根据已有的近似求解法能够找到问题解,可解是否是最优的还有待考量...

Eric_Wangyz的博客 4444

对CryptoDriver里密钥格式定义的探索(1)

一入网络安全才发现深似海,传统汽车MCU码农转型之路异常艰难。在CP AUTOSAR中的CryptoDriver SWS对密钥格式的需求来源于RFC,其中要求了RSA、ECC、SHE等key material的格式。再往下看,我就有些迷糊了,例如关于RSA Private Key的OCTEE STRING格式根据IETF RFC8017,Public Key又得根据RFC5280,完全不得其解。所以今天先从生成密钥对,并对其进行解析开始,一步一步拆解。

认真搞搞汽车MCU 529

模拟退火算法SA求解多维连续函数极值

(1)由一个产生函数从当前解产生-一个位 于解空间的新解:为便于后续的计算和接受,减少算法耗时,通常选择由当前解经过简单变换即可产生新解的方法。模拟退火算法求得的解与初始解状态(算法迭代的起点)无关,具有渐近收敛性,已在理论上被证明是一种以概率 1收敛于全局最优解的优化算法。Markov链长度是在等温条件下进行迭代优化的次数,其选取原则是在衰减参数T的衰减函数已选定的前提下,L应选得在控制参数的每一取值上都能恢复准平衡,一般L取100~ 1000.,系统接受此状态:否则,以一个随机的概率接受或丢弃此状态。

qq_54169998的博客 1864

传导案例:某医疗仪器传导骚扰整改案例

紫外线光疗仪是一种专业的医疗设备,主要用于治疗银屑病、白癜风等皮肤疾病。该设备采用物理治疗技术,通过特定波长的紫外线照射人体来达到治疗效果。自1984年窄谱中波紫外线(NB-UVB)应用于临床以来,该技术已成为治疗早期蕈样肉芽肿(MF)的有效方法之一。作为二类医疗器械,紫外线光疗仪必须符合严格的电磁兼容性(EMC)标准,这不仅关系到设备自身的稳定运行,更关乎患者的使用安全和治疗效果。紫外线光疗仪传导骚扰整改案例充分展示了系统性EMC设计的重要性。

m0_56451176的博客 340

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

模拟退火算法详解

模拟退火属于搜索算法。搜索算法包括盲目搜索和启发式搜索,按照预定的控制策略实行搜索,在搜索控制中获取的中间信息不用来改进控制搜索,称为盲目搜索,反之,称为启发式搜索。关于“启发式”有两种看法:(1)任何有助于找到问题的解,但不能保证找到解的方法均是启发式方法;(2)有助于加速求解过程和找到较优解的方法是启发式方法。 盲目搜索有深度优先、广度优先、代价优先、向前、向后、双向。。。 启发式搜索有爬...

love code, love life. 4792

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

模拟退火(SA)算法介绍和应用细节-附SA结合登山算法求解VRPTW问题C++代码

文章目录1、模拟退火算法介绍1.1 精确SA算法1.1.1 Metropolis Acceptance Criterion1.1.2 Boltzmann distribution1.2 启发式SA算法1.2.1 温度处理2、结合SA的登山算法2.1 Hill Climbing Pseudo Code2.2 应用于VRPTW问题2.3 VRPTW求解c++代码已上传至GitHub,下面给出链接: 1、模拟退火算法介绍 \qquad模拟退火算法(Simulated Annealing)是一种用于求解离散优化和部

dragon Fly的博客 807

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

最优化算法之模拟退火算法(SA)

一、爬山算法 ( Hill Climbing )   介绍模拟退火前,先介绍爬山算法。爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。   爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动...

青萍之末的博客 5万+

模式识别:模拟退火算法的设计与实现

本节的目的是记录以下学习和掌握模拟退火(Simulated Annealing,简称SA算法)过程。模拟退火算法是一种通用概率算法,用来在一个大的搜寻空间内寻找命题的最优解。这里分别使用随机模拟退火算法和确定性模拟退火算法,在MATLAB平台上进行编程,以寻找一个6-单元全连接网络的能量最小化模型。

liyuefeilong的专栏 1万+

禁忌搜索算法总结

禁忌搜索算法简介 禁忌搜索(Tabu Search,TS)是一种现代启发式算法,由美国科罗拉多大学教授Fred Glover在1986年左右提出的,是一个用来跳脱局部最优解的搜索方法。 算法基于局部搜索算法改进而来,通过引入禁忌表来克服局部搜索算法容易陷入局部最优的缺点,具有全局寻优能力。 局部搜索算法 局部搜索算法从一个初始解开始,通过邻域动作,产生其邻居解,判断邻居解的质量,根据某种策略,来选...

NULL的博客 1万+

【CVRP&VRPTW】Python+Gurobi求解运输问题建模实践二

采用Python+Gurobi实现车辆路径规划问题建模求解【CVRP&VRPTW】

Better.C的博客 1万+
上一篇: 【进阶六】Python实现SDVRPTW常见求解算法——量子粒子群算法(QDPSO)
下一篇: VRPTW算法性能评测来啦!
Better.C
博客等级 码龄9年 1万+粉丝 72原创
评论 1
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值