【VRPCB】Python+Gurobi求解运输问题建模实践三

用C++调用Gurobi的基操教学(后续倾向求解VRP问题) 关于如何使用c++调用Gurobi,来自某大学生的课余学习 阅读详情

采用Python+Gurobi求解带有集群回程需求的VRPCB问题

1. 模型

1.1 VRPB问题介绍

带有回程需求的VRP问题(VRP with Backhauls,VRPB)最初由 Deif, . Bodin, LD. 于1984年出。相关学者将其进一步细分为四类子问题:
第一类VRPCB:

  • 第一类VRPB(VRPCB):
    – 客户只能是linehaul客户和backhaul客户中的一类
    – 车辆在访问backhaul客户集群前,必须先向linehaul客户集群交付货物
    – 客户只能被访问一次

  • 第二类VRPB(VRPBM)
    – 不考虑客户集群限制,车辆可以交叉服务linehaul客户和backhaul客户
    – 客户只能被访问一次

  • 第三类VRPB(VRPPD)
    – 客户可以同时是linehaul客户和backhaul客户
    – 客户可以2次被访问,即:先访问几个客户交付货物,以便部分清空车辆装载。然后,再返回访问该客户提货

  • 第四类VRPB(VRPPD)
    – 客户可以同时是linehaul客户和backhaul客户
    – 客户只能被访问一次

1.2 数学模型

这里暂时只研究VRPCB问题,借用 Toth, P., Vigo, D. 学者于1997给出的整数线性规模。

1.2.1 模型参数

在这里插入图片描述

1.2.2 数学模型

在这里插入图片描述

1.2.3 模型分解

上述模型在复现时有一定困难,尤其是 约束(6)和约束(7)中的 S , F \mathcal{S, F} S,F
这里根据 帖子(其实有一点小bug)提供的分解模型进行复现,模型如下:

在这里插入图片描述

2. 数据结构

原网址暂时想不起来了,回头再补。这里直接贴上代码读取的文件结构,各列依次是:节点id,节点横坐标,节点纵坐标,linehaul客户需求和backhaul客户需求

在这里插入图片描述

3. Gurobi源码

import copy
import csv
import math
import xlsxwriter
import matplotlib.pyplot as plt
from gurobipy import GRB,Model,quicksum

# 读取文件
def read_data(filename):
    Q = {}
    L = []
    B = []
    V = []
    XY = {}
    depot = None
    # 读取网络节点、需求
    with open(filename, 'r') as f:
        node_reader = csv.DictReader(f)
        for row in node_reader:
            if float(row['linehaul']) == 0 and  float(row['backhaul']) == 0:
                depot = row['id']
                Q[depot] = 0
            elif float(row['linehaul']) > 0 and  float(row['backhaul']) == 0:
                L.append(row['id'])
                Q[row['id']] = float(row['linehaul'])
            elif float(row['linehaul']) == 0 and  float(row['backhaul']) > 0:
                B.append(row['id'])
                Q[row['id']] = float(row['backhaul'])
            V.append(row['id'])
            XY[row['id']] = (float(row['x_coord']), float(row['y_coord']))
    # 计算网络弧
    L0 = L + [depot]
    B0 = B + [depot]
    AL = [ (i, j) for i in L0 for j in L if i != j ]
    AB = [ (i, j) for i in B for j in B0 if i != j]
    AC = [ (i, j) for i in L for j in B0 if i != j]
    # 计算网络弧距离
    Cost = {}
    for i in V:
        x1, y1 = XY[i][0], XY[i][0]
        for j in V:
            x2, y2 = XY[j][0], XY[j][0]
            Cost[i,j] = math.sqrt( (x1-x2)**2 + (y1-y2)**2 )
    return depot,L,L0,B,B0,AL,AB,AC,Q,Cost,XY
# 提取结果,形成车辆路径
def extract_routes(depot,L,B,B0,X,Y,Z):
    L = copy.deepcopy(L)
    B = copy.deepcopy(B)
    B0 = copy.deepcopy(B0)
    route_list = []
    V = []
    while len(L):
        # 提取 派送阶段路径
        route = [depot]
        cur_node = depot
        for j in L:
            if X[depot, j].x > 0:
                cur_node = j
                route.append(j)
                L.remove(j)
                break
        stop = True
        while len(L) > 0:
            for j in L:
                if X[cur_node, j].x > 0:
                    cur_node = j
                    route.append(j)
                    if j != depot:
                        L.remove(j)
                    stop = False
                    break
            if stop:
                break
            else:
                stop = True
        # 提取 取货阶段路径
        for j in B:
            if Z[cur_node,j].x > 0:
                cur_node = j
                route.append(j)
                B0.remove(j)
                break
        if cur_node in B:
            while cur_node != depot:
                for j in B0:
                    if Y[cur_node, j].x > 0:
                        cur_node = j
                        route.append(j)
                        if j != depot:
                            B0.remove(j)
                        break
        else:
            route.append(depot)
        route_list.append(route)
        V.extend(route[1:-1])
    print(len(V))
    return route_list
