当前位置: 首页 > news >正文

思维进化算法(MEA)优化BP神经网络

        随着计算机科学的发展,人们借助适者生存这一进化规则,将计算机科学和生物进化结合起来,逐渐发展形成一类启发式随机搜索算法,这类算法被称为进化算法(Evolutionary Com-putation, EC)。最著名的进化算法有:遗传算法、进化策略、进化规划。与传统算法相比,进化算法的特点是群体搜索。进化算法已经被成功地应用于解决复杂的组合优化问题、图像处理,人工智能、机器学习等领域。但是进化算法存在的问题和缺陷也不能忽视,如早熟、收敛速度慢等。
        针对EC存在的问题,孙承意等人于1998年提出了思维进化算法(Mind Evolutionary Al-gorithm,MEA)。本章将详细介绍思维进化算法的基本思想,并结合非线性函数拟合实例,在MATLAB环境下实现思维进化算法。

1 案例背景

1.1思维进化算法概述

        思维进化算法沿袭了遗传算法的一些基本概念,如“群体”、“个体”、“环境”等,其主要系统框架如图31- 1所示。

        与遗传算法不同,思维进化算法的一些新的概念解释如下:

        1)群体和子群体
        MEA是一种通过迭代进行优化的学习方法,进化过程的每一代中的所有个体的集合成为一个群体。一个群体分为若干个子群体。子群体包括两类:优胜子群体(superior group)和临时子群体temporary group)。优胜子群体记录全局竞争中的优胜者的信息,临时子群体记录全局竞争的过程。
        2)公告板
        公告板相当于一个信息平台,为个体之间和子群体之间的信息交流提供了机会。公告板记录三个有效的信息:个体或子群体的序号、动作(action)和得分(score)。利用个体或子群体的序号,可以方便地区分不同个体或子群体;动作的描述根据研究领域不同而不同,例如本文是研究利用思维进化如何优化参数的问题,那么动作记录的就是个体和子群体的具体位置;得分是环境对个体动作的评价,在利用思维进化算法优化过程中,只有时刻记录每个个体和子群体的得分,才能快速地找到优化的个体和子群体。子群体内的个体在局部公告板(local bill-board)张贴各自的信息,全局公告板(global billboard)用于张贴各子群体的信息。
        3)趋同
        趋同(similartaxis)是 MEA中的两个重要概念之一,下面给出它的定义。

        定义1:在子群体范围内,个体为成为胜者而竞争的过程叫做趋同。
        定义2:一个子群体在趋同过程中,若不再产生新的胜者,则称该子群体已经成熟。当子群体成熟时,该子群体的趋同过程结束。子群体从诞生到成熟的期间叫做生命期。
        4)异化
        MEA 中的另一个重要概念是异化(dissimilation),它的定义是:
        定义3:在整个解空间中,各子群体为成为胜者而竞争,不断地探测解空间中新的点,这个过程叫做异化。
        异化有两个含义:
        ①各子群体进行全局竞争,若一个临时子群体的得分高于某个成熟的优胜子群体的得分,则该优胜子群体被获胜的临时子群体替代,原优胜子群体中的个体被释放;若一个成熟的临时子群体的得分低于任意一个优胜子群体的得分,则该临时子群体被废弃,其中的个体被释放。
        ②被释放的个体在全局范围内重新进行搜索并形成新的临时群体。

1.2 思维进化算法基本思路

        MEA 的基本思路是:
        ①在解空间内随机生成一定规模的个体,根据得分(对应于遗传算法中的适应度函数值,表征个体对环境的适应能力)搜索出得分最高的若干个优胜个体和临时个体。
        ②分别以这些优胜个体和临时个体为中心,在每个个体的周围产生一些新的个体,从而得到若干个优胜子群体和临时子群体。
        ③在各个子群体内部执行趋同操作,直至该子群体成熟,并以该子群体中最优个体(即中心)的得分作为该子群体的得分。
        ④子群体成熟后,将各个子群体的得分在全局公告板上张贴,子群体之间执行异化操作,完成优胜子群体与临时子群体间的替换、废弃、子群体中个体释放的过程,从而计算全局最优个体及其得分。
        值得一提的是,异化操作完成后,需要在解空间内产生新的临时子群体,以保证临时子群体的个数保持不变。

1.3思维进化算法特点

        与遗传算法相比,思维进化算法具有许多自身的特点:
        ①把群体划分为优胜子群体和临时子群体,在此基础上定义的趋同和异化操作分别进行探测和开发,这两种功能相互协调且保持一定的独立性,便于分别提高效率,任一方面的改进都对提高算法的整体搜索效率有利。
        ②MEA可以记忆不止一代的进化信息,这些信息可以指导趋同与异化向着有利的方向进行。
        ③结构上固有的并行性。
        ④遗传算法中的交叉与变异算子均具有双重性,即可能产生好的基因,也可能破坏原有的基因,而MEA中的趋同和异化操作可以避免这个问题。

1.4 问题描述

        利用BP神经网络建立非线性函数的回归模型。在训练BP神经网络前,利用思维进化算法对BP神经网络的初始权值和阈值进行优化。

2模型建立

