(转载)基于遗传算法的多目标优化算法(matlab实现)

news2024/11/25 14:49:04

1 理论基础

1.1 多目标优化及Pareto最优解

        多目标优化问题可以描述如下:
        其中,f(x)为待优化的目标函数;x为待优化的变量;Ib和ub分别为变量x的下限和上限约束;Aeq*x=beq为变量x的线性等式约束;A*x≤b为变量x的线性不等式约束。
        在图1所示的优化问题中,目标函数f1 和f2是相互矛盾的。因为A1<B1且A2>B2,也就是说,某一个目标函数的提高需要以另一个目标函数的降低作为代价,称这样的解A和解B是非劣解(noninferiority solutions),或者说是Pareto最优解(Pareto optima)。多目标优化算法的目的就是要寻找这些Pareto最优解。

 图1 多目标优化问题

1.2 函数gamultiobj

        目前的多目标优化算法有很多,Kalyanmoy Deb的带精英策略的快速非支配排序遗传算法(nondominated sorting genetic algorithm I,NSGA-II)无疑是其中应用最为广泛也是最为成功的一种。MATLAB R2009a版本提供的函数gamultiobj所采用的算法就是基于NSGA-Ⅱ改进的一种多目标优化算法(a variant of NSGA-ⅡI)。函数gamultiobj的出现,为在MATLAB平台下解决多目标优化问题提供了良好的途径。函数gamultiobj包含在遗传算法与直接搜索工具箱(genetic algorithm and direct search toolbox,GADST)中,其位置如下:MATLAB安装目录\toolbox\gads\gads,这里称函数gamultiobj为基于遗传算法的多目标优化函数,相应的算法为基于遗传算法的多目标优化算法。本案例将以函数gamultiobj为基础,对基于遗传算法的多目标优化算法进行详细分析,并介绍函数gamultiobj的使用。

1.3 函数gamultiobj中的一些基本概念

        在讲解函数gamultiobj之前,有必要介绍基于遗传算法的多目标优化算法中的一些概念,其他的概念如个体、种群、代、选择、交叉、变异和交叉后代比例等,这里不做介绍。事实上,由于函数gamultiobj是基于遗传算法的,因此,遗传算法中的很多概念和这里的函数gamultiobj是相同的,这也是函数gamultiobj位于GADST内的原因。
        1.支配(dominate)与非劣(non-inferior)在多目标优化问题中,如果个体p至少有一个目标比个体q的好,而且个体p的所有目标都不比个体q的差,那么称个体p支配个体q(p dominates q),或者称个体q受个体p支配(gis dominated by p),也可以说,个体p非劣于个体q(p is non-inferior to q)。
        2.序值(rank)和前端(front)
        如果p支配q,那么p的序值比q的低。如果p和q互不支配,或者说,p和q相互非劣,那么p和q有相同的序值。序值为1的个体属于第一前端,序值为2的个体属于第二前端,依次类推。显然,在当前种群中,第一前端是完全不受支配的,第二前端受第一前端中个体的支配。这样,通过排序,可以将种群中的个体分到不同的前端。
        3.拥挤距离(crowding distance)
        拥挤距离用来计算某前端中的某个体与该前端中其他个体之间的距离,用以表征个体间的拥挤程度。显然,拥挤距离的值越大,个体间就越不拥挤,种群的多样性就越好。需要指出的是,只有处于同一前端的个体间才需要计算拥挤距离,不同前端之间的个体计算拥挤距离是没有意义的
        4.最优前端个体系数(ParetoFraction)
        最优前端个体系数定义为最优前端中的个体在种群中所占的比例,即最优前端个体数=min{ParetoFraction×种群大小,前端中现存的个体数目},其取值范围为0~1,详细讲解见3.2节中的函数trimPopulation。需要指出的是,ParetoFraction的概念是函数gamultiobj所特有的,在NSGA-Ⅱ中是没有的,这也是为什么称函数gamultiobj是一种多目标优化算法的原因。

2 素例背景

2.1 问题描述

        待优化的多目标问题表述如下:

2.2 解题思路及步骤

        这里将使用函数gamultiobj求解以上多目标优化问题。同函数ga的调用一样,函数gamultiobj的调用方式也有两种:GUI方式和命令行方式。