# 绘制车辆路径
def draw_routes(route_list,XY,L,B):
    for route in route_list:
        path_x = []
        path_y = []
        for n in route:
            path_x.append(XY[n][0])
            path_y.append(XY[n][1])
        plt.plot(path_x, path_y, linewidth=0.5, ms=5,color='black')
        linehual_point_x = [XY[n][0] for n in L]
        linehual_point_y = [XY[n][1] for n in L]
        backhual_point_x = [XY[n][0] for n in B]
        backhual_point_y = [XY[n][1] for n in B]
        plt.scatter(linehual_point_x, linehual_point_y, marker='s', c='b', s=5)
        plt.scatter(backhual_point_x, backhual_point_y, marker='o', c='r', s=5)
        plt.show()
# 保存结果
def save_file(route_list,total_cost,Cost):
    wb = xlsxwriter.Workbook('路径方案.xlsx')
    ws = wb.add_worksheet()
    ws.write(0,0,'总费用')
    ws.write(0,1,total_cost)
    ws.write(1,0,'车辆')
    ws.write(1,1,'路径')
    ws.write(1,2,'距离')
    for row,route in enumerate(route_list):
        route_str = [str(i) for i in route]
        dist = sum(Cost[route[i], route[i + 1]] for i in range(len(route) - 1))
        ws.write(row + 2, 0, f'{row + 1}')
        ws.write(row+2,1,'-'.join(route_str))
        ws.write(row + 2, 2, dist)
        row += 1
    wb.close()
# 建模和求解
def solve_model(depot,L,L0,B,B0,AL,AB,AC,Q,Cost,K,CAP,XY):
    """

    :param depot:车场id
    :param L:linehaul节点集合
    :param B:backhaul节点集合
    :param AL:linehaul节点衔接弧集合
    :param AB:backhaul节点衔接弧集合
    :param AC:linehaul节点和backhaul节点衔接弧集合
    :param Q:节点需求集合
    :param Cost:网络弧费用
    :return:
    """
    model = Model()
    # 添加变量
    X = model.addVars(AL,vtype=GRB.BINARY,name='X[i,j]')
    Y = model.addVars(AB,vtype=GRB.BINARY,name='Y[i,j]')
    Z = model.addVars(AC,vtype=GRB.BINARY,name='Z[i,j]')
    U1 = model.addVars(L0,vtype=GRB.CONTINUOUS,name='U[i]')
    U2 = model.addVars(B0, vtype=GRB.CONTINUOUS, name='U[i]')
    # 目标函数
    obj = (quicksum(X[i,j]*Cost[i,j] for i,j in AL) + quicksum(Y[i,j]*Cost[i,j] for i,j in AB) +
           quicksum(Z[i,j]*Cost[i,j] for i,j in AC))
    model.setObjective(obj,GRB.MINIMIZE)
    # linebaul 相关约束
    model.addConstr( quicksum(X[depot,j] for j in L) == K ) # 车辆数约束
    model.addConstrs( (quicksum(X[i,j] for i in L0 if i != j) == 1 for j in L) ) # 派送需求约束
    model.addConstrs( (U1[i] - U1[j] + CAP*X[i,j] <= CAP - Q[j] for i,j in AL) ) # 破圈约束
    # backbaul 相关约束
    model.addConstr( quicksum([Y[j,depot] for j in B]) + quicksum(Z[i,depot] for i in L) == K ) # 车辆数约束
    model.addConstrs( (quicksum(Y[i,j] for j in B0 if i != j) == 1 for i in B) ) # 取货需求约束
    model.addConstrs( (U2[i] - U2[j] + CAP*Y[i,j] <= CAP - Q[j] for i,j in AB) ) # 破圈约束
    # connection 相关约束
    model.addConstr( quicksum(Z[i,j] for i,j in AC) == K ) # 车辆数约束
    model.addConstrs( quicksum(X[i,j] for j in L if i != j ) + quicksum(Z[i,j] for j in B0) <= 1 for i in L ) # 接续约束
    model.addConstrs( quicksum(Y[i,j] for i in B if i != j) + quicksum(Z[i,j] for i in L) <= 1 for j in B) # 接续约束
    # 模型求解
    model.Params.TimeLimit = 300  # 规模较大时可设置求解时间限制
    model.optimize()
    # 判断求解状态
    if model.status == GRB.Status.OPTIMAL or model.status == GRB.Status.TIME_LIMIT:
        route_list = extract_routes(depot,L,B,B0,X,Y,Z)
        draw_routes(route_list, XY, L, B)
        save_file(route_list, model.objVal,Cost)