2.1设计思路

        利用思维进化算法对BP神经网络的初始权值和阈值进行优化。首先,根据BP神经网络的拓扑结构,将解空间映射到编码空间,每个编码对应问题的一个解(即个体)。这里,选择BP神经网络拓扑结构为2-5-1,编码长度为21。然后,选取训练集的均方误差的倒数作为各个个体与种群的得分函数,利用思维进化算法,经过不断迭代,输出最优个体,并以此作为初始权值和阈值,训练BP神经网络。

2.2设计步骤

        根据上述设计思路,设计步骤主要包括以下几个部分,如图31-2所示。

        1)训练集/测试集产生
        与传统前馈神经网络相同,为了使得建立的模型具有良好的泛化性能,要求具有足够多的训练样本且具有较好的代表性。
        2)初始种群产生
        利用初始种群产生函数initpop_generate(),可以方便地产生初始种群。利用子种群产生函数subpop_generate(),可以方便地产生优胜子种群和临时子种群。具体用法请参考3.1和3.2节,此处不再赘述。

        3)子种群趋同操作
        优胜子种群和临时子种群产生后,各个子种群首先需要执行趋同操作,利用种群成熟判别函数 ismature(),可以方便地判断各个子种群趋同操作是否完成,具体用法请参考31.3.3节,此处不再赘述。
        4)子种群异化操作
        各个优胜子群体和临时子群体趋同操作完成后,便可以执行异化操作,并根据异化操作的结果,补充新的子群体,具体程序详见第4节。
        5)解析最优个体
        当满足迭代停止条件时,思维进化算法结束优化过程。此时,根据编码规则,对寻找到的最优个体进行解析,从而得到对应的BP神经网络的权值和阈值。
        6)训练P神经网络
        将优化得到的权值和阈值作为BP神经网络的初始权值和阈值,并利用训练集样本对BP神经网络进行训练.学习。
        7)仿真预测、结果分析
        与传统BP神经网络相同,训练完成后,便可输人测试集样本,进行仿真预测,并可以进行结果分析和讨论。

3 思维进化算法函数

        为了方便读者学习,使用思维进化算法,笔者按照思维进化算法的基本思路,尝试编写了思维进化算法中的一些重要函数,下面将详细介绍它们的调用格式和具体函数内
initpop_generate()函数为初始种群产生函数,其调用格式为

initpop = initpop_generate(popsize,S1,S2,S3,P,T)
        其中 , popsize为种群规模大小;S1为BP神经网络输入层神经元个数;S2为BP神经网络隐含层神经元个数;S3为BP神经网络输出层神经元个数;P为训练集样本输入矩阵;T为训练集样本输出矩阵;initpop为产生的初始种群。
        initpop_generate.m函数文件的具体内容如下:

function initpop = initpop_generate(popsize,S1,S2,S3,P,T)% 编码长度(权值/阈值总个数)
S = S1*S2 + S2*S3 + S2 + S3;% 预分配初始种群数组
initpop = zeros(popsize,S+1);for i = 1:popsize% 随机产生一个个体[-1,1]x = rand(1,S)*2 - 1;% 前S1*S2个编码为W1(输入层与隐含层间权值)temp = x(1:S1*S2);W1 = reshape(temp,S2,S1);% 接着的S2*S3个编码为W2(隐含层与输出层间权值)temp = x(S1*S2+1:S1*S2+S2*S3);W2 = reshape(temp,S3,S2);% 接着的S2个编码为B1(隐含层神经元阈值)temp = x(S1*S2+S2*S3+1:S1*S2+S2*S3+S2);B1 = reshape(temp,S2,1);%接着的S3个编码B2(输出层神经元阈值)temp = x(S1*S2+S2*S3+S2+1:end);B2 = reshape(temp,S3,1);% 计算隐含层神经元的输出A1 = tansig(W1*P,B1);% 计算输出层神经元的输出A2 = purelin(W2*A1,B2);% 计算均方误差SE = mse(T-A2);% 思维进化算法的得分val = 1 / SE;% 个体与得分合并initpop(i,:) = [x val];
end

3.2子种群产生函数

subpop_generate()函数为子种群产生函数,其调用格式为:

subpop= subpop_generate(center,SG,S1,S2,S3 ,P,T)
        其中, center为子种群的中心;SG为子种群的规模大小;S1为BP神经网络输入层神经元个数;S2为BP神经网络隐含层神经元个数;S3为BP神经网络输出层神经元个数;P为训练集样本输入矩阵;T为训练集样本输出矩阵;subpop为产生的子种群。
        subpop_generate.m函数文件的具体内容如下:

function subpop = subpop_generate(center,SG,S1,S2,S3,P,T)% 编码长度(权值/阈值总个数)
S = S1*S2 + S2*S3 + S2 + S3;% 预分配初始种群数组
subpop = zeros(SG,S+1);
subpop(1,:) = center;for i = 2:SGx = center(1:S) + 0.5*(rand(1,S)*2 - 1);% 前S1*S2个编码为W1(输入层与隐含层间权值)temp = x(1:S1*S2);W1 = reshape(temp,S2,S1);% 接着的S2*S3个编码为W2(隐含层与输出层间权值)temp = x(S1*S2+1:S1*S2+S2*S3);W2 = reshape(temp,S3,S2);% 接着的S2个编码为B1(隐含层神经元阈值)temp = x(S1*S2+S2*S3+1:S1*S2+S2*S3+S2);B1 = reshape(temp,S2,1);%接着的S3个编码B2(输出层神经元阈值)temp = x(S1*S2+S2*S3+S2+1:end);B2 = reshape(temp,S3,1);% 计算隐含层神经元的输出A1 = tansig(W1*P,B1);% 计算输出层神经元的输出A2 = purelin(W2*A1,B2);% 计算均方误差SE = mse(T-A2);% 思维进化算法的得分val = 1 / SE;% 个体与得分合并subpop(i,:) = [x val];
end