1:通过GUI方式调用函数gamultiobj
        通过以下两种方式可以调出函数gamultiobj的GUI界面:
        (1)在MATLAB主界面的左下角依次单击:APP→Optimization→在Slover中选择“gamultiobj—Multiobjective optimization using Genetic Algorithm"。

        (2)在命令行调用GUI:

optimtool('gamultiobj')
        可以看到,函数gamultiobj的GUI界面与函数ga的GUI界面大致相同,仅在以下几个方面存在区别,
        (1)前者比后者多了Distance measure function和Pareto front population fraction两个 参数。
        (2)前者比后者少了参数Elite count,这是因为函数gamultiobj的精英是自动保留的;前者比后者少了Scaling function,这是因为函数gamultiobj的选择是基于序值和拥挤距离的,故不再需要Scaling的处理;函数gamultiobj没有非线性约束。
        (3)绘图函数不同及下列设置的默认值不同:种群大小(Population size)、选择函数 (Selection function)、交叉函数(Crossover function)、最大进化代数(Generations)、停止代数 (Stall generations)、适应度函数值偏差(Function tolerance)。
        函数gamultiobj GUI界面的其他介绍和使用方法可以参考普通遗传算法,这里不再介绍。
2:通过调用函数的形式使用gamultiobj
        以下内容引用自官方文档:

gamultiobj是使用遗传算法解决多目标优化问题的函数。它试图解决以下形式的多目标问题:
min F(X) subject to: AX <= b, AeqX = beq (线性约束)
X lb <= X <= ub (边界约束)

X = gamultiobj(FITNESSFCN,NVARS)找到在FITNESSFCN中定义的目标函数的局部帕累托集X。NVARS是优化问题的维数(决策变量的数量)。FITNESSFCN接受大小为1-by-NVARS的向量X,并返回在决策变量处评估的大小为1-by-numberOfObjectives的向量。X是具有NVARS列的矩阵。X中的行数与帕累托解的数量相同。帕累托集中的所有解同样优,取决于应用程序的设计者选择帕累托集中的解。

X = gamultiobj(FITNESSFCN,NVARS,A,b)找到在FITNESSFCN中定义的目标函数的局部帕累托集X,受制于线性不等式A*X <= B。仅支持默认的PopulationType选项('doubleVector')的线性约束;不支持其他种群类型,例如'bitString'和'custom'。

X = gamultiobj(FITNESSFCN,NVARS,A,b,Aeq,beq)找到在FITNESSFCN中定义的目标函数的局部帕累托集X,受制于线性等式AeqX = beq以及线性不等式AX <= b。(如果不存在不等式,则设置A=[]和b=[]。)仅支持默认的PopulationType选项('doubleVector')的线性约束;不支持其他种群类型,例如'bitString'和'custom'。

X = gamultiobj(FITNESSFCN,NVARS,A,b,Aeq,beq,lb,ub)定义设计变量X的下限和上限,以便在范围lb <= X <= ub中找到局部帕累托集。如果不存在边界,则使用空矩阵。如果X(i)无下限,则设置lb(i)= -Inf;如果X(i)无上限,则设置ub(i)= Inf。仅支持默认的PopulationType选项('doubleVector')的边界约束;不支持其他种群类型,例如'bitString'和'custom'。

X = gamultiobj(FITNESSFCN,NVARS,A,b,Aeq,beq,lb,ub,NONLCON)找到满足NONLCON中定义的约束的局部帕累托集X。函数NONLCON接受X并返回向量C和Ceq,分别表示非线性不等式和等式。帕累托集X必须满足C(X)<=0和Ceq(X)=0。如果不存在边界,则设置lb=[]和/或ub=[]。当PopulationType选项设置为'bitString'或'custom'时,不满足非线性约束。有关详细信息,请参见文档。

X = gamultiobj(FITNESSFCN,NVARS,A,b,Aeq,beq,lb,ub,NONLCON,options)使用OPTIONS中的值替换默认优化参数,找到帕累托集X。OPTIONS可以通过OPTIMOPTIONS函数创建。有关详细信息,请参见OPTIMOPTIONS。有关gamultiobj接受的选项列表,请参见文档。

