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

2023-11-06

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]的上下限范围内。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于遗传算法的多目标优化算法(matlab实现) 的相关文章

  • 数学建模之灰色关联分析(GRA)

    本文参考的是司守奎 孙兆亮主编的数学建模算法与应用 第二版 灰色关联分析不仅能够用做关联分析 也能够用于评价 其具体分析步骤如下 第一步 需要确定评价对象和参考数列 评价对象一般指的就是待分析的各个特征组 例如需要评价一个同学的成绩 那么他
  • 2020年深圳杯C题

    C题 无线可充电传感器网络充电路线规划 摘要 物联网的快速发展带动了无线传感器网络WSN在生活中的广泛运用 无线传感器网络中包括若干传感器以及一个数据中心 这些传感器的电池均需要移动充电器提供能量来维持正常的工作 移动充电器的能量一方面用于
  • 华为杯数学建模(准备)<2018 - 2022>

    前言 这里简单总结一些资料 为后期个人参赛做准备 其中的优秀案例皆以博客 链接的形式总结归纳 详细见对应原作者博客 基础知识 一些需要提前掌握的算法 1 时间序列算法 拟合插值算法 基础的图论算法 2 多元线性回归 3 整数规划 线性规划
  • k-Means——经典聚类算法实验(Matlab实现)

    聚类算法 k Means实验 k 平均 k Means 也被称为k 均值 是一种得到最广泛使用的聚类算法 1 k Means算法以k为参数 把n个对象分为k个簇 使得簇内具有较高的相似度 实验目的 了解常用聚类算法及其优缺点 掌握k Mea
  • 2023高教社杯全国大学生数学建模竞赛C题思路模型代码

    2023高教社杯全国大学生数学建模竞赛C题思路模型代码 一 国赛常用的模型算法 1 蒙特卡罗算法 该算法又称随机性模拟算法 是通过计算机仿真来解决问题的算法 同时可以通过模拟可以来检验自己模型的正确性 比较好用的算法 2 数据拟合 参数估计
  • 数学建模(三)—— 自动化车床管理

    一 题目要求 二 相关的基础知识 2 1 正态分布的假设检验 2 2 正态分布的概率 三 问题分析 四 模型的建立与求解 4 1 数据处理及分析 4 2 问题一模型的建立与求解 4 2 1 问题一模型的建立 4 2 2 问题一模型的求解 4
  • 【模型融合】集成学习(boosting, bagging, stacking)原理介绍、python代码实现(sklearn)、分类回归任务实战

    文章目录 概览 boosting bagging Stacking 投票 平均 Stack 代码实现 1 分类 1 0 数据集介绍 1 1 boosting 1 2 bagging 1 3 stacking 2 回归 2 0 数据集介绍 s
  • 设置背景图片不平铺

    图片路径 background image url static demo jpg 不平铺 background repeat no repeat 居中显示 background position center 拉伸占满整个容器 backg
  • 使用扩展卡尔曼滤波(EKF)融合激光雷达和雷达数据(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 大多数自动驾驶汽车都配备了激光雷达和雷达
  • 5秒之后自动跳转页面

  • 数学建模的LINGO基础

    LINGO是Linear Interactive and General Optimizer的缩写 即 交互式的线性和通用优化求解器 由美国LINDO系统公司 Lindo System Inc 推出的 可以用于求解非线性规划 也可以用于一些
  • 数学建模的六个步骤

    一 模型准备 了解问题的实际背景 明确其实际意义 掌握对象的各种信息 以数学思路来解释问题的精髓 数学思路贯彻问题的全过程 进而用数学语言来描述问题 要求符合数学理论 符合数学习惯 清晰准确 理解实际问题后 搜集资料 快速阅读和理解参考文献
  • chatgpt赋能python:Python写一个抽奖程序:从随机数生成到实现

    Python写一个抽奖程序 从随机数生成到实现 Python是当今最热门的编程语言之一 无论是开发网站 进行数据分析 实现机器学习 还是进行游戏开发 Python都可以胜任 在本文中 我们将介绍如何使用Python编写一个简单的抽奖程序 程
  • 数学专题-算法-矩阵-拟合

    Author Mikeliu 2020 Date 2020 03 08 10 32 13 LastEditTime 2020 03 12 09 26 47 LastEditors Mikeliu 2020 Description usr b
  • 【数学建模】线性规划模型基本原理与案例分享

    1 1 线性规划问题 在人们的生产实践中 经常会遇到如何利用现有资源来安排生产 以取得最大经济效益的问题 此类问题构成了运筹学的一个重要分支 数学规划 而线性规划 Linear Programming 简记LP 则是数学规划的一个重要分支
  • 2020美赛A题解题方法

    题目 问题A 向北移动 全球海洋温度影响某些海洋生物的栖息地质量 当温度变化太大 它们无法继续繁荣时 这些物种就会迁移到其他更适合它们现在和未来生活和繁殖成功的栖息地 其中一个例子就是美国缅因州的龙虾种群 它们正缓慢地向北迁移到加拿大 那里
  • 数模培训第二周——图论模型

    图论中最短路算法与程序实现 图论中的最短路问题 包括无向图和有向图 是一个基本且常见的问题 主要的算法有Dijkstra算法和Floyd算法 Floyd算法 简介 Floyd Warshall算法 英语 Floyd Warshall alg
  • 2023年小美赛认证杯D题:望远镜的微光因子(The Twilight Factor of a Telescope)思路模型代码解析

    2023年小美赛认证杯D题 望远镜的微光因子 The Twilight Factor of a Telescope 请电脑打开本文链接 扫描下方名片中二维码 获取更多资料 一 问题重述 当我们使用普通的光学望远镜在昏暗的光线中观察远处的目标
  • 2018年第七届数学建模国际赛小美赛C题共享单车对城市交通的影响解题全过程文档及程序

    2018年第七届数学建模国际赛小美赛 C题 共享单车对城市交通的影响 原题再现 共享自行车改变了许多城市的交通状况 许多大城市引入共享自行车来解决交通问题 我们需要定量评估共享自行车对城市交通的影响 以及相关的经济 社会和环境影响 解决这一
  • 2024年华数杯国际赛A题:放射性废水处理建模 思路模型代码解析

    2024年华数杯国际赛A题 放射性废水处理建模 Radioactive Wastewater from Japan 一 问题描述 2011年3月 日本东海岸发生了地震 引发了福岛第一核电站事故 导致三个核反应堆熔毁 并在一场巨大海啸中冲毁了

随机推荐

  • nanomsg(3): push/pull 模式

    推拉之间构建起数据的双向交互 值得注意的是 先推再拉 和先拉再推 并没有启动的先后顺序 pull cpp include
  • Linux搭建部署JDK1.7环境

    jdk下载 官网链接 https www oracle com java technologies javase javase7 archive downloads html jdk 7u80 oth JPR 打开linux系统的终端 在l
  • python题目58:工厂流水线调度

    一个工厂有m条流水线 来并行完成n个独立的作业 该工厂设置了一个调度系统 在安排作业时 总是优先执行处理时间最短的作业 现给定流水线个数m 需要完成的作业数n 每个作业的处理时间分别为 t1 t2 tn 请你编程计算处理完所有作业的耗时为多
  • Docker+NETCore系列文章(四、镜像commit操作)

    文章目录 镜像commit操作 一 Docker安装Tomcat 二 镜像commit操作 1 命令解析 2 实操 赞赏 镜像commit操作 一 Docker安装Tomcat 1 官方使用方法 用完容器就删除 docker run it
  • AD画PCB板子 基本步骤

    软件环境 Altium Designer13 汉化版 plus 大二上的电子工艺实习 第一次画pcb板子 在大佬的耐心指导下 反复倒腾这个软件 把步骤整理下 help其它新手 一 画原理图步骤 Schdoc文件 1 新建工程 点击左上角 2
  • Kettle入门(六)

    资源库 数据库资源库 数据库资源库是将作业和转换相关的信息存储在数据库中 执行的时候直接去数据库读取信息 便于跨平台使用 操作步骤 1 点击右上角 connect 选择 Other Resporitory 2 选择 Database Rep
  • dom影像图形成数字地形图_基于MapMatrix的数字正射影像图制作

    施卫东 周小扬 摘 要本论文基于武汉航天远景科技股份有限公司的新型数字摄影测量系统MapMatrix 结合武汉商学院三维数字校园生产实践进行1 2000数字正射影像图制作 探讨数字正射影像图 DOM 的制作方法 并说明了MapMatrix相
  • 关于md文件插入视频链接的方法。(亲测可用)

    md文件中插入了HTML5的代码 如下
  • 【计算机基础知识9】前端设计模式与常见类型

    目录 一 前言 二 设计模式的基本概念和原则 三 创建型设计模式 四 结构型设计模式 五 行为型设计模式 六 MVC和MVVM框架中的设计模式 七 实际应用案例分析 一 前言 在软件开发领域 设计模式是一种解决常见问题的最佳实践 它可以帮助
  • Sqlalchemy join连表查询

    摘要1 https blog csdn net weixin 33804582 article details 92471702 摘要2 https www cnblogs com juandx p 5442752 html 摘要3 htt
  • RFID服装管理系统改善零售供应链

    随着时尚零售业的竞争日益激烈 RFID技术正快速地改变着服装管理的方式 我们将探讨RFID服装管理系统的核心优点 以及如何在零售供应链中充分利用它 首先 让我们了解一下RFID技术是什么 RFID是一种无线通信技术 通过使用RFID标签和R
  • 人机博弈-吃子棋游戏(二)算气

    算法过程如下 输入计算棋气的起始子 检查我方棋子其周边的空白 并查看此空白是否已经计算过气了 如果没有计算过气加一 如果已经计算则略过 进而递归调用计算我方棋子上下左右子的气 最后算法会返回棋串的子数和气数 算法注释十分详尽 这个计算棋子气
  • linux中Shell历史命令记录文件的路径是什么

    Bash shell在 bash history 表示用户目录 文件中保存了500条使用过的命令 这样能使你输入使用过的长命令变得容易 每个在系统中拥有账号的用户在他的目录下都有一个 bash history 文件 bash shell应该
  • shell变量的设置规则

    1 变量设置规则 2 变量赋值与运算 1 变量赋值 name lbg 等号前后不能有空格 name Lebron James 变量值中有空格要用双引号 echo n a m e 用 name
  • PT100热敏电阻原理解析

    什么是PT100 PT100电阻是指铂热电阻 其中PT是指 铂 元素 100是指铂热电阻的特性在0 时 电阻值刚好是100 所以通常称它为PT100热电阻或铂电阻 PT100是中低温区最常用的一种温度检测元件 其导体的电阻值随温度的增加而成
  • 嵌入式Linux驱动开发(I2C专题)(一)

    一 I2C协议 1 1 硬件连接 I2C在硬件上的接法如下所示 主控芯片引出两条线SCL SDA线 在一条I2C总线上可以接很多I2C设备 1 2 IIC传输数据的格式 1 2 1 写操作 流程如下 主芯片要发出一个start信号 然后发出
  • android studio报错Out of memory: GC overhead limit exceeded. Please fix the project‘s Gradle settings

    项目场景 提示 这里简述项目相关背景 例如 项目场景 从gitee上克隆下来的项目从android studio中打开 问题描述 提示 这里描述项目中遇到的问题 例如 数据传输过程中数据不时出现丢失的情况 偶尔会丢失一部分数据 APP 中接
  • scratch关于克隆停止的问题

    克隆这个代码在scratch中用处挺大的 但是在用的过程中也会出现一些问题 比如说克隆在到达一定数量之后会停止继续克隆 这是由于克隆是有个数限制的 昨天测了一下克隆体的个数限制是300个左右 如何去测 就是当作为克隆体启动时 用一个初始化为
  • word 安装

    目录 概述 word 安装 1 下载安装 2 解压运行 3 卸载移除 4 安装部署 5 激活 亲测可用 记录一下 概述 Office Tool Plus 是一个强大的 Office 部署工具 可以很方便地部署 Office 它基于 Offi
  • 基于遗传算法的多目标优化算法(matlab实现)

    1 理论基础 1 1 多目标优化及Pareto最优解 多目标优化问题可以描述如下 其中 f x 为待优化的目标函数 x为待优化的变量 Ib和ub分别为变量x的下限和上限约束 Aeq x beq为变量x的线性等式约束 A x b为变量x的线性