1 简介
遗传算法(GeneticAlgorithm,GA)是一种受人工生命启发,模拟生物进化过程的随机搜索算法。遗传算法的理论及应用的研究受到广大研究者们的重视,应用领域也得到了广泛推广。遗传算法在求解函数优化问题时,算法中的控制参数交叉概率Pc和变异概率Pm取值的选择对遗传算法的性能影响很大,目前,普遍接受的Pc和Pm取值范围分别是0.4~0.99和0.0001~0.1,这两个取值范围的合理性以及科学性缺乏有效研究。为此,本文针对一类能够展开成幂级数的函数,通过大量实验,以遗传算法在求得全局最优解时所需的迭代次数最少为目标,用实验验证和数据分析的方法对Pc和Pm的取值范围进行了系统的研究,得出结论如下: (1)通过对大量实验数据的分析,以遗传算法在求得全局最优解时所需的迭代次数最少为目标,本文得出Pc的建议取值区间为[0.6,0.99], Pm的建议取值区间为[0.009,0.03]; (2)通过实验数据,对Pc和Pm的交叉影响进行了分析,当Pc在本文建议的区间中取值时,Pm对遗传算法在求得全局最优解时所需的迭代次数有显著影响,然而当Pm在本文建议的区间中取值时,Pc对遗传算法在求得全局最优解时所需的迭代次数的影响不显著; (3)当变异概率Pm在本文建议的区间内取值时,GA取得全局最优解所需的计算量比在普遍接受的区间内取值时所需的计算量节约了3倍以上;比在本文建议区间之外但又在普遍接受的区间内取值时所需的计算量节约了4倍以上。 粒子群优化算法(PSO)是一种原理简单,操作易实现的优化算法。算法一经提出受到国内外学者的广泛关注,目前已存在各种改进的粒子群算法,针对于粒子群优化算法的收敛速度快、解具有记忆功能但全局搜索能力较遗传算法差等特点,本文提出一种新的粒子群遗传混合算法,结合了两种算法各自的优点,扬长避短。利用本文提出的粒子群遗传混合算法对常用的标准测试函数进行了函数优化问题求解,并且与单独的粒子群算法和遗传算法进行了对比实验,实验结果验证了本文提出的新的混合算法的有效性。
2 部分代码
function [y, or1, or2, dmse] = predictor(x, dmodel)
%PREDICTOR Predictor for y(x) using the given DACE model.
%
% Call: y = predictor(x, dmodel)
% [y, or] = predictor(x, dmodel)
% [y, dy, mse] = predictor(x, dmodel)
% [y, dy, mse, dmse] = predictor(x, dmodel)
%
% Input
% x : trial design sites with n dimensions.
% For mx trial sites x:
% If mx = 1, then both a row and a column vector is accepted,
% otherwise, x must be an mx*n matrix with the sites stored
% rowwise.
% dmodel : Struct with DACE model; see DACEFIT
%
% Output
% y : predicted response at x.
% or : If mx = 1, then or = gradient vector/Jacobian matrix of predictor
% otherwise, or is an vector with mx rows containing the estimated
% mean squared error of the predictor
% Three or four results are allowed only when mx = 1,
% dy : Gradient of predictor; column vector with n elements
% mse : Estimated mean squared error of the predictor;
% dmse : Gradient vector/Jacobian matrix of mse
% hbn@imm.dtu.dk
% Last update August 26, 2002
or1 = NaN; or2 = NaN; dmse = NaN; % Default return values
if isnan(dmodel.beta)
y = NaN;
error('DMODEL has not been found')
end
[m n] = size(dmodel.S); % number of design sites and number of dimensions
sx = size(x); % number of trial sites and their dimension
if min(sx) == 1 & n > 1 % Single trial point
nx = max(sx);
if nx == n
mx = 1; x = x(:).';
end
else
mx = sx(1); nx = sx(2);
end
if nx ~= n
error(sprintf('Dimension of trial sites should be %d',n))
end
% Normalize trial sites
x = (x - repmat(dmodel.Ssc(1,:),mx,1)) ./ repmat(dmodel.Ssc(2,:),mx,1);
q = size(dmodel.Ysc,2); % number of response functions
y = zeros(mx,q); % initialize result
if mx == 1 % one site only
dx = repmat(x,m,1) - dmodel.S; % distances to design sites
if nargout > 1 % gradient/Jacobian wanted
[f df] = feval(dmodel.regr, x);
[r dr] = feval(dmodel.corr, dmodel.theta, dx);
% Scaled Jacobian
dy = (df * dmodel.beta).' + dmodel.gamma * dr;
% Unscaled Jacobian
or1 = dy .* repmat(dmodel.Ysc(2, :)', 1, nx) ./ repmat(dmodel.Ssc(2,:), q, 1);
if q == 1
% Gradient as a column vector
or1 = or1';
end
if nargout > 2 % MSE wanted
rt = dmodel.C \ r;
u = dmodel.Ft.' * rt - f.';
v = dmodel.G \ u;
or2 = repmat(dmodel.sigma2,mx,1) .* repmat((1 + sum(v.^2) - sum(rt.^2))',1,q);
if nargout > 3 % gradient/Jacobian of MSE wanted
% Scaled gradient as a row vector
Gv = dmodel.G' \ v;
g = (dmodel.Ft * Gv - rt)' * (dmodel.C \ dr) - (df * Gv)';
% Unscaled Jacobian
dmse = repmat(2 * dmodel.sigma2',1,nx) .* repmat(g ./ dmodel.Ssc(2,:),q,1);
if q == 1
% Gradient as a column vector
dmse = dmse';
end
end
end
else % predictor only
f = feval(dmodel.regr, x);
r = feval(dmodel.corr, dmodel.theta, dx);
end
% Scaled predictor
sy = f * dmodel.beta + (dmodel.gamma*r).';
% Predictor
y = (dmodel.Ysc(1,:) + dmodel.Ysc(2,:) .* sy)';
else % several trial sites
% Get distances to design sites
dx = zeros(mx*m,n); kk = 1:m;
for k = 1 : mx
dx(kk,:) = repmat(x(k,:),m,1) - dmodel.S;
kk = kk + m;
end
% Get regression function and correlation
f = feval(dmodel.regr, x);
r = feval(dmodel.corr, dmodel.theta, dx);
r = reshape(r, m, mx);
% Scaled predictor
sy = f * dmodel.beta + (dmodel.gamma * r).';
% Predictor
y = repmat(dmodel.Ysc(1,:),mx,1) + repmat(dmodel.Ysc(2,:),mx,1) .* sy;
if nargout > 1 % MSE wanted
rt = dmodel.C \ r;
u = dmodel.G \ (dmodel.Ft.' * rt - f.');
or1 = repmat(dmodel.sigma2,mx,1) .* repmat((1 + colsum(u.^2) - colsum(rt.^2))',1,q);
if nargout > 2
disp('WARNING from PREDICTOR. Only y and or1=mse are computed')
end
end
end % of several sites
% >>>>>>>>>>>>>>>> Auxiliary function ====================
function s = colsum(x)
% Columnwise sum of elements in x
if size(x,1) == 1, s = x;
else, s = sum(x); end
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
3 仿真结果
4 参考文献
[1]倪全贵. 粒子群遗传混合算法及其在函数优化上的应用. Diss. 华南理工大学.