X = gamultiobj(PROBLEM)查找PROBLEM的最小值。PROBLEM是具有以下字段的结构:
fitnessfcn:<Fitness function>
nvars:<Number of design variables>
Aineq:<不等式约束的A矩阵>
bineq:<不等式约束的b向量>
Aeq:<等式约束的Aeq矩阵>
beq:<等式约束的beq向量>
lb:<X的下限>
ub:<X的上限>
nonlcon:<非线性约束函数>
options:<使用optimoptions('gamultiobj',...)创建的选项>
solver:<solver name 'gamultiobj'>
rngstate:<随机数生成器的状态>

[X,FVAL] = gamultiobj(FITNESSFCN,NVARS,...)还返回矩阵FVAL,FITNESSFCN中定义的所有目标函数在X的所有解中的值。FVAL具有numberOfObjectives列,行数与X相同。

[X,FVAL,EXITFLAG] = gamultiobj(FITNESSFCN,NVARS,...)还返回描述gamultiobj的退出条件的EXITFLAG。EXITFLAG的可能值以及相应的退出条件为

1:在options.MaxStallGenerations代内帕累托集的扩展的平均值的值的变化小于options.FunctionTolerance。
0:超过最大代数。
-1:由输出或绘图函数终止优化。
-2:未找到可行点。
-5:超时。

[X,FVAL,EXITFLAG,OUTPUT] = gamultiobj(FITNESSFCN,NVARS,...)还返回带有以下字段的结构OUTPUT:
rngstate:<GA开始前随机数生成器的状态>
generations:<总代数,不包括HybridFcn迭代>
funccount:<函数评估的总数>
maxconstraint:<最大约束违规(如果有)>
message:<gamultiobj终止消息>

[X,FVAL,EXITFLAG,OUTPUT,POPULATION] = gamultiobj(FITNESSFCN,...)在终止时还返回最终POPULATION。

[X,FVAL,EXITFLAG,OUTPUT,POPULATION,SCORE] = gamultiobj(FITNESSFCN,...)在终止时还返回最终POPULATION的SCORE。

3 MATLAB程序实现

3.1 gamultiobj组织结构

        MATLAB自带的基于遗传算法的多目标优化函数gamultiobj的组织结构如图2所示。可以看到,在函数gamultiobj中,先调用函数gacommon确定优化问题的约束类型,然后调用函数gamultiobjsolve对多目标优化问题进行求解。在函数gamultiobjsolve中,先调用函数gamultiobjMakeState产生初始种群,接着判断是否可以退出算法,若退出,则得到Pareto最优解,若不退出,则调用函数stepgamultiobj使种群进化一代,然后调用函数gadsplot进行绘图,并调用函数gmultiobjConverged判断终止条件。可以看到,在以上循环迭代过程中,函数tepgamultiobj是关键函数,下面将对该函数进行讲解

3.2 函数stepgamultiobj分析

1.函数stepgamultiobj结构及图形描述
        函数stepgamultiobj的代码位于:MATLAB安装目录\toolbox\gads\gads\private,其结构如图3所示。

        图4形象地表达了函数stepgamultiobj的过程,其中的大框表示种群,种群被分为若干前端,标有数字的小框表示前端,相应的数字表示该前端的序值,相应的操作及所用的函数与图3一致。
        2.选择(selectiontournament.m)
        不同于函数ga,函数gamultiobj的选择操作只使用锦标赛选择(selectiontournament),程序代码如下:

 

function parents = selectiontournament(expectation,nParents,options,tournamentSize)

if nargin < 4 || isempty(tournamentSize)
    tournamentSize = 4;
end

% Choose the players
playerlist = ceil(size(expectation,1) * rand(nParents,tournamentSize));
% Play tournament
parents = tournament(playerlist,expectation);

function champions = tournament(playerlist,expectation)
%tournament between players based on their expectation

playerSize = size(playerlist,1);
champions = zeros(1,playerSize);
% For each set of players
for i = 1:playerSize
    players = playerlist(i,:);
    % For each tournament
    winner = players(1); % Assume that the first player is the winner
    for j = 2:length(players) % Winner plays against each other consecutively
        score1 = expectation(winner,:);
        score2 = expectation(players(j),:);
        if score2(1) > score1(1) 
            winner = players(j);
        elseif score2(1) == score1(1)
            try % socre(2) may not be present for single objective problems
                if score2(2) > score1(2)
                    winner = players(j);
                end
            catch
            end
        end
    end
    champions(i) = winner;