3.3种群成熟判别函数

        ismature()函数为种群成熟判别函数,其调用格式为:

[flag,index]= ismature(pop)
        其中, pop为待判别的子种群; flag为种群成熟标志:若flag =0,则子种群不成熟,若flag =1,则子种群成熟;index为子种群中得分最高的个体对应的索引号。
        ismature.m函数文件的具体内容如下:

function [flag,index] = ismature(pop)[~,index] = max(pop(:,end));
if index == 1flag = 1;
elseflag = 0;
end

3.4 主函数

        主函数为main.m文件,具体如下:

%% 思维进化算法应用于优化BP神经网络的初始权值和阈值%% 清空环境变量
clear all
clc
warning off%% 导入数据
load data.mat
% 随机生成训练集、测试集
k = randperm(size(input,1));
N = 1900;
% 训练集——1900个样本
P_train=input(k(1:N),:)';
T_train=output(k(1:N));
% 测试集——100个样本
P_test=input(k(N+1:end),:)';
T_test=output(k(N+1:end));%% 归一化
% 训练集
[Pn_train,inputps] = mapminmax(P_train);
Pn_test = mapminmax('apply',P_test,inputps);
% 测试集
[Tn_train,outputps] = mapminmax(T_train);
Tn_test = mapminmax('apply',T_test,outputps);%% 参数设置
popsize = 200;                      % 种群大小
bestsize = 5;                       % 优胜子种群个数
tempsize = 5;                       % 临时子种群个数
SG = popsize / (bestsize+tempsize); % 子群体大小
S1 = size(Pn_train,1);              % 输入层神经元个数
S2 = 5;                            % 隐含层神经元个数
S3 = size(Tn_train,1);              % 输出层神经元个数
iter = 10;                          % 迭代次数%% 随机产生初始种群
initpop = initpop_generate(popsize,S1,S2,S3,Pn_train,Tn_train);%% 产生优胜子群体和临时子群体
% 得分排序
[sort_val,index_val] = sort(initpop(:,end),'descend');
% 产生优胜子种群和临时子种群的中心
bestcenter = initpop(index_val(1:bestsize),:);
tempcenter = initpop(index_val(bestsize+1:bestsize+tempsize),:);
% 产生优胜子种群
bestpop = cell(bestsize,1);
for i = 1:bestsizecenter = bestcenter(i,:);bestpop{i} = subpop_generate(center,SG,S1,S2,S3,Pn_train,Tn_train);
end
% 产生临时子种群
temppop = cell(tempsize,1);
for i = 1:tempsizecenter = tempcenter(i,:);temppop{i} = subpop_generate(center,SG,S1,S2,S3,Pn_train,Tn_train);
endwhile iter > 0%% 优胜子群体趋同操作并计算各子群体得分best_score = zeros(1,bestsize);best_mature = cell(bestsize,1);for i = 1:bestsizebest_mature{i} = bestpop{i}(1,:);best_flag = 0;                % 优胜子群体成熟标志(1表示成熟,0表示未成熟)while best_flag == 0% 判断优胜子群体是否成熟[best_flag,best_index] = ismature(bestpop{i});% 若优胜子群体尚未成熟,则以新的中心产生子种群if best_flag == 0best_newcenter = bestpop{i}(best_index,:);best_mature{i} = [best_mature{i};best_newcenter];bestpop{i} = subpop_generate(best_newcenter,SG,S1,S2,S3,Pn_train,Tn_train);endend% 计算成熟优胜子群体的得分best_score(i) = max(bestpop{i}(:,end));end% 绘图(优胜子群体趋同过程)figuretemp_x = 1:length(best_mature{1}(:,end))+5;temp_y = [best_mature{1}(:,end);repmat(best_mature{1}(end),5,1)];plot(temp_x,temp_y,'b-o')hold ontemp_x = 1:length(best_mature{2}(:,end))+5;temp_y = [best_mature{2}(:,end);repmat(best_mature{2}(end),5,1)];plot(temp_x,temp_y,'r-^')hold ontemp_x = 1:length(best_mature{3}(:,end))+5;temp_y = [best_mature{3}(:,end);repmat(best_mature{3}(end),5,1)];plot(temp_x,temp_y,'k-s')hold ontemp_x = 1:length(best_mature{4}(:,end))+5;temp_y = [best_mature{4}(:,end);repmat(best_mature{4}(end),5,1)];plot(temp_x,temp_y,'g-d')hold ontemp_x = 1:length(best_mature{5}(:,end))+5;temp_y = [best_mature{5}(:,end);repmat(best_mature{5}(end),5,1)];plot(temp_x,temp_y,'m-*')legend('子种群1','子种群2','子种群3','子种群4','子种群5')xlim([1 10])xlabel('趋同次数')ylabel('得分')title('优胜子种群趋同过程')%% 临时子群体趋同操作并计算各子群体得分temp_score = zeros(1,tempsize);temp_mature = cell(tempsize,1);for i = 1:tempsizetemp_mature{i} = temppop{i}(1,:);temp_flag = 0;                % 临时子群体成熟标志(1表示成熟,0表示未成熟)while temp_flag == 0% 判断临时子群体是否成熟[temp_flag,temp_index] = ismature(temppop{i});% 若临时子群体尚未成熟,则以新的中心产生子种群if temp_flag == 0temp_newcenter = temppop{i}(temp_index,:);temp_mature{i} = [temp_mature{i};temp_newcenter];temppop{i} = subpop_generate(temp_newcenter,SG,S1,S2,S3,Pn_train,Tn_train);endend% 计算成熟临时子群体的得分temp_score(i) = max(temppop{i}(:,end));end% 绘图(临时子群体趋同过程)figuretemp_x = 1:length(temp_mature{1}(:,end))+5;temp_y = [temp_mature{1}(:,end);repmat(temp_mature{1}(end),5,1)];plot(temp_x,temp_y,'b-o')hold ontemp_x = 1:length(temp_mature{2}(:,end))+5;temp_y = [temp_mature{2}(:,end);repmat(temp_mature{2}(end),5,1)];plot(temp_x,temp_y,'r-^')hold ontemp_x = 1:length(temp_mature{3}(:,end))+5;temp_y = [temp_mature{3}(:,end);repmat(temp_mature{3}(end),5,1)];plot(temp_x,temp_y,'k-s')hold ontemp_x = 1:length(temp_mature{4}(:,end))+5;temp_y = [temp_mature{4}(:,end);repmat(temp_mature{4}(end),5,1)];plot(temp_x,temp_y,'g-d')hold ontemp_x = 1:length(temp_mature{5}(:,end))+5;temp_y = [temp_mature{5}(:,end);repmat(temp_mature{5}(end),5,1)];plot(temp_x,temp_y,'m-*')legend('子种群1','子种群2','子种群3','子种群4','子种群5')xlim([1 10])xlabel('趋同次数')ylabel('得分')title('临时子种群趋同过程')%% 异化操作[score_all,index] = sort([best_score temp_score],'descend');% 寻找临时子群体得分高于优胜子群体的编号rep_temp = index(find(index(1:bestsize) > bestsize)) - bestsize;% 寻找优胜子群体得分低于临时子群体的编号rep_best = index(find(index(bestsize+1:end) < bestsize+1) + bestsize);% 若满足替换条件if ~isempty(rep_temp)% 得分高的临时子群体替换优胜子群体for i = 1:length(rep_best)bestpop{rep_best(i)} = temppop{rep_temp(i)};end% 补充临时子群体,以保证临时子群体的个数不变for i = 1:length(rep_temp)temppop{rep_temp(i)} = initpop_generate(SG,S1,S2,S3,Pn_train,Tn_train);endelsebreak;end%% 输出当前迭代获得的最佳个体及其得分if index(1) < 6best_individual = bestpop{index(1)}(1,:);elsebest_individual = temppop{index(1) - 5}(1,:);enditer = iter - 1;end%% 解码最优个体
x = best_individual;% 前S1*S2个编码为W1
temp = x(1:S1*S2);
W1 = reshape(temp,S2,S1);% 接着的S2*S3个编码为W2
temp = x(S1*S2+1:S1*S2+S2*S3);
W2 = reshape(temp,S3,S2);% 接着的S2个编码为B1
temp = x(S1*S2+S2*S3+1:S1*S2+S2*S3+S2);
B1 = reshape(temp,S2,1);%接着的S3个编码B2
temp = x(S1*S2+S2*S3+S2+1:end-1);
B2 = reshape(temp,S3,1);% E_optimized = zeros(1,100);
% for i = 1:100
%% 创建/训练BP神经网络
net_optimized = newff(Pn_train,Tn_train,S2);
% 设置训练参数
net_optimized.trainParam.epochs = 100;
net_optimized.trainParam.show = 10;
net_optimized.trainParam.goal = 1e-4;
net_optimized.trainParam.lr = 0.1;
% 设置网络初始权值和阈值
net_optimized.IW{1,1} = W1;
net_optimized.LW{2,1} = W2;
net_optimized.b{1} = B1;
net_optimized.b{2} = B2;
% 利用新的权值和阈值进行训练
net_optimized = train(net_optimized,Pn_train,Tn_train);%% 仿真测试
Tn_sim_optimized = sim(net_optimized,Pn_test);     
% 反归一化
T_sim_optimized = mapminmax('reverse',Tn_sim_optimized,outputps);%% 结果对比
result_optimized = [T_test' T_sim_optimized'];
% 均方误差
E_optimized = mse(T_sim_optimized - T_test)
% end
%% 未优化的BP神经网络
% E = zeros(1,100);
% for i = 1:100
net = newff(Pn_train,Tn_train,S2);
% 设置训练参数
net.trainParam.epochs = 100;
net.trainParam.show = 10;
net.trainParam.goal = 1e-4;
net.trainParam.lr = 0.1;
% 利用新的权值和阈值进行训练
net = train(net,Pn_train,Tn_train);%% 仿真测试
Tn_sim = sim(net,Pn_test);    
% 反归一化
T_sim = mapminmax('reverse',Tn_sim,outputps);%% 结果对比
result = [T_test' T_sim'];
% 均方误差
E = mse(T_sim - T_test)% end
        由于训练集和测试集是随机产生的,因此每次运行的结果都会有所不同。某次运行的结
