(文章复现)分布式电源选址定容的多目标优化算法

news2024/11/26 3:38:58

参考文献:

[1]夏澍,周明,李庚银.分布式电源选址定容的多目标优化算法[J].电网技术,2011,35(09):115-121.

[2] Ye Tian, Ran Cheng, Xingyi Zhang, and Yaochu Jin, “PlatEMO: A MATLAB platform for evolutionary multi-objective optimization [educational forum],” IEEE Computational Intelligence Magazine, 2017, 12(4): 73-87.

[3] Ye Tian, Weijian Zhu, Xingyi Zhang, and Yaochu Jin, “A practical tutorial on solving optimization problems via PlatEMO,” Neurocomputing, 2023, 518: 190-205.

        结合实际的算例,分析PlatMEO工具箱求解电力系统多目标优化领域的方法。

1.基本原理

        在综合考虑网损、电压质量和电流质量 3 个指标的基础上,建立了分布式电源选址定容的多目标决策模型,并提出了一种改进多目标微分进化算法(improved differential evolution for multiobjective optimization,IDEMO)。该算法引入混沌搜索策略以提高初始种群利用率,采用控制参数调整策略以克服算法对控制参数依赖性强的缺点,利用动态拥挤距离排序策略使得帕累托解集分布更加均匀,从而为最终决策提供了优良的候选方案。以上述算法求得的帕累托最优解集为决策矩阵,使用基于熵的序数偏好方法对最优解集进行排序,得到最终决策方案。在 IEEE-33 节点系统上对所提方法进行了测试,并从外部解、C 指标和 S 指标 3 方面与其他 3 种多目标优化算法进行了比较,验证了所提算法具有良好的搜索性能。最后评价了所选方案的有效性。

1.1 目标函数

        本文评估 DG 效益的指标选用系统网损指标、节点电压指标和线路电流指标。

1)系统网损指标。

        DG 接入电网能够带来一个明显的节能效益就是降低网损,提高能源利用率,文献[4]提出了系统网损评价指标,其定义如下:

2)节点电压指标。

        DG 能够改善电压分布情况,使电压偏移维持在较小范围内。文献[12]提出了一个电压偏移指标,即计算首节点电压与电网其他节点电压偏差的平均值,具体计算公式如下:

3)线路电流指标。

        DG 接入电网可能会减少部分线路电流,但也可能会增加线路电流,因此需要对线路电流水平进行评价。一般采用的指标是线路热稳定裕度,即系统所有线路中最大载流量,其定义如下:

        式中 x 为优化方案。模型(6)即为寻求使得3个目标最优的方案。由于各个目标之间存在冲突,无法保证所有目标值同时达到最小,因此只能得到一组帕累托最优解集(Pareto solution set),其特点为至少存在一个目标优于其他所有解。

1.2 约束条件

        DG 选址定容问题的约束包括投资约束和系统运行约束,分别为:

2. MOCDE算法与PlatEMO工具箱 

        platEMO是安徽大学生物智能与知识发现(BIMK)研究所编写的一款基于MATLAB的多目标优化工具,为新入门的同学或者开发者提供了很大的便利,其今年已经发布到PlatEMO 2.0版本了。这款工具主要具有以下的几个特点:

        1.完全由MATLAB开发,不需要任何其它库。

        2.包括现有的90个流行的多目标优化算法,包括遗传算法、差分进化、粒子群优化、模因算法、分布估计算法和基于代理模型的算法。其中大多数是2010年以后在顶级期刊上发表的代表性算法。

        3.用户可以显示各种图形,包括结果的pareto front,真实的pareto front等等。

        4.强大友好的GUI,可以不用编辑任何代码。

        5.可以直接生成Excel或者LaTex。

        如果要用到GUI界面,PlatEMO工具箱要求MATLAB版本在 R2020b 或以上及安装了并行计算工具箱和统计与机器学习工具箱。

        如果不需要使用GUI界面,只需要MATLAB R2018a或以上的版本即可使用。

        下面对该工具箱的通过代码调用的方式进行简单介绍,并分析如何借助该工具箱求解优化问题。

2.1. 求解测试问题

        用户可以以如下形式带参数调用主函数 platemo()来求解测试问题:

platemo('Name1',Value1,'Name2',Value2,'Name3',Value3,…);

        其中所有可接受的参数列举如下:

        'algorithm'表示待运行的算法,它的值可以是一个算法类的句柄,例如@GA。它的值还可以是形如{@GA,p1,p2,…}的单元数组,其中 p1,p2,… 指定了该算法中的参数值。例如以下代码用算法@GA 求解默认问题,并设置了该算法中的参数值:

platemo('algorithm',{@GA,1,30,1,30});

        'problem'表示待求解的测试问题,它的值可以是一个问题类的句柄,例如@SOP_F1。它的值还可以是形如{@SOP_F1,p1,p2,…}的单元数组,其中 p1,p2,… 指定了该问题中的参数值。例如以下代码用默认算法求解问题@WFG1,并设置了该问题中的参数值:

platemo('problem',{@WFG1,20});

        'N'表示算法使用的种群的大小,它通常等于最终输出的解的个数。例如以下代码用算法@GA 求解问题@SOP_F1,并设置种群大小为 50:

platemo('algorithm',@GA,'problem',@SOP_F1,'N',50);

        'M'表示问题的目标个数,它仅对一些多目标测试问题生效。例如以下代码用算法@NSGAII 求解具有 5 个目标的@DTLZ2 问题:

platemo('algorithm',@NSGAII,'problem',@DTLZ2,'M',5);

        'D'表示问题的变量个数,它仅对一些测试问题生效。例如以下代码用算法@GA 求解具有 100 个变量的@SOP_F1 问题:

platemo('algorithm',@GA,'problem',@SOP_F1,'D',100);

        'maxFE'表示算法可用的最大评价次数,它通常等于种群大小乘以迭代次数。例如以下代码设置算法@GA 的最大评价次数为 20000:

platemo('algorithm',@GA,'problem',@SOP_F1,'maxFE',20000);

         'maxRuntime'表示算法可用的最大运行时间,单位为秒。当 maxRuntime等于默认值 inf 时,算法将在 maxFE 次评价次数后停止;否则,算法将在maxRuntime 秒后停止。例如以下代码设置算法@GA 的最大运行时间为 10 秒:

platemo('algorithm',@GA,'problem',@SOP_F1,'maxRuntime',10);

         'save'表示保存的种群数,该值大于零时优化结果将被保存在文件中,该值小于零时优化结果将被显示在窗口中(参阅获取运行结果章节)。

        · 'outputFcn'表示算法每代开始前调用的函数。该函数必须有两个输入和零个输出,其中第一个输入是当前的 ALGORITHM 对象、第二个输入是当前的 PROBLEM 对象。默认的'outputFcn'会根据'save'的值来保存或显示优化结果。

        注意以上每个参数均有一个默认值,用户可以在调用时省略任意参数。

2.2 求解自定义问题

        当不指定参数'problem'时,用户可以通过指定以下参数来自定义问题:

        'objFcn'表示问题的目标函数,它的值可以是一个函数句柄(单目标)、矩阵(自动拟合出函数)或一个单元数组(多目标)。每个目标函数必须有一个输入和一个输出,其中输入是一个决策向量、输出是目标值。所有目标函数均被最小化。例如以下代码利用默认算法求解一个含有六个实数变量的双目标优化问题:

f1 = @(x)x(1)+sum(x(2:end)); 
f2 = @(x)sqrt(1-x(1)^2)+sum(x(2:end)); 
platemo('objFcn',{f1,f2},'D',6); 

        若一个目标函数是矩阵,则高斯过程回归会利用该矩阵自动拟合出一个函数,其中矩阵的每行表示一个样本、每列表示一个变量(除最后一列)或函数值(最后一列)。例如以下代码求解相同的问题,但目标函数是根据矩阵自动拟合出来的:

x = rand(50,6); 
y1 = x(:,1)+sum(x(:,2:end),2); 
y2 = sqrt(1-x(:,1).^2)+sum(x(:,2:end),2); 
platemo('objFcn',{[x,y1],[x,y2]},'D',6); 

        'encoding'表示每个变量的编码方式,它的值可以是一个标量或行向量,且每维的值可以为 1(实数)、2(整数)、3(标签)、4(二进制数)或 5(序列编号)。算法针对不同的编码方式可能使用不同的算子来产生解。例如以下代码指定三个实数变量、两个整数变量以及一个二进制变量:

f1 = @(x)x(1)+sum(x(2:end)); 
f2 = @(x)sqrt(1-x(1)^2)+sum(x(2:end)); 
platemo('objFcn',{f1,f2},'encoding',[1,1,1,2,2,4]); 

        问题的变量数将根据'encoding'的长度自动确定。

        'lower''upper'分别表示每个变量的下界和上界,它们的值可以是标量或行向量,且每维的值必须为实数。'lower''upper'的长度必须与'encoding'相同。例如以下代码指定搜索空间为 [0,1] × [0,9] 5:

f1 = @(x)x(1)+sum(x(2:end));
f2 = @(x)sqrt(1-x(1)^2)+sum(x(2:end));
platemo('objFcn',{f1,f2},'encoding',[1,1,1,2,2,4],...
'lower',0,'upper',[1,9,9,9,9,9]);

        'conFcn'表示问题的约束函数,它的值可以是一个函数句柄(单约束)、矩阵(自动拟合出函数)或一个单元数组(多约束)。每个约束函数必须有一个输入和一个输出,其中输入是一个决策向量、输出是约束违反值。当且仅当约束违反值小于等于零时,该约束被满足。例如以下代码利用默认算法求解一个双目标优化问题,

f1 = @(x)x(1)+sum(x(2:end));
f2 = @(x)sqrt(1-x(1)^2)+sum(x(2:end));
g1 = @(x)1-sum(x(2:end));
platemo('objFcn',{f1,f2},'encoding',[1,1,1,2,2,4],...
'conFcn',g1,'lower',0,'upper',[1,9,9,9,9,9]);

        注意,等式约束必须转换为不等式约束来处理,详细方法可参阅参考文献[3]的 3.2 节。若一个约束函数是矩阵,则高斯过程回归会利用该矩阵自动拟合出一个函数,其中矩阵的每行表示一个样本、每列表示一个变量(除最后一列)或函数值(最后一列)。例如以下代码求解相同的问题,但约束函数是根据矩阵自动拟合出来的:

f1 = @(x)x(1)+sum(x(2:end));
f2 = @(x)sqrt(1-x(1)^2)+sum(x(2:end));
x = rand(50,6);
y = 1-sum(x(:,2:end),2);
platemo('objFcn',{f1,f2},'encoding',[1,1,1,2,2,4],...
'conFcn',[x,y],'lower',0,'upper',[1,9,9,9,9,9]);

        'decFcn'表示问题的无效解修复函数,它的值必须是一个函数句柄。该函数必须有一个输入和一个输出,其中输入是一个决策向量、输出是修复后的决策向量。例如以下代码限制 x1 为 0.1 的倍数:

f1 = @(x)x(1)+sum(x(2:end));
f2 = @(x)sqrt(1-x(1)^2)+sum(x(2:end));
g1 = @(x)1-sum(x(2:end));
h = @(x)[round(x(1)/0.1)*0.1,x(2:end)];
platemo('objFcn',{f1,f2},'encoding',[1,1,1,2,2,4],...
'conFcn',g1,'decFcn',h,'lower',0,'upper',[1,9,9,9,9,9]);

        'evalFcn'表示解的评价函数,它的值必须是一个函数句柄。该函数必须有一个输入和三个输出,其中输入是一个决策向量、第一个输出是修复后的决策向量、第二个输出是目标值向量、第三个输出是约束违反值向量。默认的'evalFcn'通过依次调用'decFcn''objFcn''conFcn'来评价解,而以下代码定义了一个新的'evalFcn'来同时进行解的修复、目标计算和约束计算:

function [x,f,g] = Eval(x)
x = [round(x(1)/0.1)*0.1,x(2:end)];
x = max(0,min([1,9,9,9,9,9],x));
f(1) = x(1)+sum(x(2:end));
f(2) = sqrt(1-x(1)^2)+sum(x(2:end));
g = 1-sum(x(2:end));
end

        接着,以下代码通过仅指定评价函数定义了相同的问题:

platemo('evalFcn',@Eval,'encoding',[1,1,1,2,2,4],...
'lower',0,'upper',[1,9,9,9,9,9]);

        'initFcn'表示种群初始化函数,它的值必须是一个函数句柄。该函数必须有一个输入和一个输出,其中输入是种群大小、输出是种群的决策向量构成的矩阵。默认的'initFcn'在整个搜索空间内随机产生初始解,而以下代码定义了一个新的'initFcn'以加速收敛:

q = @(N)rand(N,6);
platemo('evalFcn',@Eval,'encoding',[1,1,1,2,2,4],...
'initFcn',q,'lower',0,'upper',[1,9,9,9,9,9]);

        'objGradFcn''conGradFcn'分别表示目标函数和约束函数的梯度函数,它们的值可以是函数句柄或单元数组。每个梯度函数必须有一个输入和一个输出,其中输入是一个决策向量、输出是梯度。默认的梯度函数通过有限差分来估计梯度,而以下代码定义了一个新的'objGradFcn'以加速收敛并保证种群的多样性:

fg = @(x)[0,x(2:end)];
platemo('evalFcn',@Eval,'encoding',[1,1,1,2,2,4],...
'objGradFcn',fg,'lower',0,'upper',[1,9,9,9,9,9]);

        注意仅有少量算法会使用梯度信息。

         'data'表示问题的数据,它可以是任意类型的常量。当指定'data'后,以上所有函数必须增加一个输入参数来接收'data'。例如以下代码求解一个旋转的单目标优化问题:

d = rand(RandStream('mlfg6331_64','Seed',28),10)*2-1;
[d,~] = qr(d);
f1 = @(x,d)sum((x*d-0.5).^2);
platemo('objFcn',f1,'encoding',ones(1,10),'data',d);

        除以上定义问题的方式之外,用户还能创建一个自定义问题对象并创建算法对象予以求解。例如以下代码利用算法@GA 和算法@DE 求解相同的问题:

d = rand(RandStream('mlfg6331_64','Seed',28),10)*2-1; 
[d,~] = qr(d); 
f1 = @(x,d)sum((x*d-0.5).^2); 
PRO = UserProblem('objFcn',f1,'encoding',ones(1,10),'data',d); 
ALG1 = GA(); 
ALG2 = DE(); 
ALG1.Solve(PRO); 
ALG2.Solve(PRO); 

2.3 输出参数

        算法运行结束后得到的种群可以被显示在窗口中、保存在文件中或作为函数返回值。若按以下方式调用主函数:

[Dec,Obj,Con] = platemo(…);

        则最终种群会被返回,其中 Dec 表示种群的决策向量构成的矩阵、Obj 表示种群的目标值构成的矩阵、Con 表示种群的约束违反值构成的矩阵。若按以下方式调用主函数:

platemo('save',Value,…);

        则当 Value 的值为负整数时(默认情况),得到的种群会被显示在窗口中,用户可以在窗口中的 Data source 菜单选择要显示的内容。当 Value 的值为正整数 时 ,得到的种群会被保存在名为PlatEMO\Data\alg\alg_pro_M_D_run.mat 的 MAT 文件中,其中 alg 表示算法名、pro 表示问题名、M 表示目标数、D 表示变量数、run 是一个自动确定的正整数以保证不和已有文件重名。每个文件存储一个单元数组 result 和一个结构体 metric,其中 result 保存得到的种群、metric 保存指标值。算法的整个优化过程被等分为 Value 块,其中 result 的第一列存储每块最后一代时所消耗的评价次数、result 的第二列存储每块最后一代时的种群、metric 存储所有种群的指标值。

        以上操作均由默认的输出函数@DefaultOutput 实现,用户可以通过指定'outputFcn'的值为其它函数来实现自定义的结果展示或保存方式。

2.4 编程实例

        使用PlatEMO工具箱调用MODE算法求解上述优化问题的代码为:

f1 = @(x)(x(1)^4 - 10*x(1)^2 + x(1)*x(2) + x(2)^4 - (x(1)*x(2))^2);
f2 = @(x)(x(2)^4 - (x(1)*x(2))^2 + x(1)^4 + x(1)*x(2));
platemo( 'objFcn',{f1,f2},'D',2 , 'lower' , -5 , 'upper' , 5);

        运行结果如下:

3.编程思路分析

3.1相关参数和决策变量定义

1 相关参数的定义

2 决策变量的定义

3.2编程思路

        根据对文献内容的解读,可以设计下面的编程思路:

步骤1:输入所需数据

        这一步比较简单。算例分析用到的部分数据可以从原文中找到,其他数据可以自己假设一下。然后将所有需要的数据,按照表1的定义格式输入即可。

步骤2决策变量的设定

        如表2所示,原文中共包含2个决策变量,均为1×D的变量,且在算例分析部分提到了最大DG安装节点数D为2个,因此可知文中涉及的优化问题维度为4,具体变量设置如下:

其中,优化变量x的1-2位为整数变量,3-4位为连续变量

步骤3:决策变量的上下界设定

        按照步骤2中设定的决策变量,给定各个决策变量的上界UB和下界LB,如下所示:

步骤4:设定约束条件

        文中所提约束条件为7-11,共五条约束,其中约束7可以用决策变量的上下限约束表示,功率平衡约束在潮流计算时即可考虑到,因此还需要对约束条件8,10和11进行设定,需要按照PlatEMO工具箱的要求改写成≤0的形式。

步骤5:设定修复函数

        当生成的解不满足约束条件8时,还可以对该组解进行修复,令V2 = PDGmax - V1即可。

步骤6:设定目标函数

        文中所提优化问题中包含3个目标函数,均为min形式,需按照工具箱要求的格式进行设定。

步骤7:调用platemo工具箱求解

        设定好算法的决策变量维度、种群规模,最大迭代次数等其他参数,然后调用platemo函数求解上述优化问题。

步骤8输出运行结果

        参考文中的图表的格式,输出结果即可。

4.Matlab代码

%% 分布式电源选址定容的多目标优化算法复现代码

%% 添加路径
addpath(genpath('参数,目标函数和约束条件'))

%% 清空内存
clc
clear
close all

%% 参数设置
parameter;

%% 目标函数
f1 = @objfun1;
f2 = @objfun2;
f3 = @objfun3;

%% 优化变量上下限约束
UB = [33 , 33 , 2 , 2];
LB = [2 , 2 , 0 , 0];

%% 约束条件
g1 = @conFcn1;
g2 = @conFcn2;
g3 = @conFcn3;

%% 无效解的修复函数
h = @decFcn;

%% 求解优化问题
[Dec,Obj,Con] = platemo('algorithm',@MOEADDE, 'objFcn',{f1,f2,f3},'encoding', [2,2,1,1], 'lower' , LB , 'upper' , UB , 'conFcn', {g1,g2,g3} , 'decFcn' , h);
Dec(:,1:2) = round(Dec(:,1:2));

%% 展示运行结果
show_result;

        以上仅为主函数部分的代码,完整论文复现的matlab代码可以从这个链接获取:

        注意,运行程序需要matpower工具箱和platemo工具箱的支持,需要提前安装。

        Matpower工具箱下载地址:

MATPOWER – Free, open-source tools for electric power system simulation and optimization

        Platemo工具箱下载地址

BIMK/PlatEMO: Evolutionary multi-objective optimization platform (github.com)

5.运行结果分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1600178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像处理与视觉感知---期末复习重点(8)