end
        从以上代码的分析中可以看出,函数gamultiobj的选择操作是基于序值和拥挤距离的,具体地说,对于两个个体,当序值不同时,序值小的个体将被选中而不论其拥挤距离如何,这是因为“如果p支配q,那么p的序值比q的低”;当序值相同时,拥挤距离大的个体将被选中,这是因为拥挤距离越大,种群多样性越好。序值和拥挤距离的赋值在函数stepgamultiobj中通过[-rank,Distance]巧妙地实现。
3.交叉、变异、产生子种群和父子种群合并
        函数gamultiobj默认的交叉函数和变异函数分别为函数crossoverintermediate和函数 mutationadaptfeasible,实现的功能与函数ga是一致的,这里不再展开。需要说明的是,由于函数gamultiobj中使用了支配和排序的思想,其精英是自动保留的,因此,不再具有函数ga中的精英保留操作,父子种群的合并通过函数stepgamultiobj中的以下语句实现:
population=[population;nextPopulation];
4.计算序值和拥挤距离
        函数rankAndDistance依次调用函数nonDominatedRank、函数DistanceMeasureFcn和函数trimPopulation,下面分别介绍。
(1)函数nonDominatedRank
        非支配排序函数nonDominatedRank的作用是对父、子种群合并后的种群中的个体进行排序。非支配排序函数nonDominatedRank的基本思想是:序值rankCounter从1开始,依次加1,在每一轮rankCounter中,依次将种群中未被排序(判断个体是否已被排序的矩阵每轮更新一次)的个体p与其余所有未被排序的个体q进行比较,检查个体q是否支配个体p,若否,则个体p被赋予当前序值rankCounter;反之,因为个体p受个体q支配,故个体p的序值高于当前rankCounter,应参与下一轮的排序。通过排序,种群中的所有个体被分到了不同的前端。接着进行的是前端中的拥挤距离计算。
(2)函数DistanceMeasureFcn
        拥挤距离计算函数DistanceMeasureFcn的作用是计算某一前端内每个个体与其相邻个体的距离,与函数nonDominatedRank计算出的序值一起,为函数selectiontournament的选择提供依据,同时,也为接下来的函数trimPopulation做好准备。默认的拥挤距离计算函数是distancecrowding,
        拥挤距离计算函数DistanceMeasureFcn的基本思想是:对多目标中的每一个目标,分别计算一次相应的拥挤距离,再将这些拥挤距离相加得到最后的拥挤距离。在每个目标对应的拥挤距离的计算中,前端两头的两个个体的拥挤距离为inf,其余个体的拥挤距离为与该个体相邻的前后两个个体在(一1,1)区间映射后的目标函数值之差,这里的相邻是指同一前端中个体间的目标函数值大小接近。显然,某个体的拥挤距离越大,表示该个体与相邻个体的目标函数值差别越大,也就是多样性越好,故在序值相同的条件下,在函数selectiontournament中就越应该被选中,在接下来的函数rimPopulation中就越不会被裁减掉。
(3)函数trimPopulation
        由于父子种群的合并,使得函数rankAndDistance中的popSize为两倍的种群大小(该种群大小在options中设置,稍后述及),而函数rankAndDistance中的nParents即为种群大小,故其中的条件“nParents==popSize”不成立,需要调用函数trimPopulation以修剪种群。种群修剪函数trimPopulation的作用是:在两倍于种群大小的个体中修剪出个数等于种群大小的个体