果如下:

E_optimized =

    0.0441
E =

    0.0081

        从结果中不难发现,利用思维进化算法优化后的初始权值和阈值,BP神经网络的泛化性能更高,测试集的预测误差更低。
        与上述过程对应的初始优胜子种群和临时子种群的趋同过程,如下图所示。分别观察,不难发现:

 






        ①经过若干次趋同操作,各个子种群均已成熟(得分不再增加);
        ②允许存在这样一些子种群,如优胜子种群中的子种群1,3,4和临时子种群中的子种群3,并没有执行趋同操作,因为在子种群中心周围,没有发现更好的个体。
        ③对比可以发现:待优胜子种群和临时子种群成熟后,临时在一些子种群,其得分比优胜子种群中的一些子种群得分高,譬如,临时子种群中的子种群1、2.5与优胜子种群中的子种群3、4、5,因此需要执行3次异化操作,同时需要补充3个新的子种群到临时子种群中。

5案例扩展

5.1得分函数的设计

        得分函数,与遗传算法中的适应度函数概念一致,是评价个体性能的指标。本文选用的得分函数是训练集均方误差的倒数。为了方便读者学习,这里对得分函数的设计作简要讨论,当然,读者也可以自定义得分函数。
        1)回归拟合问题
        对于回归拟合问题,一般的评价指标涵盖均方误差、误差平方和,决定系数和相对误差等。

        2)分类问题
        对于分类问题,一般的评价指标涵盖整体正确率、正类正确率和负类正确率等

        3)样本来源
        从样本来源的角度来讲,一般有以下两个方案:

        ①利用训练集的样本进行指标计算;
        ②利用验证集的样本进行指标计算。
        由于思维进化算法中的一些参数,比如种群规模、优胜子群体和临时子群体的个数,迭代进化停止条件等,对优化的结果均有影响,因此不少专家和学者在这方面做了许多卓有成效的研究,为思维进化算法的理论支撑及广泛应用奠定了扎实的基础。对此感兴趣的读者,可以深入学习参考文献中的相关论文。

 

 

 

 

