MATLAB中遗传算法编程中,二进制编码如何处理实数变量

MATLAB中遗传算法编程中,二进制编码如何处理实数变量,第1张

假如你想要编码为x,设x的范围是min,max,二进制编码长度为10,那二进解码方式是:x(max-min)/1023,这个不用开始编码,开始你可以用rand(n,10)产生n个样本的随机数,然后优化即可。

不是能把“数学模型中的目标函数和每一条约束函数分别编程Matlab里的M文件”,是你用遗传算法就必须要编进去,电脑怎么知道往哪个方向优化是好的,要不把你邮箱留下,我给你发个寻求最大值的遗传算法。

(1)首先计算出所有个体的适应度总和Σfi。

(2)其次计算出每个个体的相对适应度大小fi/Σfi,类似于softmax。

(3)再产生一个0到1之间的随机数,依据随机数出现在上述哪个概率区域内来确定各个个体被选中的次数。

(4)交叉(交配)运算。该步骤是遗传算法中产生新的个体的主要 *** 作过程,它用一定的交配概率阈值(pc,一般是04到099)来控制是否采取单点交叉,多点交叉等方式生成新的交叉个体。

具体步骤如下: (1)先对群体随机配对。(2)再随机设定交叉点的位置。 (3)再互换配对染色体间的部分基因。

(5)变异运算。该步骤是产生新的个体的另一种 *** 作。一般先随机产生变异点,再根据变异概率阈值(pm,一般是00001到01)将变异点的原有基因取反。

有两种方法,一种是用matlab自带的遗传算法工具箱;还有一种是自己编写遗传算法解决问题。第二种方法的话,网上可以找到很多遗传算法的matlab代码,我也可以提供。第一种的话,有一定的局限性。

tsp问题遗传算法将多目标按照线性加权的方式转化为单目标,然后应用传统遗传算法求解

其中w_i表示第i个目标的权重,f_k表示归一化之后的第i个目标值。我们很容易知道,这类方法的关键是怎么设计权重。比如,Random Weight Genetic Algorithm (RWGA) 采用随机权重的方式,每次计算适应度都对所有个体随机地产生不同目标的权重,然后进行选择 *** 作。Vector-Evaluated Genetic Algorithm (VEGA) 也是基于线性加权的多目标遗传算法。如果有K个目标,VEGA 会随机地将种群分为K个同等大小子种群,在不同的子种群按照不同的目标函数设定目标值,然后再进行选择 *** 作。VEGA 实质上是基于线性加权的多目标遗传算法。VEGA 是第一个多目标遗传算法,开启了十几年的研究潮流。

1TSP问题是指假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。本文使用遗传算法解决att30问题,即30个城市的旅行商问题。旅行商问题是一个经典的组合优化问题。一个经典的旅行商问题可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。应如何选择行进路线,以使总的行程最短。从图论的角度来看,该问题实质是在一个带权完全无向图中,找一个权值最小的Hamilton回路。由于该问题的可行解是所有顶点的全排列,随着顶点数的增加,会产生组合爆炸,它是一个NP完全问题。TSP问题可以分为对称和不对称。在对称TSP问题中,两座城市之间来回的距离是相等的,形成一个无向图,而不对称TSP则形成有向图。对称性TSP问题可以将解的数量减少了一半。所以本次实验的TSP问题使用att48数据,可在tsplib中下载数据包。演化算法是一类模拟自然界遗传进化规律的仿生学算法,它不是一个具体的算法,而是一个算法簇。遗传算法是演化算法的一个分支,由于遗传算法的整体搜索策略和优化计算是不依赖梯度信息,所以它的应用比较广泛。我们本次实验同样用到了遗传算法(用MATLAB编写)来解决TSP问题。

function ret=Code(lenchrom,bound)

%本函数将变量编码成染色体,用于随机初始化一个种群

% lenchrom input : 染色体长度

% bound input : 变量的取值范围

% ret output: 染色体的编码值

flag=0;

while flag==0

pick=rand(1,length(lenchrom));

ret=bound(:,1)'+(bound(:,2)-bound(:,1))'pick; %线性插值

flag=test(lenchrom,bound,ret); %检验染色体的可行性

end

function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)

%本函数完成交叉 *** 作

% pcorss input : 交叉概率

% lenchrom input : 染色体的长度

% chrom input : 染色体群

% sizepop input : 种群规模

% ret output : 交叉后的染色体

for i=1:sizepop

% 随机选择两个染色体进行交叉

pick=rand(1,2);

while prod(pick)==0

pick=rand(1,2);

end

index=ceil(picksizepop);

% 交叉概率决定是否进行交叉

pick=rand;

while pick==0

pick=rand;

end

if pick>pcross

continue;

end

flag=0;

while flag==0

% 随机选择交叉位置