if __name__=='__main__':
    filename=r'demand-X-n120-50-k3.csv'
    depot,L,L0,B,B0,AL,AB,AC,Q,Cost, XY = read_data(filename)
    solve_model(depot=depot,L=L,L0=L0,B=B,B0=B0,AL=AL,AB=AB,AC=AC,Q=Q,Cost=Cost,K=3,CAP=21,XY=XY)

4. 求解结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考

  1. https://blog.youkuaiyun.com/qq_44149045/article/details/128941919
  2. Koc,Cagri,Laporte,et al.Vehicle routing with backhauls: Review and research perspectives[J].Computers, 2018.
  3. Parragh, S.N., Doerner, K.F. & Hartl, R.F. A survey on pickup and delivery problems . Journal für Betriebswirtschaft 58, 21–51 (2008). https://doi.org/10.1007/s11301-008-0033-7
建模实战|第五期:ortools求解CVRP问题(有容量约束的车辆路径问题)-附python代码 车辆路径问题(VRP)有非常多的变形,这里介绍VRP研究最多的基本问题——有容量约束的车辆路径问题(Capacitated Vehicle Routing Problem,CVRP)。在CVRP问题中,要求由一个车队承担将货物从一个仓库运输到其他预先指定的客户点上的任务。其中,车队的车辆都是同质的,且都只能从仓库出发,服务完客户点后,返回仓库。每个客户点也只能被一辆车访问一次。决策对象是车辆的行驶路线,每辆车在不同的路线上的行驶成本不同,最终的目标是要使得完成这个任务的车队的总成本最小。 阅读详情

相关推荐

VRP(车辆路径问题)的两种简单算法

VRP(车辆路径问题)的两种简单算法VRP问题描述:假设在一个供求关系系统中,车辆从货源取货,配送到对应的若干配送点。车辆存在最大载货量,且配送可能有时间限制。需要合理安排取货时间,组织适当的行车路线,使用户需求得到满足,同时使某个代价函数最小,比如总工作时间最少、路径最短等。可以看出TSP问题是VRP问题的一种简单特殊形式。因此,VRP也是一种NP hard 问题。目前解决此种问题的办法有多种,主

LDOTN的博客 5万+

VRPB(Vehicle Routing Problem Backhauls)说明+pythoncode

Vehicle Routing Problem Backhauls 小算例说明

qq_44149045的博客 2575

优化模型验证关键代码04:VRP两小标模型及其gurobipy实现

两下标VRP模型及其实现源码

AmieeXue的博客 2385

带时间窗的取送货问题(Pickup and Delivery Problem with Time Windows)

广义取送货问题(General Pickup and Delivery Problems,GPDP)可以分为两类:Backhauls,VRPB:从配送中心(depot)取货运输货物到客户点,再从客户点取货运输至配送中心交付(backhoul)。,VRPPD:货物在取货点和送货点之间流转。

博客简介 3389

解决车辆路径问题时所要用的vrp程序

在解决乘凉路径问题时,经常涉及到程序编写,这是一个现成的程序,大家可以借鉴

Gurobi+Python详细的入门教程

该文档包含三个ppt文件,分别为Gurobi入门,Gurobi+Python知识点讲解,Gurobi+Python实战,Gurobi入门肯定没有问题,讲解详细,内附代码贴图,有需要的小伙伴可以尽情下载。

【运筹优化】带时间窗约束的车辆路径规划问题(VRPTW)详解 + Python 调用 Gurobi 建模求解