相关文章:

思维进化算法(MEA)优化BP神经网络

随着计算机科学的发展,人们借助适者生存这一进化规则,将计算机科学和生物进化结合起来,逐渐发展形成一类启发式随机搜索算法,这类算法被称为进化算法(Evolutionary Com-putation, EC)。最著名的进化算法有:遗传算法、进化策略、进化规划。与传统算法相比,进化算法的特点是群体搜…...

Kotlin 中的 设计模式

单例模式 饿汉模式 饿汉模式在类初始化的时候就创建了对象&#xff0c;所以不存在线程安全问题。 局限性&#xff1a; 1、如果构造方法中有耗时操作的话&#xff0c;会导致这个类的加载比较慢&#xff1b; 2、饿汉模式一开始就创建实例&#xff0c;但是并没有调用&#xf…...

Vulnhub: ICMP: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.208 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.208 80端口的cms为Monitorr 1.7.6m 搜索发现该版本的cms存在远程代码执行 searchsploit monitorr 漏洞利用 nc本地监听&…...

我的创作纪念日(C++修仙练气期总结)

分享自己最喜欢的一首歌&#xff1a;空想フォレスト—伊東歌詞太郎 机缘 现在想想自己在CSDN创作的原因&#xff0c;一开始其实就是想着拿着博客当做自己的学习笔记&#xff0c;笔记嘛&#xff0c;随便写写&#xff0c;自己看得懂就ok了的态度凸(艹皿艹 )。也是用来作为自己学习…...

css的常见伪元素使用

1.first-line 元素首行设置特殊样式。 效果演示&#xff1a; <div class"top"><p>可以使用 "first-line" 伪元素向文本的首行设置特殊样式。<br> 换行内容 </p></div> .top p::first-line {color: red;} 2.first-lette…...

91. 解码方法

递归法&#xff1a;超时了 从字符串的后面向前计算&#xff0c;每一次递归都缩小子集 public class Solution {public int NumDecodings(string s) {return RecursiveAdd(s, s.Length - 1);}public int RecursiveAdd(string s, int index) {// 已经到最后一个元素if(index <…...

docker搭建opengrok环境2

引言&#xff1a; 虚拟机关闭后重新开启&#xff0c;理论上是需要重新启动一下docker的&#xff0c;以重新启动其中的服务。 命令基础&#xff1a; docker images&#xff1a;查看docker中现有的镜像 docker container ls -all&#xff1a;查看docker中目前在运行的containe…...

【校招VIP】java语言考点之ConcurrentHashMap1.7和1.8

考点介绍&#xff1a; ConcurrentHashMap是JAVA校招面试的热门考点&#xff0c;主要集中在1.7和1.8的底层结构和相关的性能提高。 理解这个考点要从map本身的并发问题出发&#xff0c;再到hashTable的低性能并发安全&#xff0c;引申到ConcurrentHashMap的分块处理。同时要理解…...

php如何实现5x+2x+1x=100

