%建立m文件create_permutationsm
%------------------------------------------
function pop = create_permutations(NVARS,FitnessFcn,options)
totalPopulationSize = sum(optionsPopulationSize);
n = NVARS;
pop = cell(totalPopulationSize,1);
for i = 1:totalPopulationSize
pop{i} = randperm(n);
end
%------------------------------------------
%crossover_permutationm
function xoverKids = crossover_permutation(parents,options,NVARS,
FitnessFcn,thisScore,thisPopulation)
nKids = length(parents)/2;
xoverKids = cell(nKids,1); % Normally zeros(nKids,NVARS);
index = 1;
for i=1:nKids
% here is where the special knowledge that the population is a cell
% array is used Normally, this would be thisPopulation(parents(index),:);
parent = thisPopulation{parents(index)};
index = index + 2;
% Flip a section of parent1
p1 = ceil((length(parent) -1) rand);
p2 = p1 + ceil((length(parent) - p1- 1) rand);
child = parent;
child(p1:p2) = fliplr(child(p1:p2));
xoverKids{i} = child; % Normally, xoverKids(i,:);
end
%------------------------------------------
%mutate_permutationm
function mutationChildren = mutate_permutation(parents ,options,NVARS,
FitnessFcn, state, thisScore,thisPopulation,mutationRate)
mutationChildren = cell(length(parents),1);% Normally zeros(length(parents),NVARS);
for i=1:length(parents)
parent = thisPopulation{parents(i)}; % Normally thisPopulation(parents(i),:)
p = ceil(length(parent) rand(1,2));
child = parent;
child(p(1)) = parent(p(2));
child(p(2)) = parent(p(1));
mutationChildren{i} = child; % Normally mutationChildren(i,:)
end
%------------------------------------------
%traveling_salesman_fitnessm
function scores = traveling_salesman_fitness(x,distances)
scores = zeros(size(x,1),1);
for j = 1:size(x,1)
% here is where the special knowledge that the population is a cell
% array is used Normally, this would be pop(j,:);
p = x{j};
f = distances(p(end),p(1));
for i = 2:length(p)
f = f + distances(p(i-1),p(i));
end
scores(j) = f;
end
%------------------------------------------
%画图的traveling_salesman_plotm
function state = traveling_salesman_plot(options,state,flag,locations)
[unused,i] = min(stateScore);
genotype = statePopulation{i};
plot(locations(:,1),locations(:,2),'ro');
hold on
plot(locations(genotype,1),locations(genotype,2));
hold off
%------------------------------------------
%正文
x=[128;184;154;189;155;39;106;86;125;138];
y=[85;34;166;152;116;106;76;84;21;52];
locations=[x y];
distances = zeros(cities);
for count1=1:cities,
for count2=1:count1,
x1 = locations(count1,1);
y1 = locations(count1,2);
x2 = locations(count2,1);
y2 = locations(count2,2);
distances(count1,count2)=sqrt((x1-x2)^2+(y1-y2)^2);
distances(count2,count1)=distances(count1,count2);
end;
end;
FitnessFcn = @(x) traveling_salesman_fitness(x,distances);
my_plot = @(options,state,flag) traveling_salesman_plot(options,
state,flag,locations);
options = gaoptimset('PopulationType', 'custom','PopInitRange',
[1;cities]);
options = gaoptimset(options,'CreationFcn',@create_permutations,
'CrossoverFcn',@crossover_permutation,
'MutationFcn',@mutate_permutation,
'PlotFcn', my_plot,
'Generations',500,'PopulationSize',60,
'StallGenLimit',200,'Vectorized','on');
numberOfVariables = cities;
[x,fval,reason,output] = ga(FitnessFcn,numberOfVariables,options)
%-----------------------------------------
最后结果
次序9 2 5 4 3 6 8 7 1 10
总距离529619
不知那货运量是干啥的?提出要求还可以改进
matlab自带的有
遗传算法
工具箱,也就是两个函数,分别是
x
=
ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon,options)options
=
gaoptimset('param1',value1,'param2',value2,)在
帮助文件
(doc
ga/gaoptimset)里面自己好还看看它的用法就可以了,每一个参数都有详细的说明,应该可以帮助到你。
把下面的(1)-(7)依次存成相应的m文件,在(7)的m文件下运行就可以了
(1) 适应度函数fitm
function fitness=fit(len,m,maxlen,minlen)
fitness=len;
for i=1:length(len)
fitness(i,1)=(1-(len(i,1)-minlen)/(maxlen-minlen+00001))^m;
end
(2)个体距离计算函数 mylengthm
function len=myLength(D,p)
[N,NN]=size(D);
len=D(p(1,N),p(1,1));
for i=1:(N-1)
len=len+D(p(1,i),p(1,i+1));
end
end
(3)交叉 *** 作函数 crossm
function [A,B]=cross(A,B)
L=length(A);
if L<10
W=L;
elseif ((L/10)-floor(L/10))>=rand&&L>10
W=ceil(L/10)+8;
else
W=floor(L/10)+8;
end
p=unidrnd(L-W+1);
fprintf('p=%d ',p);
for i=1:W
x=find(A==B(1,p+i-1));
y=find(B==A(1,p+i-1));
[A(1,p+i-1),B(1,p+i-1)]=exchange(A(1,p+i-1),B(1,p+i-1));
[A(1,x),B(1,y)]=exchange(A(1,x),B(1,y));
end
end
(4)对调函数 exchangem
function [x,y]=exchange(x,y)
temp=x;
x=y;
y=temp;
end
(5)变异函数 Mutationm
function a=Mutation(A)
index1=0;index2=0;
nnper=randperm(size(A,2));
index1=nnper(1);
index2=nnper(2);
%fprintf('index1=%d ',index1);
%fprintf('index2=%d ',index2);
temp=0;
temp=A(index1);
A(index1)=A(index2);
A(index2)=temp;
a=A;
end
(6)连点画图函数 plot_routem
function plot_route(a,R)
scatter(a(:,1),a(:,2),'rx');
hold on;
plot([a(R(1),1),a(R(length(R)),1)],[a(R(1),2),a(R(length(R)),2)]);
hold on;
for i=2:length(R)
x0=a(R(i-1),1);
y0=a(R(i-1),2);
x1=a(R(i),1);
y1=a(R(i),2);
xx=[x0,x1];
yy=[y0,y1];
plot(xx,yy);
hold on;
end
end
(7)主函数
clear;
clc;
%%%%%%%%%%%%%%%输入参数%%%%%%%%
N=50; %%城市的个数
M=100; %%种群的个数
C=100; %%迭代次数
C_old=C;
m=2; %%适应值归一化淘汰加速指数
Pc=04; %%交叉概率
Pmutation=02; %%变异概率
%%生成城市的坐标
pos=randn(N,2);
%%生成城市之间距离矩阵
D=zeros(N,N);
for i=1:N
for j=i+1:N
dis=(pos(i,1)-pos(j,1))^2+(pos(i,2)-pos(j,2))^2;
D(i,j)=dis^(05);
D(j,i)=D(i,j);
end
end
%%如果城市之间的距离矩阵已知,可以在下面赋值给D,否则就随机生成
%%生成初始群体
popm=zeros(M,N);
for i=1:M
popm(i,:)=randperm(N);
end
%%随机选择一个种群
R=popm(1,:);
figure(1);
scatter(pos(:,1),pos(:,2),'rx');
axis([-3 3 -3 3]);
figure(2);
plot_route(pos,R); %%画出种群各城市之间的连线
axis([-3 3 -3 3]);
%%初始化种群及其适应函数
fitness=zeros(M,1);
len=zeros(M,1);
for i=1:M
len(i,1)=myLength(D,popm(i,:));
end
maxlen=max(len);
minlen=min(len);
fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);
R=popm(rr(1,1),:);
for i=1:N
fprintf('%d ',R(i));
end
fprintf('\n');
fitness=fitness/sum(fitness);
distance_min=zeros(C+1,1); %%各次迭代的最小的种群的距离
while C>=0
fprintf('迭代第%d次\n',C);
%%选择 *** 作
nn=0;
for i=1:size(popm,1)
len_1(i,1)=myLength(D,popm(i,:));
jc=rand03;
for j=1:size(popm,1)
if fitness(j,1)>=jc
nn=nn+1;
popm_sel(nn,:)=popm(j,:);
break;
end
end
end
%%每次选择都保存最优的种群
popm_sel=popm_sel(1:nn,:);
[len_m len_index]=min(len_1);
popm_sel=[popm_sel;popm(len_index,:)];
%%交叉 *** 作
nnper=randperm(nn);
A=popm_sel(nnper(1),:);
B=popm_sel(nnper(2),:);
for i=1:nnPc
[A,B]=cross(A,B);
popm_sel(nnper(1),:)=A;
popm_sel(nnper(2),:)=B;
end
%%变异 *** 作
for i=1:nn
pick=rand;
while pick==0
pick=rand;
end
if pick<=Pmutation
popm_sel(i,:)=Mutation(popm_sel(i,:));
end
end
%%求适应度函数
NN=size(popm_sel,1);
len=zeros(NN,1);
for i=1:NN
len(i,1)=myLength(D,popm_sel(i,:));
end
maxlen=max(len);
minlen=min(len);
distance_min(C+1,1)=minlen;
fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);
fprintf('minlen=%d\n',minlen);
R=popm_sel(rr(1,1),:);
for i=1:N
fprintf('%d ',R(i));
end
fprintf('\n');
popm=[];
popm=popm_sel;
C=C-1;
%pause(1);
end
figure(3)
plot_route(pos,R);
axis([-3 3 -3 3]);
摘 要本文借鉴了面向分组的调度算法的优点,深入分析了遗传算法中编码串各个位的权重特点及个体的模式规律,对传统遗传算法进行了改进,新的算法具有面向分组、有针对性、同时又能够借助优良个体特征模式进行变异的特征,所以能够自适应地、并且有方向性地进行变异,从而增加了种群的多样性、提高了收敛速度。通过在本文后面的对比实验,证明了当标准遗传算法(GA)调度算法与改进遗传算法(MGA)同时应用在相同(资源数和任务数相同)的网格调度系统中时,后者使网格调度的总体响应时间有了明显的减少;并且当调度的规模增大时,具有更好的性能。
关键词网格调度;遗传算法;GridSim;GridBroker;仿真
1网格资源调度简介
在网格系统中,调度是其重要的组成部分,它要根据任务信息采用适当的策略把不同的任务分配到相应的资源结点上去运行。由于网格系统的异构性和动态性,以及运行于网格系统之中的应用程序对于资源的不同需求,使得资源调度变得极其复杂[1][2]。
一般的网格资源调度问题已被证明是一个NP完全问题[3][4],因此引起了更多学者的关注,成为目前网格计算研究领域中的一个焦点[5]。
11 网格调度数学模型
该数学模型定义调度算法的主要术语,不假设不支持抢先调度。并且该模型是针对已经分解的应用,即假设应用已经分解成N个任务,这些任务之间的关系分为两种情况,即有依赖和没有依赖。为说明问题,本文只讨论简单的无依赖的情况,数学模型假设所有的机器都是调度器可以控制的,多个任务不能在同一个计算节点之上并发执行。
(1)自治域中存在着多个市场,每个市场可以看作是一个虚拟组织。借助文献[6]中的面向分组的思想,将多个任务相似的任务归类到相同的分组。
(2)自治域内网格节点间通信延迟较小;在本文中的一个创新想法的出处来自于文献[6]的面向粗粒度的调度算法,在面向粗粒度的调度中,运用了一种分组调度策略,将相似作业进行分组,再将分组提交到合适的运算资源。在建立模型的时候,在此思想的基础之上,引入分组的思想,有效地把遗传算法和分组(分区)结合起来,经本文后面部分的模拟实验验证,是一种有效可行的方法。
(3)网格自治域中的节点数维持在一个恒定的水平上;
由以上分析,抽象出如数学公式12所示:
公式12
12 抽象调度数学模型
h≥0 //任务j的需求量要大于0;
以上式中,N为一个市场(虚拟组织)中计算资源的个数;M为任务的个数;变量i用于指示网格计算资源;变量j用于指示任务;变量k用于指示评价指标;为任务j到计算资源i的单位运输成本;为任务j的需求量;为第k项因素在选择模型中的影响权重,在本文中它是由专家意见以及经验预测等获得的权重值;为整数变量,当=1时,表示第i个计算资源被选中,反之当=0时,表示未被选中。
2基于MGA的网格资源调度
21 改进遗传算法(MGA)
本文在深入研究了基于传统遗传算法后[7],提出了一种面向分组的,并且基于优良个体特征方向来变异的变异算子。这样,可以改进传统遗传算法的一些缺陷,使其能够有目的地、自适应地、有方向地进行变异,以此增加种群的多样性并提高其收敛速度。
211 理论来源
在“模式定理”及“积木块假设”基础上,本文认为每一个个体之所以能够保持其优良与否的地位,原因就是其模式中具有一些一定的特征,对一般的二进制和级连交叉二进制编码来说,码的前面部分的变动使该个体在解空间内移动的范围(距离)比较大,而后面部分段却恰恰相反,它们只能使得个体的解空间在该个体附近稍作变动。
比如:在1011中,从左至右阶码分别为8,4,2,1,所以如果最左边的1变为0的时候,解空间的变化幅度就是8。而同是从1变为0,在最右边的1所能引起的解空间变化幅度是1。
所以,可以先找出一定的优良个体,然后从这些优良个体中提取一些特征模式,建立起来小环境,接下来让这些优良个体通过小(范围)区间的变异寻优,对于那些劣质个体,就需要借鉴优良个体的特征模式从而来进行较大区间的变异。实现有目的、带权重的变异。
212 总体思路
若有两个染色体:
A=()
B=()
=()
则分段海明距(Segment-Hamming):
只取染色体部分编码来计算两个体的海明距离。对种群进行交叉 *** 作后,从中选取一定数量的优良个体建立小环境。
通过上面的分析,可以看出,前段的编码对个体影响相对较大,因此,取前面一部分的编码用来计算两个体的分段海明距离。用这种方式来比较两个体是否在同一个小环境中,若有两个个体分段海明距离为零,则认为这样的个体是在同一小环境中,则只取其中一个作为这个小环境的代表。通过对种群中提出一定数量的这样的优良个体,能够建立起若干个小环境。对于这些小环境,在每个局部范围内进行变异搜索,采用后段编码进行穷举变异,找到每个小环境局部的最优(当然全局最优可能在其中)。
具体方法如下;如编码长为12位,若为111111111010,取分段海明距离为8(指前段,即加了下画线的那一段不作变异),那么后面的4位码长可能就有24个个体,即从0000到1111,我们穷举这些个体(111111110000~111111111111)计算每一个的适应度,找出它们中的最优。
●适应度函数
本文模型是一个求最大值问题,为此建立如下适应度函数:
公式212适应度函数公式
其中,是网格调度的数学模型公式,其形式见12节。是是到当前所有代的最小值,且随着代数变化。
22 资源调度实现过程
由上节中的数学模型知:设参与调度的任务集合为S,S={S[0],S[1],…S[N-1]},其中N为任务的总数,参与调度的异构机器集合为H,H={H[0],H[1],…H[M-1]},其中M为机器的数量。如果我们以调度长度为优化性能指标,则任务分配与调度的目标是将这N个计算机任务分配给这M个资源并安排好它们的执行顺序,使整个任务的完成时间最短。
% 主程序
%遗传算法主程序
%Name:genmainm
%author:杨幂
clear
clf
%%初始化
popsize=50; %群体大小
chromlength=30; %字符串长度(个体长度)
pc=06; %交叉概率
pm=01; %变异概率
pop=initpop(popsize,chromlength); %随机产生初始群体
%%开始迭代
for i=1:20 %20为迭代次数
[objvalue]=calobjvalue(pop); %计算目标函数
fitvalue=calfitvalue(objvalue); %计算群体中每个个体的适应度
[newpop]=selection(pop,fitvalue); %复制
[newpop]=crossover(pop,pc); %交叉
[newpop]=mutation(pop,pm); %变异
[bestindividual,bestfit]=best(pop,fitvalue); %求出群体中适应值最大的个体及其适应值
y(i)=max(bestfit);%储存最优个体适应值
n(i)=i;
pop5=bestindividual;%储存最优个体
%解码
x1(i)=decodechrom(pop5,1,chromlength/2)2/32767;
x2(i)=10+decodechrom(pop5,chromlength/2+1,chromlength/2)10/32767;
pop=newpop;%将新产生的种群作为当前种群
end
%%绘图
figure(1)%最优点变化趋势图
i=1:20;
plot(y(i),'-r')
xlabel('迭代次数');
ylabel('最优个体适应值');
title('最优点变化趋势');
legend('最优点');
grid on
figure(2)%最优点分布图
[X1,X2]=meshgrid(0:01:2,10:01:20);
Z=X1^2+X2^2;
mesh(X1,X2,Z);
xlabel('自变量x1'),ylabel('自变量x2'),zlabel('函数值f(x1,x2)');
hold on
plot3(x1,x2,y,'ro','MarkerEdgeColor','r','MarkerFaceColor','r','MarkerSize',5)
title('最优点分布');
legend('最优点');
hold off
[z index]=max(y); %计算最大值及其位置
x5=[x1(index),x2(index)]%计算最大值对应的x值
z
新建一个函数
baidu_fm
function
f=baidu_f(x)
f=05-((sin(sqrt(x(1)^2+x(2)^2)))^2-05)/(1+0001(x(1)^2+x(2)^2)^2)
然后用fmins函数寻找极值。
x
=
fmins('baidu_f',
[0
0],
[2
2]);
另外你的语句中有错,少写了一个括号,你再自己检查一下。
以上就是关于怎样用matlab 遗传算法 计算出来的 请资深人士帮忙写一下程序。这是怎么出来的全部的内容,包括:怎样用matlab 遗传算法 计算出来的 请资深人士帮忙写一下程序。这是怎么出来的、电力系统调度遗传算法matlab程序、遗传算法求解tsp问题的matlab程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)