文章目录 一、图像分类流程二、梯度方向直方图2.1 概述2.2 计算梯度方向直方图2.2.1 过程2.2.2 总结 三、SIFT 一、图像分类流程 流程:输入图像、预处理、特征提取、学习算法、类标。 二、梯度方向直方图 2.1 概述 1. 梯度方向直方图(Histogram of Oriented Gradie…

【1688电商运营必看】掌握这些关键数据指标,轻松提升业绩!

1688电商运营,数据分析环节中需要关注多个关键指标,以便全面、深入地了解店铺或产品的运营状况。以下是一些主要的指标: 1、流量指标 访客数:反映店铺的吸引力和流量规模。 浏览量:显示页面的受欢迎程度&#xff0c…

【AI开发:语言】二、Qwen1.5-7B模型本地部署CPU和GPU版

前言 之前文章,我们采用了Koblod运行Yi-34B大模型,本文采用LM Studio来运行千问模型。 LM Studio并没有开源,但是可以免费使用,他是目前本地进行模型测试最好的工具了。 在这里,依然使用Windows 10进行部署和测试&…

GPT-3:NLP领域的革新者

在自然语言处理(NLP)领域,预训练模型一直是研究的热点。随着技术的不断进步,我们见证了从BERT到GPT等一系列模型的涌现。其中,GPT-3(Generative Pre-trained Transformer 3)以其卓越的生成能力和…

抗干扰1路|1通道触摸单按键触摸触控ICVK3601 SOT23-6适用于玩具,风扇,台灯等触摸IC

产品品牌:永嘉微电/VINKA 产品型号:VK3601 封装形式:SOT23-6 概述 VK3601具有1个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较 高的集成度,仅需极少的外部组件便可实现触摸按键的检测。 提供了1路…

力扣周赛392复盘

3105. 最长的严格递增或递减子数组 题目 给你一个整数数组 nums 。 返回数组 nums 中 严格递增 或 严格递减 的最长非空子数组的长度。 思考: 返回什么:返回最长非空子数组的长度。return max(decs_len,incs_len); 但实际上我们只需要用一个变量ans就…

【优质书籍推荐】AI赋能100%提高项目管理效率

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

Vision GNN: An Image is Worth Graph of Nodes

感受野:在卷积神经网络中,感受野(Receptive Field)是指特征图上的某个点能看到的输入图像的区域,即特征图上的点是由输入图像中感受野大小区域的计算得到的。 感受野并非越大越好,反而可能因为过大而过于发散梯度下降(Gradient Descent GD&am…

在linux系统中启动pycharm

1.找到pycharm的安装路径,一般在下载文件夹中 2.进入pycharm的安装路径,进入bin目录 3.右击,打开终端,输入./pycharm.sh

民航电子数据库:[E14024]事务内变更操作次数超过最大许可值10000,可通过系统参数max_trans_modify适当调整限制

目录 一、场景二、异常情况三、原因四、排查五、解决 一、场景 1、对接民航电子数据 2、执行delete语句时报错 二、异常情况 三、原因 通过报错信息就可以看出,是系统参数max_trans_modify配置导致 当删除的数据量 > max_trans_modify时,删除就会…

【LeetCode每日一题】924. 尽量减少恶意软件的传播(并查集)

文章目录 [924. 尽量减少恶意软件的传播](https://leetcode.cn/problems/minimize-malware-spread/)思路:并查集代码: 924. 尽量减少恶意软件的传播 思路:并查集 构建并查集:首先,代码创建了一个 UnionFind 类来维护节…

AIGC教育行业全景报告:AI助教和家教成真,学习机迎来新机遇

原文:AIGC教育行业全景报告:AI助教和家教成真,学习机迎来新机遇 - AI新智界 图片来源:由无界AI生成 经过一年的快速迭代,业内对于生成式AI将会率先落地于哪些行业已经有了答案。 教育领域,不仅被OpenAI列…

leetcode1448.统计二叉树中的好节点数目

1. 题目描述 题目链接 2. 解题思路 首先看一下题目的“核心”,什么是好节点:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。也就是说,我们只要知道了从根节点到该节点的所有的值,就可以判断该节点是…

【代理模式】静态代理-简单例子

在Java中,静态代理是一种设计模式,它涉及到为一个对象提供一个代理以控制对这个对象的访问。静态代理在编译时就已经确定,代理类和被代理类会实现相同的接口或者是代理类继承被代理类。客户端通过代理类来访问(调用)被…

iOS依赖库版本一致性检测:确保应用兼容性

一、背景 在 iOS 应用开发的世界里,每次 Xcode 更新都带来了新的特性和挑战。最近的 Xcode 15 更新不例外,这次升级引入了对 SwiftUI 的自动强依赖。SwiftUI最低是从 iOS 13 开始支持。 这一变化也带来了潜在的兼容性问题。如果您的项目在升级到 Xcode…

《大话数据结构》02 算法

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 1. 两种算法的比较 大家都已经学过一门计算机语言,不管学的是哪一种,学得好不好,好歹是可以写点小程序了。现在…

为什么你不用懒人建站工具?套用这四个wordpress主题模板,1小时轻松搭建网站

懒人建站工具,凭借简单易用、快速上手和个性化定制的特点,为不熟悉代码和程序的人提供了搭建美观实用网站的便捷途径。无需专业的前端开发知识,无需雇佣专业开发人员,用户便能轻松实现网站搭建,满足个人或企业需求。懒…

【可实战】测试体系与测试方案设计(业务按公司实际情况,技术可参考通用测试方案)

一、如果我们要测试一个系统,首先我们要了解被测系统的架构 (一)业务架构-从需求里面去了解(角色和行为): 业务模型分析(是一个电商,还是一个企业的crm,还是一个网站&a…

高等数学——一文搞定二重积分

文章目录 二重积分的基本概念二重积分的性质累次积分计算二重积分的方法和技巧描点画图法对称性利用函数的奇偶性变量的轮换对称性 积分次序的选择积分区域的确认先看变量和先积变量基本原则穿线法确定先积变量的曲线范围 常见的曲线经典题目 二重积分的基本概念 定义&#xf…

ChatGPT 可以预测未来吗?

推荐 4月13日的一篇有趣的 paper,特来分享。 👉 当前的大型语言模型(LLMs)具有强大的数据合成和推理能力,但它们在直接预测尚未发生事件的准确性上常常受到限制。传统的预测方法依赖于直接询问模型关于未来的问题。 …