车辆路径规划问题(Vehicle Routing Problem,VRP)一般指的是:对一系列发货点和收货点,组织调用一定的车辆,安排适当的行车路线,使车辆有序地通过它们,在满足指定的约束条件下(例如:货物的需求量与发货量,交发货时间,车辆容量限制,行驶里程限制,行驶时间限制等),力争实现一定的目标(如车辆空驶总里程最短,运输总费用最低,车辆按一定时间到达,使用的车辆数最小等)。下图给出了一个简单的VRP的例子最基本的VRP问题叫做带容量约束的车辆路径规划问题(Capacitated Vehicle Rou

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

Fedora 41上安装钉钉7.6.25,我踩过的那些依赖坑和最终解决方案

本文详细记录了在Fedora 41上安装钉钉7.6.25版本的全过程,包括解决依赖问题、转换deb包为rpm格式、处理libm.so.6错误等关键步骤。通过分享这些实用技巧和最终解决方案,帮助Linux用户顺利在Fedora系统上运行钉钉客户端,提升工作效率。

weixin_30485379的博客 206

【MDVRP】Python+Gurobi求解运输问题建模实践四

采用Python+Gurobi求解多车场路径规划问题(MDVRP)

Better.C的博客 1697

TwinCAT3入门教程3——PLC程序变量定义和硬件IO关联

目录 1、IO输入输出变量定义和硬件关联 1.1 IO输入 1.2 IO输出 1.3 PLC变量和IO模块关联 1.4 测试IO输出点 2、伺服变量关联 1、IO输入输出变量定义和硬件关联 1.1 IO输入 添加全局变量IO_Global 变量定义 (*==========================================IO输入===============================================================*)

panjinliang066333的博客 1万+

使用LogisticRegression和LightGBM模型对信贷违约进行预测----基于kaggle比赛数据

3.分离数值型变量与类别型变量,发现有些数值型变量因为输入不规范,比如数值中含有字符(28_,_10000_等)被划分为类别型变量 ,比如 'Age','Annual_Income','Num_of_Loan', 'Num_of_Delayed_Payment', 'Changed_Credit_Limit','Credit_Mix','Monthly_Balance', 'Outstanding_Debt' ,'Amount_invested_monthly'等。三、分箱,woe编码,计算IV值。

I_am_a_big_tiger的博客 1682

求解车辆路径问题及其变体的元启发式算法的分类综述

不太常用的变体有绿色VRP (G-VRP)、动态VRP (DVRP)、带负载约束的VRP (VRPLC)、广义VRP (GVRP)、多行程VRP (MT-VRP)、卡车和拖车路由问题(TTRP)、多车厢VRP (MC-VRP)、模糊VRP和站点相关VRP (SD-VRP)。SVRP可分为具有随机需求的VRP (VRPSD)、具有随机客户的VRP (VRPSC)、具有随机需求和客户的VRP (VRPSDC)和具有随机行程和服务时间的(VRPSTS)允许客户的需求被分割并由不同路线的几辆车交付给客户。

m0_50707858的博客 2437

python实现带符号的二进制数转换十进制数 (附完整源码)

python实现带符号的二进制数转换十进制数 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 556

手把手教你用Gurobi求解一个数学模型

手把手教你用Gurobi求解一个数学模型手把手教你用Gurobi求解一个数学模型带时间窗的车辆路径规划问题(Vrptw)python调用Gurobi求解Vrptw首先我们定义一下需要用到的参数:定义一个读取数据的函数,并对节点之间的距离进行计算:读取数据,并定义一些参数:调用gurobi进行模型的建立与求解:根据式(9)定义决策变量,并加入模型当中:根据式(1)定义目标函数,并加入模型当中:根据式(2)~(8)定义决策变量,并加入模型当中: 手把手教你用Gurobi求解一个数学模型 在接触Gurobi之前,

旸的博客 2万+

基于网关实现不同网段S7-1200 CPU的通信方法

在A网段的计算机上ping B网段的计算机:在A网段的计算机上使用ping命令,向B网段的计算机发送数据包。在B网段的计算机上ping A网段的计算机:同样地,在B网段的计算机上使用ping命令,向A网段的计算机发送数据包。数据包也会经过路由器进行转发,最终到达A网段的计算机。配置路由器:在路由器上配置两个网段的IP地址和子网掩码,并设置路由表,使得路由器可以将A网段和B网段之间的数据进行转发。确定两个网络之间的路由器:假设需要将A网段和B网段进行通信,需要在A、B两个网段之间设置一台路由器。

电工 2401

YOLOv11 改进 - SPPF模块 | 发论文神器!LSKA注意力改进SPPF,增强多尺度特征提取能力,高效涨点!!!

本文介绍了Large Separable Kernel Attention (LSKA)模块及其在YOLOv11中的结合应用。LSKA旨在解决Visual Attention Networks (VAN)使用大内核卷积时的计算效率问题,通过将2D深度卷积层的卷积核分解为级联的水平和垂直1-D卷积核,降低了计算复杂度和内存占用,且使VAN更关注物体形状。我们将集成LSKA的SPPF_LSKA模块引入YOLOv11,大量实验表明,改进后的模型在对象识别、检测、分割和稳健性测试上表现出色。

魔改工程师的博客 1279

运筹系列29:routing模型之VRPPD问题

2019年7月发布新版本v7.2,https://developers.google.com/optimization/support/release_notes#announcing-the-release-of-or-tools-v70,这里重点介绍一下VRP问题上的新功能: 1.

kittyzc的博客 6171

labview高低拼接的理解

计算机的一个字节由8位组成,无符号的8位整形表示的范围为0~255,范围太小了,所以用双字节,即16位整形表示更大范围的数字0 ~65535。2.labview中的高低拼接实质是高8位字节左移8位与低8位字节相加,结果是双字节整形。

qwerqwerdhr的博客 837

基于Gurobi 的多仓库多车辆路径优化模型(含代码)

摘要:本文研究多仓库、多车辆的物流路径优化问题,建立混合整数规划模型实现配送效率最大化。模型特点包括:1)支持多仓库协同运作与多车联合配送;2)引入MTZ约束消除子环;3)考虑载重和里程限制;4)采用Gurobi求解器进行优化。通过Python实现建模求解,并结合matplotlib可视化配送路径。该方案适用于城市配送、冷链运输等复杂物流场景,能有效降低总行驶距离,提升资源利用率。核心代码展示了模型构建、约束设置和目标函数定义等关键环节。

