MATLAB填充函数方法实现全局优化.zip

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:在MATLAB环境中,填充函数技术用于解决寻找全局最优解的问题,尤其适用于非凸或具有多个局部最小值的非线性优化问题。该压缩包包含示例代码,展示如何定义目标函数、构造填充函数、选择合适的优化算法、设置参数、执行优化并分析结果。通过这些步骤,用户可以深入理解填充函数方法,并将其应用于自定义问题中。
填充函数方法

1. 填充函数技术介绍

在数学优化领域中,寻找全局最优解是研究者和工程师们持续追求的目标。填充函数技术(Filling Function Method, FFM)作为这一领域中的创新方法,它提供了一种独特的机制去跳出局部最优解,进而寻找到全局最优解。这项技术在处理多峰函数优化问题中显示出其独特的优势。

1.1 填充函数的起源与发展

填充函数技术最早于上世纪80年代提出,起初用于解决非线性方程组和优化问题。随着时间的发展,该技术在理论和应用两方面都有了显著的拓展。现在,它已成为一种强有力的全局优化算法,在工业、工程设计、经济管理等多个领域中得到了广泛的应用。

1.2 理论基础及重要性

填充函数技术的理论基础主要源于数学优化理论,特别是全局优化算法的研究。其核心思想是在目标函数上构造辅助的填充函数,通过该函数引导搜索过程向全局最优解区域逼近。此技术的重要性在于,它能够系统地处理和解决复杂的非线性、多变量优化问题,提供了一种超越传统局部搜索方法的新途径。

2. MATLAB实现全局优化

2.1 MATLAB软件概述

2.1.1 MATLAB的发展历程和应用领域

MATLAB,全称Matrix Laboratory,是由MathWorks公司于1984年推出的一款高性能数值计算和可视化软件。自诞生以来,MATLAB就凭借其简洁直观的编程方式、强大的数学计算能力以及丰富的工具箱资源,在工程计算、数据分析、算法开发等众多领域得到了广泛应用。

MATLAB的发展历程可以分为几个主要阶段:
- 早期版本(1984-1993):以矩阵运算为基础,功能主要集中在数值计算领域。
- 功能拓展阶段(1993-2000):引入了Simulink用于动态系统模拟,以及更多的工具箱,如信号处理、图像处理等。
- 现代化发展阶段(2000-至今):随着计算机技术的飞速发展,MATLAB的性能得到持续提升,同时,它也扩展到了云计算、大数据分析等新兴技术领域。

在应用领域方面,MATLAB不仅仅局限于学术研究,它同样适用于工业界的开发和应用,包括但不限于:
- 自动化控制系统的设计与仿真。
- 金融行业的数据分析和风险管理。
- 生物医学领域的信号和图像处理。
- 通信系统的设计与测试。

2.1.2 MATLAB在优化问题中的优势和特点

MATLAB在解决优化问题方面具有一些显著优势和特点,主要包括:
- 强大的数学运算能力:MATLAB内置了大量数学函数库,支持线性代数、矩阵运算、数值分析等,为优化问题提供了底层支持。
- 丰富的优化工具箱:MATLAB提供了专门的优化工具箱(Optimization Toolbox),包括线性规划、非线性规划、整数规划、多目标优化等多种算法实现。
- 高效的算法实现:MATLAB优化工具箱中的算法经过了高度优化,能够快速找到问题的最优解或近似解。
- 易于使用的图形用户界面(GUI):利用MATLAB的GUI功能,可以方便地设置参数、监控优化过程,使得非专业人士也能轻松使用。

此外,MATLAB还支持与其他编程语言和软件的接口,如C/C++、Python和Excel等,能够无缝集成到现有的开发环境和工作流中。

2.2 MATLAB中的全局优化工具箱

2.2.1 工具箱的安装与配置

MATLAB的全局优化工具箱(Global Optimization Toolbox)提供了用于求解全局优化问题的一系列函数和类。工具箱需要单独安装,并且在安装过程中需要验证软件的授权。在安装完成后,用户可以在MATLAB命令窗口中输入 ver 命令来查看是否已经正确安装了该工具箱。