要实现5x 2x 1x 100的计算&#xff0c;可以使用PHP来解方程。以下是一个简单的PHP代码示例&#xff1a; php <?php $x 1; // 初始化x的值while (5*$x 2*$x 1*$x ! 100) { // 循环直到方程成立$x; // 每次循环增加x的值 }echo "x " . $x; // 输出x的值 ?…...

机器人项目:从 ROS2 切换到 ROS1 的原因

一、说明 机器人操作系统ROS是使用最广泛的机器人中间件平台。它在机器人社区中使用了10多年&#xff0c;无论是在业余爱好者领域还是在工业领域。ROS可用于各种微控制器和计算机&#xff0c;从Arduino到Raspberry Pi再到Linux工作站&#xff0c;它为电机控制器&#xff0c;视觉…...

Vault主题 - UiCore多用途Elementor WordPress主题

你可以使用Vault主题 – UiCore多用途Elementor WordPress主题构建什么&#xff1f; Vault主题拥有专业、像素级完美且干净的现代布局&#xff0c;几乎适合您需要的任何网站&#xff1a; 小型企业网站企业网站着陆页面权威博客销售和营销页面网上商店 自由职业者的最佳选择 …...

G0第26章:微服务概述与gRPCprotocol buffers

Go微服务与云原生 1、微服务架构介绍 单体架构&#xff08;电商&#xff09; SOA架构&#xff08;电商&#xff09; 微服务架构&#xff08;电商&#xff09; 优势 挑战 拆分 发展史 第一代:基于RPC的传统服务架构 第二代:Service Mesh(istio) 微服务架构分层 核心组件 Summar…...

三款远程控制软件对比,5大挑选指标:安全、稳定、易用、兼容、功能

陈老老老板&#x1f934; &#x1f9d9;‍♂️本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f9d9;‍♂️本文简述&#xff1a;三款远程控制软件对比&#xff0c;5大挑选指标&#xff1…...

Java中static的应用之单例模式

单例模式是一种创建对象的设计模式&#xff0c;它保证一个类只有一个实例&#xff0c;并提供一个全局访问点。由于单例模式只允许存在一个实例&#xff0c;因此它可以节省系统资源并提高程序的性能。在许多情况下&#xff0c;单例模式在应用程序中都是非常有用的&#xff0c;例…...

TypeError: Cannot read properties of undefined (reading ‘container‘)

问题环境&#xff1a; element项目 el-table的错误 项目是由 webpack项目迁移为 vite项目 问题描述&#xff1a; errorLog.js?t1692581753160:17 TypeError: Cannot read properties of undefined (reading container) at unbind (infinite-scroll.js:259:31) …...

Vue--BM记事本

效果如下&#xff1a; 用到了如下的技术&#xff1a; 1.列表渲染&#xff1a;v-for key的设置 2.删除功能&#xff1a;v-on调用参数 fliter过滤 覆盖修改原数组 3.添加功能&#xff1a;v-model绑定&#xff0c;unshift修改原数组添加 html文件如下&#xff1a; <!DOCTYPE …...

openpnp - 板子上最小物料封装尺寸的选择

文章目录 openpnp - 板子上最小物料封装尺寸的选择概述END openpnp - 板子上最小物料封装尺寸的选择 概述 现在设备调试完了, 用散料飞达载入物料试了一下. 0402以上贴的贴别准, 贴片流程也稳, 基本不需要手工干预. 0201可以贴, 但是由于底部相机元件视觉识别成功率不是很高…...

什么是非功能性需求,它们如何影响产品开发?

我们在选购新车时&#xff0c;会预设一些选购的标准&#xff0c;比如GPS导航必须能够保存目的地&#xff0c;或者必须要买黑色的车。我们可能下意识以为这些是功能性需求&#xff0c;但实际上这些特性都是与用户体验相关的非功能性需求。 一、什么是非功能性需求(NFR)? 非功…...

Oracle jdk8 exe->zip

一、背景 目前Oracle网站对应jdk8安装windows仅存在exe安装包&#xff0c;对于某些用户一台机器上对应jdk版本需动态切换&#xff0c;故需使用zip版本jdk&#xff0c;更加方便&#xff0c;本文介绍如何从jdk对应exe提取zip。 二、步骤 下载jdk8对应exe安装包&#xff1b;使用…...

Android 命令行如何运行 JAR 文件

​ 最近有位老哥问了一个问题&#xff0c;说如果将java的jar文件在Android中执行&#xff1f;这个其实很简单的一个问题&#xff0c;直接写个App放里面不就可以了么&#xff1f;但是人家说没有App&#xff0c;直接使用命令行去运行。说明这个需求的时候&#xff0c;把我给整懵了…...

5.4 webrtc的线程

那今天呢&#xff1f;我们来了解一下webrtc中的threed&#xff0c;首先我们看一下threed的类&#xff0c;它里边儿都含了哪些内容&#xff1f;由于threed的类非常大啊&#xff0c;我们将它分成两部分。 那第一部分呢&#xff0c;是我们看threed的类中都包含了哪些数据之后呢&a…...

vscode | linux | c++ intelliense 被弃用解决方案

每日一句&#xff0c;vscode用的爽是爽&#xff0c;主要是可配置太强了。如果也很会研究&#xff0c;可以直接去咸鱼接单了 废话少说&#xff0c;直接整。 用着用着说是c intelliense被弃用&#xff0c;很多辅助功能无法使用&#xff0c;像查看定义、查看引用、函数跳转、智能提…...

