收藏 分销(赏)

基于MatLab分布式编程模型的机械优化设计算法实验指导书样本.doc

上传人:精*** 文档编号:4656886 上传时间:2024-10-08 格式:DOC 页数:21 大小:323KB
下载 相关 举报
基于MatLab分布式编程模型的机械优化设计算法实验指导书样本.doc_第1页
第1页 / 共21页
基于MatLab分布式编程模型的机械优化设计算法实验指导书样本.doc_第2页
第2页 / 共21页
点击查看更多>>
资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。 基于MATLAB分布式编程模型的机械优化设计算法实验指导书 一、 实验所需基础知识 MATLAB是matrix & laboratory两个词的组合, 意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、 可视化以及交互式程序设计的高科技计算环境。它在很大程度上摆脱了传统非交互式程序设计语言(如C、 Java)的编辑模式。本指导书重点阐述在MATLAB的编程环境下, 如何运用优化工具箱(Optimization Toolbox)、 分布式计算服务(MATLAB Distributed Computing Server, 简称MDCE)和并行计算工具箱(Parallel Computing Toolbox)实现机械优化设计的算法, 有关MATLAB操作环境和编程语言的详细基础知识请参考帮助文件或其它相关资料。 1.MATLAB语言编程简介 MATLAB开发环境除了提供命令窗口( Command Window) , 实现人机交互式操作外, 还提供编辑器( Editor) , 用户能够编制自己的程序文件。用MATLAB语言编写的能够在MATLAB环境中运行的程序称为M文件, M文件用扩展名.m 结尾, 可在命令行中执行, 也可被其它程序调用。M文件分为两种: 命令文件和函数文件, 它们有各自的特点。 1.1 函数文件 函数接收输入参数, 返回输出参数。函数文件与程序文件类似也是以”.m”为扩展名的文本文件, 而程序文件与函数文件的主要区别在于, 函数允许经过数值进行参数传递, 而且函数使用局部变量而不是全局变量操作。另外函数文件的第一行必须包括”function”这个关键字。函数文件的文件名必须和函数定义的函数名称相同。 MATLAB的函数M文件一般由以下几个部分组成: l 函数定义行 函数M文件的第一行用关键字”function”把M文件定义为一个函数, 并指定它的名字, 而且与文件名必须相同, 同时定义了函数的输入和输入参数。输入参数的定义用小括号(), 如果有多个输入参数则用逗号分隔; 输出参数的定义用中括号[], 如果有多个输出参数则用逗号分隔。 l H1行 所谓H1行指帮助文本的第一行, 它紧跟在定义行之后并以”%”符号开头, 用于概括说明函数名和函数的功能。 l 函数帮助文本 帮助文本指位于H1行之后函数体之前的说明文本, 同样以”%”符号开头, 一般用来比较详细地介绍函数的功能和用法。在命令窗口用help命令时将显示函数的H1行和所有帮助文本。当然, 帮助文本是可选项, 不是必选项。 l 函数体 是函数的主体部分, 包括进行运行和赋值操作的所有MATLAB程序代码, 其中能够有流程控制、 输入输出、 计算、 赋值、 注释以及函数调用等操作。 l 注释 除了函数开始独立的帮助文本外, 还能够在函数体中添加对语句的注释。注释必须以”%”符号开头, MATLAB在编译执行M文件时把每一行中”%”后面的全部内容作为注释不进行编译。 例1.1: 黄金分割法求一维问题最优解算法函数minHJ.m function [x,minf] = minHJ(f,a,b,isDisplay,eps) % 一维黄金分割法 %f: 目标函数的符号表示式 %a: 区间左端 %b: 区间右端 %isDisplay: 是否显示求解结果 %eps: 收敛精度 if nargin <= 3 isDisplay = false; end format long; if nargin <= 4 eps = 1.0e-6; end l = a + 0.382*(b-a); u = a + 0.618*(b-a); k=1; tol = b-a; while tol>eps && k<100 fl = subs(f , findsym(f), l); fu = subs(f , findsym(f), u); if fl > fu a = l; l = u; u = a + 0.618*(b - a); else b = u; u = l; l = a + 0.382*(b-a); end k = k+1; tol = abs(b - a); end if k == 100000 disp('找不到最小值! '); x = NaN; minf = NaN; return; end x = (a+b)/2; minf = subs(f, findsym(f),x); if isDisplay disp '----------黄金分割法求解结果----------'; fprintf('迭代次数 k=%6d\n',k); fprintf('最优点 x*=%6.2f\n',x); fprintf('最优值 f(x*)=%6.2f\n',minf); end format short; 1.2 命令文件 命令文件没有输入参数也没有输出参数, 只是一些MATLAB命令和函数的组合。命令文件能够操作工作空间的变量, 也能够生成新的变量, 可是当命令文件执行结束后新变量将保存在工作空间中, 不会被自动清除。 例1.2: 调用黄金分割法求解一维函数的最优解minHJ_test.m clc; syms t; f = t^3 - 3*t + 2; [x,minf]=minHJ(f,-3,5,true); 在编辑器界面按F5键运行该程序, 其运行结果如下: ----------黄金分割法求解结果----------- 迭代次数 k= 34 最优点 x*= 1.00 最优值 f(x*)= 0.00 1.3 子函数 一个M文件中能够定义多个函数, 其中第一个定义的函数称为主函数, 主函数名必须与M文件名相同, 其它函数称为子函数。子函数只能被定义它的文件中的函数调用, 其它函数和文件不能调用。 1.4 局部函数 把一些文件放在private目录下, 那么这些文件中定义的函数就是局部函数。局部函数只能被其父母目录中的函数或文件调用, 其它函数和文件无权调用。 1.5 M文件的执行 当Matlab 遇到一个新的名称( 命令、 函数、 变量) 时, 按如下次序查找这个名称: ( 1) 当前的工作空间; ( 2) 子函数名称; ( 3) 局部函数名称; ( 4) set path 指定的路径。 要想使自己编写的函数或命令能够在命令窗口自由的使用, 一个比较好的处理方法是建立一个目录, 并把这个目录加到Set Path指定的目录中, 将自己编写的M 文件都存放到这个目录中。 2.MATLAB优化工具箱(Optimization Toolbox) 我们除了能够运用MATLAB语言自己编写优化算法外, 还能够直接调用优化工具箱来解决工程设计中的优化问题。 2.1 MATLAB优化工具箱的常见函数 MATLAB优化工具箱由一系列函数组成, 主要包括: 边界约束条件下的非线性最小化 Fminbnd 求解多变量函数的最小化 Fminunc 求解无约束非线性最小化 Fminsearch 求解线性规划问题 Linprog 求解二次规划问题 Quadprog 求解有约束的非线性最小化 Fmincon 求解多目标规划的优化问题 Fgoalattain 求解最小、 最大化问题 Fminimax 各个函数的语法结构和适用解决优化问题的类型, 请参阅MATLAB帮助文件。另外, 在MATLAB的命令窗口键入命令 help optim 结果显示该工具箱中所有函数清单,部分函数如下图示。 2.2函数调用时需要注意的问题 使用优化工具箱时, 由于优化函数要求目标函数和约束条件满足一定的格式, 因此需要用户在进行模型输入时注意以下几个问题: (1).目标函数最小化 优化函数fminbnd、 fminsearch、 fminunc、 fmincon、 fgoalattain、 fminmax和lsqnonlin都要求目标函数最小化, 如果优化问题要求目标函数最大化, 能够经过使该目标函数的负值最小化即-f(x)最小化来实现。近似地, 对于quadprog函数提供-H和-f, 对于linprog函数提供-f。 (2).约束非正 优化工具箱要求非线性不等式约束的形式为Ci(x)≤0, 经过对不等式取负能够达到使大于零的约束形式变为小于零的不等式约束形式的目的, 如Ci(x)≥0形式的约束等价于-Ci (x)≤0; Ci (x)≥b形式的约束等价于-Ci (x)+b≤0。 2.3 应用实例 设计一圆形截面的悬臂梁, 该梁在悬臂端作用有集中载荷P=1000kgf, 扭矩M=1000kgf.cm。悬臂伸出长度的允许取值范围为5cm≤l≤15cm, 直径的允许取值范围为2cm≤d≤10cm。试求在满足强度、 刚度条件下, 用料最省的设计方案。 (1).优化模型的建立 根据悬臂梁的工作要求, 优化模型建立如下: 设计变量: 目标函数: 约束条件: (2).运用优化工具箱求解 该优化模型是典型的非线性规划问题, 因此我们调用工具箱的fmincon函数求解。 l 目标函数文件myfun_test.m function [f] = myfun_test(x) f = 0.25*pi*x(1)^2*x(2); l 约束条件文件Confun_test.m function [c, ceq] = ConFun_test(x) ceq=[]; c(1) = -x(1)+2; c(2) = x(1)-10; c(3) = -x(2)+5; c(4) = x(2)-15; c(5) = -x(1)^3/x(2)+10; c(6) = -x(1)^3*+6.66; c(7) = -x(1)^4/x(2)^3+0.965; l 调用fmincon函数命令文件test_toolbox.m clc; % call optimization tool box options = optimset('GradObj', 'off','LargeScale','off','Display','iter'); x0 = [-0.2,-0.2]; [x,fval] = fmincon(@myfun_test,x0,[],[],[],[],[],[],@ConFun_test,options) l 运行结果 运行上面的命令文件, 可得到优化的计算结果: x = 3.6840 5.0000 fval = 53.2975 3.MATLAB分布式计算服务(MDCE)和并行计算工具箱(Parallel Computing Toolbox) 云计算( cloud computing) 是一种基于互联网的计算方式, 核心思想是将大量用网络连接的计算资源统一管理和调度, 构成一个计算资源池向用户按需服务。MDCE和并行计算工具箱是Mathworks公司的云计算解决方案, 经过它们我们能够充分利用联网计算机( 多处理器和多核) 的计算能力来解决复杂系统模型的计算问题。 图 1 基础结构图 如图1所示, 使用Parallel Computing Toolbox开发并行应用程序。利用该工具箱, 应用程序能够在包含多达八个本地worker( 左) 的桌面建立原型。而且, 经过MDCE( 右) , 能够扩展应用程序, 将其应用到一个集群上的多台计算机( 可理解为Mathworks的”云”) 。 3.1 几个重要的概念 (1).job: 是在MATLAB的会话中要执行的大量操作运算。一个job能够分解成不同的部分, 称为Task。 Client能够决定如何更好地将job划分为task, 各task能够相同也能够不同。 (2).client session: 制定job和task的MATLAB会话, 一般就是你用MATLAB编程的那台计算机。Client运用并行计算工具箱( Parallel Computing Toolbox) 来完成job和task的定义, MDCE负责执行job的task, 并将结果返回给client。 (3).job manager(JM): 是MDCE的一个组成部分, 用来协调各个job及其task在各个worker上的执行。JM能够运行在网络的任何一台计算机上, 它按job被提交的顺序来执行这些job。当然, job队列中每个job的优先级能够提升或降低, job也能够被取消和销毁。 (4).worker(集群时也称为lab): 是执行task的工作单元, 每个worker每次只能执行一个正在运行job的一个task, 执行完成后把结果返回给JM。在一个分布计算系统中一般包括多个worker, 以便同时执行多个Task, 以提高运算速度。对client来说, 具体哪一个task由哪一个worker执行是透明的。也就是说, 使用者只需关心如何将job提交到JM和从JM取回运算结果, 而无需管理具体的任务调度。 图2描述了四者之间的关系。 图2 Basic Parallel Computing Configuration 3.2 MDCE Service MATLAB Distributed Computing Engine/Server, 简称MDCE, 能够使并行计算工具箱应用程序得到扩展, 从而能够使用运行在任意数量计算机上任意数量的worker来完成计算任务。MDCE是以服务的形式运行在所有worker node节点上, 接受来自调度程序(JM)的job, 在节点上建立进程, 解释执行MATLAB代码, 将结果返回给调度程序。 MDCE的安装及相关操作如下: (1).安装MDCE服务。首先, 开始->运行->cmd到DOS命令行窗口, 假如MATLAB的安装地址为D:\MATLAB\R b, 进入D:\MATLAB\R b\toolbox\distcomp\bin目录。然后, 运行如下命令: D:\MATLAB\R b\toolbox\distcomp\bin>mdce install (2).启动MDCE服务。去控制台->管理工具->服务, 查看MATLAB Distributed Computing Server, 如果存在说明安装成功了。按启动按钮可启动该服务, 也可回到cmd窗口, 运行如下命令启动MDCE服务: D:\MATLAB\R b\toolbox\distcomp\bin\>mdce start (3).启动JM( job manager) 。在cmd中运行命令startjobmanager –name MyJM –clean启动名为MyJM的JM, 运行startjobmanager –help命令可查看该命令的详细使用方法。另外, 使用Configurations Manager可配置JM的属性, 下面以配置MyJM的属性为例说明如下: 在MATLAB的菜单栏上选择Parallel->Manage Configurations..., 启动Configurations Manager。设置Scheduler页面的内容: 设置Jobs页面的内容: 详细设置请参阅MATLAB帮助主题Programming with User Configurations。 (4).启动worker。在cmd中运行命令startworker –name worker1 –jobmanager MyJM –jobmanagerhost duanyang –clean启动名为worker1的worker, worker1注册到MyJM, 而且该JM运行在计算机duanyang上。即MyJM负责给worker1分配task。运行startworker –help命令可查看该命令的详细使用方法。 (5).查看节点状态。在cmd中运行命令nodestatus命令查看节点的状态。 3.3 MATLAB中并行程序开发 (一).分布式应用程序的工作流程 (1).寻找一个JM(或者作业调度程序(scheduler))——网络上可能有一个或多个JM( 可是一般只有一个scheduler) ; 用来寻找一个JM或者作业调度程序的函数findResource()在当前MATLAB内核中创立一个对象, 用来表示将要运行job的JM或者作业调度程序。 (2).创立一个job——创立job用以产生一个task集合, job存在于JM中, 而一个在本地MATLAB内核中的job对象代表相应的job。 (3).创立task——创立task添加到job中去, 能够用本地MATLAB内核中的task对象表示job中的每一个task。 (4).提交job到待执行的job队列——当job的每一个task都被定义之后, 将它提交到JM或者作业调度程序, 它们将task分配到worker中执行。当各worker的所有task执行完毕后, job将被标记为完成状态。 (5).返还job结果。 (6).销毁job——当所有job完成, 结果收集回来后, 需要销毁job以释放内存。 (二).应用实例 在本例中, 我们将运用MDCE和并行计算工具箱, 编写分布式应用程序调用牛顿法来求解无约束问题的最优解。本例的目标函数为: 是一个二维非线性规划问题, 有三个局部极值点。我们拟定义一个job, 该job包含三个task, 分别从不同的初始点出发, 调用多维牛顿法, 将三个局部极值点一次性求解出来, 从而实现并行计算。 1) 搜索JM, 创立对象: findResource() % MyJMcfg 表示在3.2定义的job manager: MyJM的配置 jm = findResource('scheduler','Configuration','MyJMcfg'); 使用findResource函数时, 省略所有property和value, 可搜索所有局域网内可用的JM。 all_managers = findResource('scheduler','type','jobmanager'); 2) 创立Job: createJob() 虽然这个函数在client会话中执行, 但实际上是在名叫jm的Job Manager上创立了一个名叫job1的Job。 job1 = createJob(jm); 3) 代码传递: set() 将求解需要的代码文件传给执行task的所有worker, 该过程对client是透明的。 set(job1,'FileDependencies',{'minNT.m','Funval.m'}); 4) 分配Task: createTask() 在创立Job之后, 使用createTask函数为该Job创立Task。Task定义了Worker所要执行的函数。在本例中, 每个Task将会从不同初始点出发, 调用牛顿法minNT求一个局部解。 createTask(job1, @minNT, 2, {fx,[1 1],[x1 x2],0.01,false}); createTask(job1, @minNT, 2, {fx,[1 1.8],[x1 x2],0.01,false}); createTask(job1, @minNT, 2, {fx,[-0.2 0.2],[x1 x2],0.01,false}); 也可用以下方法生成3个Task: createTask(job1, @minNT, 2, {{fx,[1 1],[x1 x2],0.01,false},{fx,[1 1.8],[x1 x2],0.01,false},{fx,[-0.2 0.2],[x1 x2],0.01,false}}); 4) 提交工作: submit() 使用submit函数提交Job到Job Manager, Job Manager将Task分配到已注册的Worker上并开始执行。 submit(job1); 5) 等待: waitForState() waitForState(job1, 'finished'); 6) 取回计算结果: getAllOutputArguments() 计算结果存储在每个任务对象的OutputArguments属性中, 使用getAllOutputArguments取回所有的结果, 运算结果以cell数组的形式返回。 results = getAllOutputArguments(job1); 完整示例代码如下: clc; jm = findResource('scheduler', 'Configuration', 'MyJMcfg'); job1 = createJob(jm); set(job1, 'FileDependencies', {'minNT.m','Funval.m'}); syms x1 x2; fx = x1^4 - 2*x1^2*x2 + x1^2 + 2*x2^2 - 2*x1*x2 + 4.5*x1 -4*x2 + 4; createTask(job1, @minNT, 2, {{fx,[1,1],[x1 x2],0.01,false},{fx,[1,1.8],[x1 x2],0.01,false},{fx,[-0.2,0.2],[x1 x2],0.01,false}}); submit(job1); waitForState(job1, 'finished'); results = getAllOutputArguments(job1); results{1:6} errmsgs = get(job1.Tasks, {'ErrorMessage'}); nonempty = ~cellfun(@isempty, errmsgs); celldisp(errmsgs(nonempty)); destroy(job1); 二、 实验一: MATLAB开发环境和优化工具箱综合实验 1.实验目的 上机操作熟悉MATLAB开发环境, 运用编程语言和优化工具箱求解机械优化设计实例。 2.实验要求 (1).实验任务 l 熟悉MATLAB的交互式开发平台 l 掌握MATLAB编程语言的基础知识 l 运用优化工具箱解决实际优化问题 (2).实验预习 预习本实验指导书, 并进一步收集更多的相关资料, 深入理解实验的目的与任务, 熟悉实验步骤和基本环节。 (3).实验报告 编写程序, 调用优化工具箱相关函数, 求解教材8.3节”二级斜齿轮减速器优化设计”所建立的优化模型。 3.实验步骤 (1).通用操作界面 l Command Window窗口操作 Command Window是MATLAB执行交互式操作的主窗口, 能够进行指令的执行和函数的调用。 例1.求[12+2 ×(7 −4)] ÷32的算术运算结果。 用键盘在Command Window中输入以下内容 >> (12+2*(7-4))/3^2 在上述表示式输入完成后, 按【Enter】键, 该就指令被执行。 在指令执行后, Command Window中将显示以下结果。 ans = 2 例2.简单矩阵的输入步骤。 在键盘上输入下列内容 >>A = [1,2,3; 4,5,6; 7,8,9] 按【Enter】键, 指令被执行。 在指令执行后, Command Window中将显示以下结果: A = 1 2 3 4 5 6 7 8 9 MATLAB数学计算功能强大, 内置提供了丰富的数学运算函数, 现将在优化设计算法中要用到的函数列表简介如下, 大家可在Command Window中具体测试一下。 常见基本数学函数 abs(x) 纯量的绝对值或向量的长度 sqrt(x) 开平方 Round(x) 四舍五入至最近整数 fix(x) 无论正负, 舍去小数至最近整数 floor(x) 地板函数, 即舍去正小数至最近整数 ceil(x) 天花板函数, 即加入正小数至最近整数 sign(x) 符号函数 (Signum function) rem(x,y) 求x除以y的馀数 gcd(x,y) 整数x和y的最大公因数 lcm(x,y) 整数x和y的最小公倍数 exp(x) 自然指数 pow2(x) 2的指数 log(x) 以e为底的对数, 即自然对数 log2(x) 以2为底的对数 log10(x) 以10为底的对数 常见的三角函数 asin(x) 反正弦函数 acos(x) 反余弦函数 atan(x) 反正切函数 sin(x) 正弦函数 cos(x) 余弦函数 tan(x) 正切函数 适用于向量的常见函数 min(x) 向量x的元素的最小值 max(x) 向量x的元素的最大值 mean(x) 向量x的元素的平均值 median(x) 向量x的元素的中位数 std(x) 向量x的元素的标准差 diff(x) 向量x的相邻元素的差 length(x) 向量x的元素个数 norm(x) 向量x的欧氏( Euclidean) 长度 sum(x) 向量x的元素总和 cumsum(x) 向量x的累计元素总和 cumprod(x) 向量x的累计元素总乘积 dot(x, y) 向量x和y的内积 cross(x, y) 向量x和y的外积 常见矩阵计算函数 B=A' 矩阵转置 C=A+B 矩阵相加 C=A*B 矩阵相乘 C=A^k 矩阵的幂 C=A.*B 矩阵点乘, 即两维数相同的矩阵各对应元素相乘 expm(A) 指数矩阵, 也就是eA inv(A) 矩阵的逆矩阵 rank(A) 计算矩阵的秩 eig(A) 矩阵的特征值 常见到的永久常数 Eps 系统的浮点( Floating-point) 精确度 Inf 无限大 nan或NaN 非数值( Not a number) Pi 圆周率 p( = 3.1415926...) Realmax 系统所能表示的最大数值 Realmin 系统所能表示的最小数值 Nargin 函数的输入参数个数 Nargout 函数的输出参数个数 上面列表仅介绍了这些函数的基本功能, 详细用法可参阅MATLAB系统帮助文件。 l Command History窗口 该窗口保存Command Window中运行命令的历史记录, 双击某条记录可再次运行该命令。 l Current Folder窗口和路径设置器 MATLAB使用Current Folder和路径设置器来管理文件的操作, 任何能够在Command Window中直接运行或在程序中被调用的文件必须存放在Current Folder或路径设置器所管理的目录内。选择File>Set Path菜单可打开路径设置管理器窗口。 l Workspace Browser窗口 该窗口显示在MATLAB会话期间产生的保存在内存中的变量, 在调用函数、 执行M文件时都会向Workspace添加新的变量。执行clear命令清除所有变量以释放内存。 (2).在编程环境测试函数的调用和M文件的执行 提供若干求解一维、 多维、 无约束和约束优化问题的算法函数, 编制M文件调用这些函数, 加深对各种算法的理解。在此基础之上, 编程实现一种新的优化算法, 如Powell法求解无约束优化问题。 (3).优化工具箱调用实验 学习本指导书2.1节所列出的优化工具箱所包含的主要函数的使用方法, 编程调用相应函数求解教材8.3节”二级斜齿轮减速器优化设计”所建立的优化模型。 三、 实验二: 运用并行计算工具求解机械优化设计实例 1.实验目的 经过学习MATLAB并行计算的基本原理, 初步掌握MATLAB实现并行计算采用的主要方法, 并运用并行计算工具箱求解机械优化设计实例。 2.实验要求 (1).实验任务 l 学习MATLAB并行计算的基本原理, 掌握MATLAB实现并行计算采用的主要方法。 l 寻找机械优化设计算法中可采用MATLAB并行计算的环节, 从而加快算法执行的效率。 (2).实验预习 预习本实验指导书, 并进一步收集更多的相关资料, 深入理解实验的目的与任务, 熟悉实验步骤和基本环节。 (3).实验报告 编写程序, 利用并行计算工具箱, 求解教材8.3节”二级斜齿轮减速器优化设计”所建立的优化模型。 3.实验步骤 (1).交互式并行计算操作(pmode) pmode允许我们以交互的方式同时在多个lab上运行一个并行任务, 我们在Parallel Command Window中输入的命令会同时在所有lab上执行。 在Command Window中输入如下命令 >>pmode start local 4 按【Enter】键, 指令被执行, 开启4个本地lab, 创立一个并行job运行在这4个lab上, 而且打开Parallel Command Window。 实验一在Command Window中运行的各种命令, 能够同样在该窗口中运行, 请注意两者之间的差异。更详细的操作请参考MATLAB帮助主题Parallel Computing Toolbox>Interactive Parallel Computation with pmode。注意, local lab的数量不能超过cpu的核数。另外, pmode也可扩展到集群。例如, 执行命令 >>pmode start MyJMcfg 4 (2).MDCE服务安装 按照3.2节的步骤安装MDCE服务, 建立计算集群。 (3).代码级编程调用并行计算工具箱 按照3.3节的流程, 综合运用并行计算工具箱和优化工具箱编程求解教材8.3节建立的优化模型。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服