pick=rand;

while pick==0

pick=rand;

end

pos=ceil(picksum(lenchrom)); %随机选择进行交叉的位置,即选择第几个变量进行交叉,注意:两个染色体交叉的位置相同

pick=rand; %交叉开始

v1=chrom(index(1),pos);

v2=chrom(index(2),pos);

chrom(index(1),pos)=pickv2+(1-pick)v1;

chrom(index(2),pos)=pickv1+(1-pick)v2; %交叉结束

flag1=test(lenchrom,bound,chrom(index(1),:)); %检验染色体1的可行性

flag2=test(lenchrom,bound,chrom(index(2),:)); %检验染色体2的可行性

if flag1flag2==0

flag=0;

else flag=1;

end %如果两个染色体不是都可行,则重新交叉

end

end

ret=chrom;

clc

clear all

% warning off

%% 遗传算法参数

maxgen=50; %进化代数

sizepop=100; %种群规模

pcross=[06]; %交叉概率

pmutation=[01]; %变异概率

lenchrom=[1 1]; %变量字串长度

bound=[-5 5;-5 5]; %变量范围

%% 个体初始化

individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]); %种群结构体

avgfitness=[]; %种群平均适应度

bestfitness=[]; %种群最佳适应度

bestchrom=[]; %适应度最好染色体

% 初始化种群

for i=1:sizepop

individualschrom(i,:)=Code(lenchrom,bound); %随机产生个体

x=individualschrom(i,:);

individualsfitness(i)= (x(1)exp(-(x(1)^2 + x(2)^2)));

%-20exp(-02sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2pix(1))+cos(2pix(2)))/2)+20+271289

% 这个是我的测试函数

% 如果有这个函数的话,可以得到最优值

end

%找最好的染色体

[bestfitness bestindex]=min(individualsfitness);

bestchrom=individualschrom(bestindex,:); %最好的染色体

avgfitness=sum(individualsfitness)/sizepop; %染色体的平均适应度

% 记录每一代进化中最好的适应度和平均适应度

trace=[];

%% 进化开始

for i=1:maxgen

% 选择 *** 作

individuals=Select(individuals,sizepop);

avgfitness=sum(individualsfitness)/sizepop;

% 交叉 *** 作

individualschrom=Cross(pcross,lenchrom,individualschrom,sizepop,bound);

% 变异 *** 作

individualschrom=Mutation(pmutation,lenchrom,individualschrom,sizepop,[i maxgen],bound);

% 计算适应度

for j=1:sizepop

x=individualschrom(j,:);

individualsfitness(j)=(x(1)exp(-(x(1)^2 + x(2)^2)));

%-20exp(-02sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2pix(1))+cos(2pix(2)))/2)+20+271289

% -20exp(-02sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2pix(1))+cos(2pix(2)))/2)+20+271289;

end

%找到最小和最大适应度的染色体及它们在种群中的位置

[newbestfitness,newbestindex]=min(individualsfitness);

[worestfitness,worestindex]=max(individualsfitness);

% 代替上一次进化中最好的染色体

if bestfitness>newbestfitness

bestfitness=newbestfitness;

bestchrom=individualschrom(newbestindex,:);

end

individualschrom(worestindex,:)=bestchrom;

individualsfitness(worestindex)=bestfitness;

avgfitness=sum(individualsfitness)/sizepop;

trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度

end

%进化结束

%% 结果显示

[r c]=size(trace);

figure

plot([1:r]',trace(:,1),'r-',[1:r]',trace(:,2),'b--');

title(['函数值曲线 ' '终止代数=' num2str(maxgen)],'fontsize',12);

xlabel('进化代数','fontsize',12);ylabel('函数值','fontsize',12);

legend('各代平均值','各代最佳值','fontsize',12);

ylim([-05 5])

disp('函数值 变量');

% 窗口显示

disp([bestfitness x]);

我不会用MATLAB编,会用c#。MATLAB编码步骤应该以下几步:

1、导入n个城市坐标,并把这n个城市编号(1,2,3,4、、、);

2、用城市编号随机生成m个父代(4672、、、;9482、、、);

3、算出每个父代中的城市距离和并记录其值;

4、对每一个父代进行交叉,变异等 *** 作形成子代;

5、算出每个子代中的城市距离和并记录其值;

6、比较父代、子代个体的距离和,留下m个最短的城市距离和对应的个体,若没达到迭代次数,跳到步骤3,若结束,跳到步骤7;

7、显示最优个体(即最短路径的个体)。

以上就是关于MATLAB中遗传算法编程中,二进制编码如何处理实数变量全部的内容,包括:MATLAB中遗传算法编程中,二进制编码如何处理实数变量、用matlab遗传算法分析运动方式、如何用matlab遗传算法编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9275502.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存