种群修剪函数trimPopulation的基本思想是:
        ①根据设定的系数ParetoFraction计算第一前端中允许保留的个体数目,按照一定的公式计算其余前端中允许保留的个体数目,则某前端中保留的个体数目为min{允许保留的个体数目,现存的个体数目},也就是说,对于第一前端,所设定的系数ParetoFraction直接决定了该前端中允许保留的个体数目,当允许保留的个体数目小于前端中现存的个体数目时,系数ParetoFraction所决定的允许保留的个体数目对该前端中保留的个体数目有限制作用,对于其他前端,也有类似思想。
        ②某前端中保留的个体数目计算出来以后,剩下的就是执行了,也就是说,将该前端中的个体数目修剪至保留的个体数目,这是通过锦标赛选择实现的。前已述及,对于同一前端,个体的拥挤距离越小,则多样性越差,因此,在锦标赛选择中,就越应该成为失败者而被选中淘汰,这种思想与函数selectiontournament中将expectation赋值为[-rank,Distance]是异曲同工的。另外,个体的去除通过将其赋值为空矩阵巧妙地实现。
        ③通过以上操作后,若保留下来的各前端的个体之和比Options中设置的种群大小多,那么需要进一步修剪,将最终的种群大小精减为Options中设置的种群大小。其中所用的思想与函数selectiontournament的选择思想也是一致的。
        5.函数distanceAndSpread
        该函数的作用是计算种群的平均距离和spread,后者参与图2中函数gamultiobjConverged对终止条件的判断。

3.3使用函数gamultiobj求解多目标优化问题

        (1)使用函数gamultiobj求解多目标优化问题的第一步是编写目标函数的M文件。对于以上问题,函数名为my_first_multi,目标函数代码如下:
function f = my_first_multi(x)
 
f(1) = x(1)^4 - 10*x(1)^2+x(1)*x(2) + x(2)^4 - (x(1)^2)*(x(2)^2);
f(2) = x(2)^4 - (x(1)^2)*(x(2)^2) + x(1)^4 + x(1)*x(2);
        (2)使用命令行方式调用gamultiobj函数,代码如下:
clear
clc
 

fitnessfcn = @my_first_multi;   % Function handle to the fitness function
nvars = 2;                      % Number of decision variables
lb = [-5,-5];                   % Lower bound
ub = [5,5];                     % Upper bound
A = []; b = [];                 % No linear inequality constraints
Aeq = []; beq = [];             % No linear equality constraints
options = gaoptimset('ParetoFraction',0.3,'PopulationSize',100,'Generations',200,'StallGenLimit',200,'TolFun',1e-100,'PlotFcns',@gaplotpareto);

[x,fval] = gamultiobj(fitnessfcn,nvars, A,b,Aeq,beq,lb,ub,options);
       其中,fitnessfcn即(1)中定义的目标函数M文件,设置的最优前端个体系数ParetoFraction为0.3,种群大小PopulationSize为100,最大进化代数Generations为200,停止代数StallGenLimit也为200,适应度函数值偏差TolFun为le-100,绘制Pareto前端。当然,也可以通过GUI方式调用函数gamultiobj,其方法与函数ga的调用相同,这里不再赘述。

3.4 结果分析

        可以看到,在基于遗传算法的多目标优化算法的运行过程中,自动绘制了第一前端中个体的分布情况,且分布随着算法进化一代而更新一次。当迭代停止后,得到如图5所示的第一前端个体分布图。同时,Worksapce中返回了函数gamultiobj得到的Pareto解集x及与x对应的目标函数值,如表1所列。需要说明的是,由于算法的初始种群是随机产生的,因此每次运行的结果不一样。

X1

X2

F1

F2

-0.702604978119867

0.702952585998864

-5.18650007950382

-0.249962526715632

-0.702604978119867

0.702952585998864

-5.18650007950382

-0.249962526715632

-2.67029628249862

1.97094984179847

-38.3329919666111

32.9718303966485

-2.63333082043443

1.96439479904977

-38.2990862211675

31.0452258773312

-2.08276662583749

1.31511944032696

-31.8120240265547

11.5671441504702

-1.15140918299647

0.929595004170188

-12.9690674486452

0.288363618240700

-2.24644109783116

1.74843483243066

-35.0074620102752

15.4575140499734

-2.41514714936595

1.79906399485147

-37.0545025942865

21.2748549366181

-2.38150536923245

1.86154289865626

-36.6275981206039

20.0880801162262

-1.82290570989828

1.23859537968056

-27.1897975855276

6.04005468627002

-1.30683826246950

1.00106276130680

-16.1770194512696

0.901242991273376

-2.51924521816231

1.97762256309168

-37.6944252011462

25.7715394911906

-1.52418626573825

1.14877588640926

-20.9096383290698

2.32179939758130

-1.06426303292729

0.940627721164028

-11.2640394037852