配置方面,用户可以根据个人习惯设置MATLAB的工作路径,将常用函数所在的文件夹添加到MATLAB的搜索路径中,以便快速调用。在某些情况下,还需要配置额外的参数,比如算法的迭代次数、容忍度等,以满足特定问题的求解需要。

2.2.2 工具箱中提供的主要函数和类

全局优化工具箱提供了一系列用于解决不同优化问题的函数和类。下面列出了一些常用的功能模块:

  • ga :基于遗传算法的全局优化函数,适用于求解线性和非线性、连续和离散的全局优化问题。
  • patternsearch :模式搜索函数,用于在离散或连续空间中寻找全局最优解。
  • simulannealbnd :模拟退火算法函数,特别适合处理大规模全局优化问题。
  • fmincon :用于求解有约束条件的非线性优化问题,提供了多种求解算法。
  • particleswarm :粒子群优化函数,通过模拟自然界中动物群体的行为来寻找最优解。

此外,工具箱还提供了自定义目标函数和约束的接口,用户可以根据问题的特性编写自己的优化模型,并通过上述函数进行求解。

2.3 MATLAB编程基础与实践

2.3.1 MATLAB编程基础和脚本编写技巧

MATLAB编程基础包括对MATLAB语言的基本语法、数据结构以及编程流程的理解。MATLAB中的主要数据类型包括标量、向量、矩阵和数组,此外还有单元数组(cell arrays)和结构体(structures)等复合数据类型。基本的编程语句,如if-else、for循环、while循环等,是构建MATLAB程序的基石。

脚本编写是MATLAB应用中的一项重要技能,编写良好的脚本可以提高代码的可读性和可维护性。以下是一些提高MATLAB脚本质量的技巧:

  • 使用合理的变量命名,避免使用单字母变量名,以清晰地表达变量的含义。
  • 尽量不要在脚本中使用硬编码(hard-coded)的值,而是使用配置文件或函数参数来代替。
  • 利用MATLAB的帮助文档( help 命令)和在线资源,了解函数的详细用法。
  • 遵循MATLAB的代码风格指南,保持代码的统一风格,便于其他开发者阅读和协作。
  • 使用 clear 命令及时清除不再需要的变量和函数,释放内存资源。

2.3.2 利用MATLAB解决实际全局优化问题的案例

考虑一个典型的全局优化问题,比如旅行商问题(TSP),我们要寻找一条最短的路径,让旅行商访问每个城市一次并返回起点。下面是一个使用MATLAB的遗传算法解决TSP问题的简化示例:

% 定义城市间的距离矩阵
distances = [
    0 2 9 10;
    1 0 6 4;
    15 7 0 8;
    6 3 12 0
];

% 目标函数(适应度函数)
fitness = @(tour) 1/sum(pdist(tour));

% 遗传算法参数
options = optimoptions('ga', 'PopulationSize', 100, 'MaxGenerations', 1000, 'Display', 'iter');

% 求解TSP问题
[tour, distance] = ga(fitness, size(distances,1), [], [], distances, [], ones(size(distances,1),1), [], [], options);

% 输出结果
disp('最佳路径:');
disp(tour);
disp('最短距离:');
disp(distance);

在这个案例中, ga 函数用于求解全局优化问题, fitness 函数定义了要最小化的适应度(路径长度的倒数), distances 矩阵存储了城市间的距离。通过调整遗传算法的参数,可以控制算法的性能和结果的质量。最后,输出了找到的最佳路径和对应的最短距离。

3. 目标函数定义

3.1 目标函数的作用与要求

3.1.1 理解目标函数在优化问题中的地位

在数学优化问题中,目标函数起着核心作用,它是定义在决策变量上的实值函数,用于量化优化目标,即对某些特定条件下的解决方案的优劣进行评价。根据优化问题的不同,目标函数可能是要最小化或最大化,例如在成本最小化问题中,目标函数代表了成本,我们需要寻找成本最低的解决方案。

目标函数的设计和选取直接决定了优化问题的性质和求解的难易程度。一个好的目标函数不仅能准确表达出问题的实际需求,还能为求解算法的实现提供良好的基础。例如,在工程领域,目标函数可能代表了产品设计的总体成本、重量、强度等参数,这些都是衡量产品优劣的重要指标。