HPE服务器常见报错信息以及解决方案

General controller issues 常规控制器问题 Controllers are no longer redundant 控制器不再冗余 HPE Dynamic Smart Array B140i drives are not found when RAID mode is disabled 禁用 RAID 模式时找不到 HPE 动态智能阵列 B140i 驱动器 Data located on drives accessed i…...

尚硅谷宋红康MySQL笔记 3-9

我不会记录的特别详细 大体框架 基本的Select语句运算符排序与分页多表查询单行函数聚合函数子查询 第三章 基本的SELECT语句 SQL分类 这个分类有很多种&#xff0c;大致了解下即可 DDL&#xff08;Data Definition Languages、数据定义语言&#xff09;&#xff0c;定义了…...

Leetcode.2337 移动片段得到字符串

题目链接 Leetcode.2337 移动片段得到字符串 rating : 1693 题目描述 给你两个字符串 start 和 target &#xff0c;长度均为 n n n 。每个字符串 仅 由字符 L、R 和 _ 组成&#xff0c;其中&#xff1a; 字符 L 和 R 表示片段&#xff0c;其中片段 L 只有在其左侧直接存在一…...

【vue】更改角色权限后,实现页面不刷新更改其可展示的导航菜单

登入的角色本身属于领导级别&#xff08;集团权限&#xff09;&#xff0c;没有下级的不同权限&#xff1a; 切换不同身份&#xff08;公司&#xff09;&#xff0c;以获得相应部门的不同导航菜单及权限 这里实现&#xff1a;更改角色权限后&#xff0c;实现页面 不刷新 更改…...

【G-LAB】网络工程师常用排错命令详细版

网络工程师在日常配置中难免出现各种配置错误&#xff0c;比如接口地址配错、掩码位数配错、接口忘记no shutdown。除去这些基础错误&#xff0c;在配置各种路由选择协议时也会因为网络类型、邻居类型、区域和路由器层级等各种问题使邻居无法建立、路由无法传递进而导致网络不通…...

Linux 桌面版关闭GUI桌面环境

持久打开和关闭 通过CtrlAltF1-F6快捷键进入命令行界面 执行以下命令&#xff0c;持久关闭Ubuntu桌面版的GUI环境&#xff1a; sudo systemctl set-default multi-user.target执行以下命令&#xff0c;持久开启Ubuntu桌面版的GUI环境 通过CtrlAltF7快捷键进入GUI界面 sudo s…...

ChatGPT能代替搜索引擎吗?ChatGPT和搜索引擎有什么区别?

ChatGPT和搜索引擎是两种在信息获取和交流中常用的工具&#xff0c;ChatGPT是一种基于人工智能技术的聊天机器人&#xff0c;而搜索引擎是一种在互联网上搜索信息的工具。尽管它们都是依托互联网与信息获取和交流有关&#xff0c;部分功能重合&#xff0c;但在很多方面存在着明…...

PHP海外代购管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 海外代购管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/88229435 论文 https://…...

游戏反外挂方案解析

近年来&#xff0c;游戏市场高速发展&#xff0c;随之而来的还有图谋利益的游戏黑产。在利益吸引下&#xff0c;游戏黑产扩张迅猛&#xff0c;已发展成具有庞大规模的产业链&#xff0c;市面上游戏受其侵扰的案例屡见不鲜。 据《FairGuard游戏安全2022年度报告》数据统计&…...

基于郊狼算法优化的BP神经网络(预测应用) - 附代码

基于郊狼算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于郊狼算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.郊狼优化BP神经网络2.1 BP神经网络参数设置2.2 郊狼算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…...

【腾讯云 TDSQL-C Serverless 产品测评】全面测评TDSQL-C Mysql Serverless

全面测评TDSQL-C Mysql Serverless 文章目录 全面测评TDSQL-C Mysql Serverless前言什么是TDSQL-C Mysql Serverless初始化 TDSQL-C Mysql Serverless新建数据库建立数据表开启外网访问 兼容性SQL文件 导入导出navicat 直接在线传输 构建测试环境准备Python测试脚本准备 Jmeter…...

Qt应用开发(基础篇)——纯文本编辑窗口 QPlainTextEdit

一、前言 QPlainTextEdit类继承于QAbstractScrollArea&#xff0c;QAbstractScrollArea继承于QFrame&#xff0c;是Qt用来显示和编辑纯文本的窗口。 滚屏区域基类https://blog.csdn.net/u014491932/article/details/132245486?spm1001.2014.3001.5501框架类QFramehttps://blo…...

数据结构-->栈

&#x1f495;休对故人思故国&#xff0c;且将新火试新茶&#xff0c;诗酒趁年华&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;详解链表OJ题 前言&#xff1a; 前面已经学习过顺序表&#xff0c;链表。他们都是线性表&#xff0c;今天要学习的栈也是一种线…...

强训第36天

C D C 193--1100 0001 194--1100 0010 196--1100 0100 198--1100 0110 能包括全部的且最小的为 1100 0xxx xxx为主机号&#xff0c;站三位 B MAC地址是绑定网卡的&#xff0c;全球唯一 D A C D IP网段 17为网络号 所以是 40.15.1aaa aaa(7位主机号).0 因为要划分2个子网 所以…...

PyTorch bug记录