0.0625186287707547

-2.03691502287105

1.46637748311609

-31.5605834251883

9.92964467878934

-1.25902473471341

0.812532300017947

-14.9724017318298

0.879031094371823

-2.54579676153300

1.91445377012727

-38.0010331247212

26.8097783855977

-1.20396912943971

1.11637502706332

-13.9916338566617

0.503782789776543

-2.48983479640961

1.85584414778789

-37.6715458295670

24.3212273045537

-2.20516184528621

1.75854178206263

-34.3335326972675

14.2938549417933

-2.01646480190617

1.57180853250172

-31.2393168080679

9.42198616519718

-2.29454764988585

1.76104970025566

-35.6807426169950

16.9687465589719

-1.45000820746889

1.40337975638453

-18.9015806104910

2.12365740678036

-1.97425293081786

1.31617729318077

-30.1344339638333

8.84231238459566

-1.74540792332427

1.19107078666463

-25.5718188853058

4.89266930272549

-2.67029628249862

1.97094984179847

-38.3329919666111

32.9718303966485

-0.903690328921961

0.874168873899340

-8.32972021598921

-0.163158110118390

-1.00010614649929

0.757833629162209

-10.0042121434185

-0.00208910076199753

-2.16416470915156

1.47815692188379

-33.5583157841867

13.2777730991840

-2.57929181596638

1.94522918966795

-38.1411557075827

28.3863070115286

        从图5可以看到,第一前端的Pareto最优解分布均匀。从表1可以看到,返回的Pareto最优解个数为30个,而种群大小为100,可见,ParetoFraction为0.3的设置发挥了作用。另外,个体被限制在了[-5,5]的上下限范围内。

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

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

相关文章

Web基础 ( 六 ) AJAX

4.6.AJAX 4.6.1.什么是ajax Ajax&#xff08;Asynchronous JavaScript and XML , Asynchronous 异步的&#xff09;指的是一种使用 JavaScript、XML 和 HTTP 请求进行前端数据异步交互的技术。Ajax 不需要刷新整个页面就可以更新其中的一部分&#xff0c;使得网页的反应更快、…

RabbitMQ学习-延迟队列

延迟队列 背&#xff1a;也就是给队列设置个过期时间&#xff0c;然后到时间消息变成死信&#xff0c;消费死信队列中的消息就行&#xff0c;再没什么玩意&#xff0c;演示队列优化就是不给队列这只TTL&#xff0c;再生产者代码中消息里面设置消息TTL&#xff0c;因为 RabbitM…

ElasticSearch——Docker安装ElasticSearch和Kibana

Docker安装ElasticSearch 说明&#xff1a;由于是用docker安装&#xff0c;所以要确保已安装docker并docker环境可用。 docker安装步骤&#xff1a;https://wanli.blog.csdn.net/article/details/121445768 1、Docker安装ElasticSearch 获取指定版本的ES镜像 拉取镜像&#…

Ubuntu安装RabbitMQ server - 在ubuntu+cpolar+rabbitMQ环境下,实现mq服务端远程访问

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 转载自cpolar内网穿透的文章&#xff1a;无公网IP&…

nodejs+vue社区重点人员户籍信息查询系统

为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xff0c;重点人员信息查询就是信息时代变革中的产物之一。 任何系统都要遵循系统设计的基本流程&#xff0c;本系统也不例外&#xff0c;同样需要…

基于SSM的土家风景文化管理平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 前言…

JetBrains的C和C++集成开发环境CLion 2023版本在Win10系统的下载与安装配置教程

目录 前言一、CLion安装二、使用配置总结 前言 CLion是一款为C和C语言开发人员设计的集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地编写、调试和部署C和C应用程序。 CLion的主要特点&#xff1a; ——代码编辑器…

常见开源协议介绍

开源协议是指开放源代码软件的使用、修改和分发的规则。开源协议的出现&#xff0c;使得开发者可以在保护自己的知识产权的同时&#xff0c;也可以让其他人使用、修改和分发自己的代码。本文将介绍几种常见的开源协议。 一、GPL协议 GPL&#xff08;GNU General Public Licens…

哈希表(哈希函数和处理哈希冲突)_20230528