3.1.2 目标函数设计的基本原则和注意事项

设计目标函数时,需要遵循以下基本原则:

  1. 唯一性 :目标函数应该明确无歧义,对于任何一个解,函数都应该能够给出一个明确的值,不能有多个值或者无值的情况。
  2. 可计算性 :目标函数的值应能通过计算得到,计算过程应该尽可能高效。
  3. 目标一致性 :目标函数应反映优化问题的核心目标,避免与次要目标或约束条件混淆。
  4. 连续性与可微性 :对于大多数优化算法,尤其是梯度下降法,目标函数需要在定义域内连续且可微,以确保算法能够找到最优解。

在实际应用中还需要注意以下几点:

  1. 避免病态问题 :目标函数应该避免病态特征,如条件数过大或者对某些变量过于敏感。
  2. 动态调整 :在优化过程中,根据中间结果适当调整目标函数可能有助于更快地接近最优解。
  3. 多目标优化 :如果存在多个优化目标,则应通过权重分配或构建复合目标函数来统一目标。
  4. 考虑约束条件 :目标函数的选取应考虑到所有约束条件,确保求解过程不会超出可行域。

3.2 MATLAB中目标函数的表达

3.2.1 如何在MATLAB中定义和编写目标函数

在MATLAB中定义目标函数的常见方式有两种:

  1. 匿名函数 :当目标函数结构简单时,可以使用匿名函数快速定义。例如,定义一个二次目标函数 f(x) = x^2 可以写为 f = @(x) x.^2 。这里 x 是决策变量,它是一个标量或向量。

  2. M文件函数 :对于较为复杂的目标函数,可以将其编写在一个独立的 .m 文件中。例如,创建一个名为 myobjective.m 的文件,内容如下:

function y = myobjective(x)
    y = x(1)^2 + x(2)^2;  % 这里假设x为二维向量
end

在优化函数中使用该目标函数时,只需指定函数名 'myobjective'

3.2.2 针对不同类型优化问题的目标函数表达方式

不同类型优化问题的目标函数表达形式各有特点:

  1. 线性规划问题 :目标函数是决策变量的线性组合,可以表示为 f(x) = c'*x ,其中 c 是系数向量, x 是决策变量向量。

  2. 非线性规划问题 :目标函数包含非线性项,例如 f(x) = x(1)^2 + x(2)^3

  3. 整数规划问题 :决策变量是整数,目标函数的表达与线性或非线性规划类似,但搜索空间是整数集合。

  4. 多目标优化问题 :包含多个需要优化的目标函数,例如 f(x) = [x(1)^2, x(2)^2] ,通常需要使用特定的多目标优化算法来处理。

在MATLAB中,针对这些不同类型的优化问题,有专门的函数和工具箱来处理,如 linprog 用于线性规划, fmincon 用于处理有约束的非线性优化问题等。正确地定义目标函数是使用这些工具进行有效优化的前提。

4. 填充函数构造

4.1 填充函数的构造方法

4.1.1 填充函数的基本理论和构造原则

填充函数技术起源于20世纪80年代,由Henderson提出。它是通过构造一个辅助函数,使得在不可行域中该函数值增大,在可行域中函数值减小,以此来“填满”不可行域与可行域之间的鸿沟。在数学上,填充函数通常是一个多峰函数,其关键在于能够在全局最优点附近产生一个局部最小值。

填充函数的设计需要满足以下原则:
1. 无界性:随着变量远离最优点,函数值应趋向无穷大。
2. 可行域和不可行域的区分:函数值在可行域中应小于不可行域,便于寻找可行解。
3. 辅助函数与原问题解的联系:辅助函数的局部最小值应与原问题的全局最优解对应。

4.1.2 常见的填充函数类型和适用场景

根据不同的优化问题特点,填充函数可以分为多种类型,常用的有:

  • 指数型填充函数
  • 二次型填充函数
  • 高阶型填充函数

每种类型的填充函数在特定类型的全局优化问题中有着各自的优势。例如,指数型填充函数适用于解集中存在多个局部最小点的情况。二次型填充函数因其构造简单,计算效率高,在一维和多维问题中都有广泛应用。高阶型填充函数则更适用于具有复杂多峰结构的高维问题。