1、RuntimeError: Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same 这个错误是因为模型的权重是在GPU上&#xff0c;但是输入数据在CPU上。在PyTorch中&#xff0c;Tensor的类型和所在的设备&#xff08;CPU或GPU&#xff09;需…...

js中的正则表达式(一)

目录 1.什么是正则表达式 2.正则表达式在JavaScript中的使用场景: 3.正则表达式的语法&#xff1a; 1.什么是正则表达式 正则表达式(Regular Expression&#xff09;是用于匹配字符串中字符组合的模式。在JavaScript中&#xff0c;正则表达式也是对象通常用来查找、替换那些符…...

免费开源使用的几款红黑网络流量工具,自动化的多功能网络侦查工具、超级关键词URL采集工具、Burpsuite被动扫描流量转发插件

免费开源使用的几款红黑网络流量工具&#xff0c;自动化的多功能网络侦查工具、超级关键词URL采集工具、Burpsuite被动扫描流量转发插件。 #################### 免责声明&#xff1a;工具本身并无好坏&#xff0c;希望大家以遵守《网络安全法》相关法律为前提来使用该工具&am…...

使用Mybatis Plus进行DAO层开发

一、特性 Mybatis应该大家现在都知道&#xff0c;而且在项目中都在使用&#xff0c;因为这块ORM框架让大家能专心业务SQL的编写&#xff0c;数据库的连接&#xff0c;连接池的使用都不用关心&#xff0c;极大的提高了生产效率。 今天要给大家介绍的另外一款ORM框架&#xff0…...

Android中如何不编译源生模块

如果想让自己的app 替换系统的app 比如使用闪电浏览器替换系统的Browser 首先把闪电浏览器放到 vendor/rockchip/common/apps Android.mk LOCAL_PATH : $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE : Lightning LOCAL_SRC_FILES : $(LOCAL_MODULE).apk LOCAL_MODULE_C…...

安装Vue_dev_tools

Vue控制台出现Download the Vue Devtools extension for a better development experience: 下载Vue_dev_tools,这里给出网盘链接&#xff0c;有Vue2和Vue3的&#xff0c;dev_tools 以Google浏览器为例 点击设置&#xff08;就是那三个点&#xff09;->扩展程序->管理扩…...

【数据结构入门指南】二叉树顺序结构: 堆及实现(全程配图,非常经典)

【数据结构入门指南】二叉树顺序结构: 堆及实现&#xff08;全程配图&#xff0c;非常经典&#xff09; 一、前言&#xff1a;二叉树的顺序结构二、堆的概念及结构三、堆的实现&#xff08;本篇博客以实现小堆为例&#xff09;3.1 准备工作3.2 初始化3.3 堆的插入3.3.1 向上调…...

css实现三角形的几种方法

css实现三角形的方法&#xff1a;1、使用边框实现三角形&#xff0c;利用透明边框和实色边框的组合&#xff0c;可以创建不同方向和大小的三角形&#xff1b;2、使用伪元素实现三角形&#xff0c;通过使用伪元素来创建一个占据父元素一半大小的实心三角形&#xff1b;3、使用tr…...

❤ Vue工作常用的一些动态数据和方法处理

❤ Vue工作常用的一些动态数据和方法处理 &#xff08;1&#xff09;动态拼接相对路径结尾的svg 错误写法一 ❌ 正确写法 &#x1f646; <img :src"require(/assets//amazon/svg/homemenu${index}.svg)" style"height: 20px;display: block;margin: 0 au…...

SQLite的命令用法

学习数据库直达网站 https://www.runoob.com/sqlite/sqlite-tutorial.html&#xff08;菜鸟教程&#xff09; 这里只分享&#xff0c;基础操作&#xff0c;数据库创建打开……等等 用到查菜鸟教程即可 文章目录 学习数据库直达网站创建一个数据库方式1方式2 创建一个表格插入一…...

在jupyter notebook中使用海龟绘图

首先&#xff0c;安装ipyturtle3 ref:ipyturtle3 PyPI pip install ipyturtle3然后&#xff0c;安装ipycanvas ipycanvas是一个需要安装在与JupyterLab实例相同环境的包。此外&#xff0c;您需要安装nodejs&#xff0c;并启用JupyterLab ipycanvas小部件。 所有这些都在ipy…...

密码学学习笔记(十八):Diffie–Hellman (DH) 密钥交换

DH算法是第一个密钥交换算法&#xff0c;也是第一个得到形式化描述的公钥密码算法。 群论 DH密钥交换算法基于数学中的群论&#xff0c;群论也是当今大多数公钥密码的基础。 要使集合及其运算成为一个群&#xff0c;需要满足以下性质&#xff1a; 封闭性&#xff1a;群中两…...

Linux —— 进程间通信(管道)

目录 一&#xff0c;进程间通信 二&#xff0c;管道 匿名管道 命名管道 一&#xff0c;进程间通信 进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;&#xff0c;即在不同进程之间进行信息的传播或交换&#xff1b;由于一般进程用户地址空间是…...

python常用

环境配置 conda Conda自动补全 在终端激活conda环境的时候按tab不能自动补全activate和环境名。安装后可用tab进行补全。 安装 conda-bash-completion 插件&#xff1a;GitHub 安装方法&#xff1a; conda install -c conda-forge conda-bash-completion常用命令 #创建虚拟…...