哈希表&#xff08;哈希函数和处理哈希冲突) 前言 关于哈希表的主题的小记原计划5月23日完成&#xff0c;由于本人新冠阳性&#xff0c;身体发烧乏力&#xff0c;周末感觉身体状况稍加恢复&#xff0c;赶紧打开电脑把本文完成&#xff0c;特别秉承“写是为了更好地思考&#…

搜索算法总结

文章目录 搜索算法1. 深度优先搜索&#xff08;Depth-First-Search, DFS&#xff09;2. 广度优先搜索&#xff08;Breadth-first search, BFS&#xff09;3. 启发式搜索策略3.1 爬山法&#xff08;Hill climbing&#xff09;3.2 最佳优先搜索&#xff08;Best-first search&…

【嵌入式环境下linux内核及驱动学习笔记-(13-中断管理)】

目录 1、中断基本概念2、ARM体系中断系统2.1 ARM具有的七种异常模式与中断的关系2.2 ARM多核环境下的中断2.3 exynos4412(contex A9)的中断 3、中断处理程序架构4、 中断接口编程4.1 中断接口函数4.1.1 request_irq4.1.2 free_irq4.1.3 irqreturn_t4.1.4 irq_handler_t 中断处理…

C语言初阶之函数介绍及练习

函数介绍及练习 1.函数是什么&#xff1f;2.C语言中函数的分类&#xff1a;2.1 库函数2.2 自定义函数 3. 函数的参数3.1 实际参数&#xff08;实参&#xff09;&#xff1a;3.2 形式参数&#xff08;形参&#xff09;&#xff1a; 4.函数的调用4.1 传值调用4.2 传址调用 5. 函数…

真相只有一个——谁是凶手

谁是凶手 1.题目描述2. 解题思路3.代码展示 所属专栏&#xff1a;脑筋急转弯❤️ &#x1f680; >博主首页&#xff1a;初阳785❤️ &#x1f680; >代码托管&#xff1a;chuyang785❤️ &#x1f680; >感谢大家的支持&#xff0c;您的点赞和关注是对我最大的支持&am…

漫游计算机系统

1.信息就是位 上下文 那么什么是信息呢&#xff1f; 在计算机系统中&#xff0c;所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据。本质上是一串比特位。 那么又要了解什么是比特了&#xff0c;比特&#xff08;bit)就是二进制&#xff…

基于标准库函数的STM32的freertos的移植(一)——github源码压缩包下载

由于freertos官网将freertos内核与freertos工程分别进行版本管理&#xff0c;因此下载freertos需要将参考工程和内核分别下载。由于采用ST公司提供的标准库函数进行因此还需要下载标准库函数&#xff0c;然后进行移植配置。具体流程如下详细描述&#xff1a; 1.首先在github的…

git Husky

虽然我们已经要求项目使用eslint了&#xff0c;但是不能保证组员提交代码之前都将eslint中的问题解决掉了&#xff1a; 也就是我们希望保证代码仓库中的代码都是符合eslint规范的&#xff1b; 那么我们需要在组员执行 git commit 命令的时候对其进行校验&#xff0c;如果不符合…

centos7安装docker 并创建mysql

Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道。 官方网站上有…

关于强电与弱的的介绍

强电&#xff1f;弱电&#xff1f;傻傻分不清楚&#xff0c;今天海翎光电的小编为大家系统的介绍一下强电与弱电。 什么是强电&#xff1f; &#xff08;1&#xff09;供配电系统&#xff1a;供配电系统包括负荷分级、供电措施、负荷力矩、电网谐波限值、用电指标、负荷所需要…

MySQL数据库修改root账户密码

博主今天登录数据库遇到了一个问题&#xff0c;通过这篇文章&#xff08;http://t.csdn.cn/58ECT&#xff09;解决了。文中关于修改root账户密码的部分&#xff0c;博主觉得有必要写一篇文章总结下。 第一步&#xff1a;用管理员账户打开CMD 第二步&#xff1a;开启mysql服务 …

dubbo源码阅读: dubbo的xml文件如何解析的?

dubbo源码阅读&#xff1a; dubbo的xml文件如何解析的&#xff1f; DubboNamespaceHandlerspring 的接口 NamespaceHandlerspring 的抽象类 NamespaceHandlerSupport学以致用 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns:xsi"http…