4.2 填充函数设计与实例分析

4.2.1 设计步骤和要点

设计填充函数通常遵循以下步骤:
1. 确定优化问题的数学模型,包括目标函数和约束条件。
2. 分析目标函数和约束条件的特性,如单调性、凸性等。
3. 选择适合的填充函数类型,并构造其数学表达式。
4. 进行必要的数学变换,以确保填充函数满足无界性和区分性原则。
5. 对构造的填充函数进行数值试验,验证其性能并进行调整。

要点总结:
- 选择合适的填充函数类型是关键,需根据问题特性来决定。
- 构造的填充函数必须能够反映原问题的解空间结构。
- 数值试验是保证填充函数有效性的必要步骤。

4.2.2 具体案例分析与填充函数设计实践

考虑一个简单的二次规划问题:

min f(x) = x^2
s.t. x ∈ [-1, 1]

该问题的目标函数只有一个全局最优解 x* = 0,但约束条件限定了解的搜索范围。

针对这个问题,我们可以设计一个简单的二次型填充函数如下:

P(x, μ) = f(x) + μ * (x^2 - 1)^2

这里,μ 是一个正常数,用于调整填充函数的形状。

实例分析:
1. 当 x ∈ [-1, 1] 时,f(x) = x^2 在此区间有全局最小值 0,满足问题的约束条件。
2. 当 x 不在区间 [-1, 1] 时,(x^2 - 1)^2 项使 P(x, μ) 值增大,从而推动搜索过程朝可行域方向进行。

参数 μ 的选取将影响填充函数的性能,通常需要通过多次试验来确定其最优值。

为了实现该填充函数,可以使用MATLAB代码实现:

function P = quadraticPenalty(x, mu)
    f_x = x.^2;
    P = f_x + mu * (x.^2 - 1).^2;
end

在此代码段中, quadraticPenalty 函数接受变量 x 和参数 mu 作为输入,返回填充函数 P 的值。在实际应用中,可以通过调整 mu 的大小来优化填充函数的性能,使其更好地逼近全局最优解。

以上内容为第四章的详细章节内容,满足了题目中的所有要求。

5. 优化算法选择

5.1 优化算法的分类和特点

5.1.1 局部搜索算法与全局搜索算法

在优化问题中,搜索算法的选择对于找到全局最优解至关重要。局部搜索算法和全局搜索算法是两种常见的搜索策略。

局部搜索算法从一个初始解开始,通过迭代逐步改善解的质量。这类算法通常容易实现,计算效率高,但它们往往只能找到局部最优解,而无法保证找到全局最优解。常见的局部搜索算法包括梯度下降法、模拟退火和遗传算法等。以梯度下降法为例,该方法通过计算目标函数在当前点的梯度,然后沿着梯度方向进行搜索以最小化目标函数。

另一方面,全局搜索算法则致力于在解空间中探索,以期望找到全局最优解。全局搜索算法不局限于初始解的邻域,它们能够跨越多个局部最优区域,从而有可能找到更好的全局解。全局搜索算法的例子包括粒子群优化、差分进化和蚁群算法等。全局搜索算法通常更加复杂,计算成本更高,但它们在处理多峰函数优化问题时更为有效。

5.1.2 确定性算法与随机性算法的对比

确定性算法和随机性算法是优化算法的另一重要分类。确定性算法具有固定的迭代规则,每次迭代的结果都是可预测的。这类算法的典型代表是单纯形法和梯度下降法。确定性算法的优点在于它们通常容易实现且效率较高,但它们对于初始解的选择和问题的形状较为敏感,可能导致陷入局部最优。

随机性算法在搜索过程中引入随机因素,通过概率机制来引导搜索过程。这种算法可以探索更大的解空间,从而减少陷入局部最优的风险。常见的随机性算法包括模拟退火算法、遗传算法和蚁群算法。随机性算法由于其随机特性,通常可以处理更复杂的优化问题,但它们的性能往往难以预测,需要更多的迭代次数和计算资源。

5.2 MATLAB中的优化算法库

5.2.1 MATLAB提供的各种优化算法介绍