Codinggggg的博客 921

Ubuntu 22.04+/WSL2 中解决 `error: externally-managed-environment` 并成功安装 PyTorch + vLLM 的完整指南

Ubuntu 22.04+/WSL2 因遵循 PEP 668 规范,系统 Python 被标记为“外部管理”,导致直接使用 pip install 安装包时报错 externally-managed-environment。解决方案是创建虚拟环境: 通过 python3 -m venv ~/vllm-env 创建隔离环境 激活环境后安装 PyTorch(CUDA 12.1)和 vLLM 避免使用 sudo pip 或 --break-system-packages,防止破坏系统依赖 关键点: 虚拟环

刘一说的IT专栏 298

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Python中安装Gurobi:配置与使用

Python中安装Gurobi:配置记录与使用方法

hhhhhabcdf的博客 3万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Gurobi教程-从入门到入土-一篇顶万篇

Gurobi 实例

Harland Rieper 4万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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...

VRP问题总结——直观理解

ACVRP: Asymmetric capacitated vehicle routing problem BWTSP: Black and white traveling salesman problem CCVRP: Cumulative capacitated vehicle routing problem CTSP: Colored traveling salesman problem CVRP: Capacitated vehicle routing problem CVRPTW: Capacit

仅仅用于个人记录,侵删 2893

[PDPTW]解读Python调用Gurobi求解PDPTW问题(Li & Lim‘s benchmark)之一

1 .构造图片中的数据代开“smallcase.txt"文件,手动删除第一行所有的2,使得10,100,1后面是回车符号对比一下,构造的数据与原数据loc101.txt的格式相同.注意我这里设置的数据类型也是整型而不是浮点型.2. 数据含义第一行:代表车辆的信息10 100 1表示,车辆的个数为10,其容量为100,车速为1.25 200 1表示,车辆的个数为25,其容量为200,车速为1.为了防止误会,这里的“TaskNo"在这里说成node的ID.lc101.txt。

panbaoran913的博客 2107

旅行商问题(TSP)、车辆路径问题(VRP,MDVRP,VRPTW)模型介绍

即将面临毕业之际,把研究生期间的研究工作的基础好好整理了一下,方便以后能快速地捡起来。写了一部分,剩下的之后继续更新。 1.旅行商问题 旅行商问题 (Traveling Salesman Problem,TSP),又叫货郎担问题,它是图论中一个经典的组合优化问题。经典的TSP可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市一次并且仅一次之后,回到出发城市。问他应如何选择在城市之间的行程路线,以使他走过的总路程最短。 从图论的角度来看,该问题其实就是在一个赋权的

chc960609的博客 6万+

VRP问题

一、关于vrp问题 车辆路径问题,可以看成旅行商问题的推广 有N辆车,都从原点出发,每辆车访问一些点后回到原点,要求所有的点都要被访问到,求最短的车辆行驶距离或最少需要的车辆数 Thinking:有哪些应用领域,适用于VRP问题 快递公司,给司机分配送货线路 拼车软件,为司机分配接送乘客的路线 常见的限制要求: 车辆具有可携带的最大重量或数量 司机需要在指定时间窗口内访问某位置 点的访问顺序等 二、VRP问题的流程: 使用RoutingModel进行路径规划管理 1)设置城市个数,车辆

u013052732的专栏 1万+
上一篇: 《车辆路径规划问题》专栏_安全提示3——关于抄袭并通过其本人有偿获取内容的安全提示
下一篇: 【MDVRP】Python+Gurobi求解运输问题建模实践四
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、付费专栏及课程。

余额充值