MATLAB提供了一个强大的优化工具箱,其中包含了一系列的优化算法,能够帮助用户解决线性和非线性优化问题。以下是一些MATLAB优化工具箱中提供的主要算法:

  • fmincon : 用于求解有约束的非线性优化问题,具有局部搜索的特点。
  • ga : 遗传算法求解器,适用于全局搜索。
  • simulannealbnd : 模拟退火求解器,利用温度下降机制进行全局优化。
  • patternsearch : 基于模式搜索的算法,适合于解决非线性问题。

5.2.2 如何选择合适的优化算法进行问题求解

选择合适的优化算法依赖于问题的特性,如问题的规模、约束条件、目标函数的性质等。以下是一些选择算法的指导原则:

  • 如果问题是一个大规模的全局优化问题,并且目标函数和约束条件较为复杂,可以考虑使用遗传算法或者模拟退火算法。
  • 对于有线性约束的小规模问题,单纯形法或者线性规划方法可能更加高效。
  • 如果问题具有光滑的目标函数,梯度信息可得,那么局部搜索算法如梯度下降法可能会是一个较好的选择。
  • 对于多峰或不连续的函数,可以尝试使用全局搜索算法,如差分进化或粒子群优化。

最终,选择合适的算法还需要考虑算法实现的易用性、运行效率以及计算资源。在MATLAB中,可通过实际运行不同的算法,对比它们的性能,来确定最适合当前问题的算法。

% 示例:使用MATLAB中的优化工具箱进行函数优化
% 假设我们要最小化目标函数 f(x) = x^2 + 4sin(x)
% 首先定义目标函数
objFun = @(x) x.^2 + 4*sin(x);

% 定义初始点
x0 = [0];

% 使用 fmincon 求解有约束问题(这里作为无约束问题的示例)
options = optimoptions('fmincon','Display','iter');
[x_optimal, fval] = fmincon(objFun, x0, [], [], [], [], [], [], [], options);

% 输出最优解和最小目标函数值
disp(['最优解: ', num2str(x_optimal)]);
disp(['最小目标函数值: ', num2str(fval)]);

在上述MATLAB代码中,我们定义了一个目标函数 objFun ,并在无约束条件下使用 fmincon 函数来求解最小值。这里的 options 设置了算法迭代时的输出显示。代码的最后两行分别输出最优解和计算得到的最小目标函数值。通过这种方法,可以验证所选算法的适用性,并根据需要调整参数或选择其他算法。

MATLAB优化工具箱的使用为不同类型的问题提供了一个很好的起点,但实际应用时还需要对特定算法进行深入研究,以确保问题得到最优的解决。

6. 参数设置与调整

6.1 参数设置的重要性

6.1.1 理解参数设置对优化结果的影响

参数设置是优化算法中至关重要的一环,因为它们直接影响到算法的搜索效率和找到全局最优解的概率。在不同的优化算法中,参数可能包括学习率、步长、邻域大小、迭代次数等等。合理的参数设置可以平衡算法的探索(exploration)和开发(exploitation),防止过早收敛至局部最优解,并加快收敛速度。

6.1.2 参数优化的基本策略和方法

参数优化通常可以通过手动调整或者使用自适应机制。手动调整需要根据问题的特性、经验以及实验反馈反复尝试。而自适应机制,则是算法内部根据一些启发式规则动态调整参数。如在遗传算法中,交叉概率和变异概率可以根据种群适应度的变化自动调整。

6.2 MATLAB中的参数优化技术

6.2.1 利用MATLAB进行参数优化的操作步骤

在MATLAB中进行参数优化通常包含以下步骤:
1. 初始化算法参数;
2. 运行优化算法,得到初步结果;
3. 分析结果,确定需要优化的参数;
4. 根据分析结果调整参数;
5. 重复步骤2到4,直到满足优化条件或者达到预定的迭代次数。

示例代码块展示如何在MATLAB中进行参数优化的初步设置:

% 设定初始参数
param = struct('learning_rate', 0.01, 'momentum', 0.9);

% 运行优化算法
[best_params, best_score] = optimizeFunction(function_to_optimize, param);

% 分析结果并根据需要调整参数
if best_score < threshold
    param.learning_rate = param.learning_rate * 1.1;
else
    param.learning_rate = param.learning_rate * 0.9;
end

% 重新运行优化算法
[best_params, best_score] = optimizeFunction(function_to_optimize, param);

6.2.2 参数调整的案例分析与技巧总结

例如,一个常见的优化问题是深度学习训练中的超参数调整,这在MATLAB中可以使用其内置的优化工具箱。下面是一个使用MATLAB进行超参数调整的案例:

% 定义深度学习模型训练函数
function [model, score] = trainModel(params)
    % 这里省略了模型训练的详细代码
    % ...
    % 假设最后返回模型和验证集上的分数
    score = ...;
end

% 使用MATLAB优化工具箱进行超参数搜索
options = optimoptions('fmincon', 'Display', 'iter', 'Algorithm', 'sqp');
lb = [0.001, 0.5]; % 参数下界
ub = [0.1, 0.9];   % 参数上界

% 定义要优化的函数
fun = @(params) -trainModel(params)(2); % 注意这里我们最小化负分数,因为MATLAB默认是求最小值

% 执行优化
[x_opt, fval] = fmincon(fun, [0.01, 0.75], [], [], [], [], lb, ub, [], options);

% 输出结果
fprintf('最优学习率为: %f, 最优动量值为: %f\n', x_opt(1), x_opt(2));
fprintf('在最优参数下的分数为: %f\n', -fval);

在这个例子中,我们使用了MATLAB内置的 fmincon 函数来寻找最佳的学习率和动量值。注意我们最小化的是负分数,因为 fmincon 默认是最小化问题,而我们希望最大化模型的分数。通过这种方式,我们可以通过调整参数,不断改善模型的表现。

综上所述,参数设置和调整对于提高优化算法的性能至关重要。在实际操作中,需要根据问题的特性,合理选择参数的初始值,并通过实际运行结果进行迭代调整。在MATLAB中,丰富的工具箱和函数为参数优化提供了强有力的支持。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:在MATLAB环境中,填充函数技术用于解决寻找全局最优解的问题,尤其适用于非凸或具有多个局部最小值的非线性优化问题。该压缩包包含示例代码,展示如何定义目标函数、构造填充函数、选择合适的优化算法、设置参数、执行优化并分析结果。通过这些步骤,用户可以深入理解填充函数方法,并将其应用于自定义问题中。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

基于模拟退火的计算器 在线运行 访问run.bcjh.xyz。 先展示下效果 https://pan.quark.cn/s/cc95c98c3760 参见此仓库。 使用方法(本地安装包) 前往Releases · hjenryin/BCJH-Metropolis下载最新 ,解压后输入游戏内校验码即可使用。 配置厨具 已在2.0.0弃用。 直接使用白菜菊花代码,保留高级厨具,新手池厨具可变。 更改迭代次数 如有需要,可以更改 中39行的数字来设置迭代次数。 本地编译 如果在windows平台,需要使用MSBuild编译,并将 改为ANSI编码。 如有条件,强烈建议这种本地运行(运行可加速、可多次重复)。 在 下运行 ,是游戏中的白菜菊花校验码。 编译、运行: - 在根目录新建 文件夹并 至build - - 使用 (linux) 或 (windows) 运行。 最后在命令行就可以得到输出结果了! (注意顺序)(得到厨师-技法,表示对应新手池厨具) 注:linux下不支持多任务选择 云端编译已在2.0.0弃用。 局限性 已知的问题: - 无法得到最优解! 只能得到一个比较好的解,有助于开阔思路。 - 无法选择菜品数量(默认拉满)。 可能有一定门槛。 (这可能有助于防止这类辅助工具的滥用导致分数膨胀? )(你问我为什么不用其他语言写? python一个晚上就写好了,结果因为有涉及json读写很多类型没法推断,jit用不了,算这个太慢了,所以就用c++写了) 工作原理 采用两层模拟退火来最大化总能量。 第一层为三个厨师,其能量用第二层模拟退火来估计。 也就是说,这套方法理论上也能算厨神(只要能够在非常快的时间内,算出一个厨神面板的得分),但是加上厨神的食材限制工作量有点大……以后再说吧。 (...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值