我们热爱生命科学!-生物行

[组图] Matlab 7 GA

时间:2006-01-11 15:16来源:Internet 作者:bioguider 点击: 1467次

Matlab 7 GA

在 Matlab 7.0 中提供了 Genetic Algorithm and Direct Search 工具箱,
现在简单介绍下。转载时请保持作者信息完整。

1、首先编写fitness函数,函数内容见后面的引用。

function score = my_func1(pop)
%f(x1,x2)=21.5+x1*sin(4*pi*x1)+x2*sin(20*pi*x2)
%-3.0<=x1<=12.1; 4.1<=x2<=5.8
score = -21.5 - pop(1)*sin(4*pi*pop(1)) - pop(2)*sin(20*pi*pop(2));

从ga函数说明可知
% X = GA(FITNESSFCN,NVARS) finds the minimum of FITNESSFCN using
% GA. NVARS is the dimension (number of design variables) of the
% FITNESSFCN. FITNESSFCN accepts a vector X of size 1-by-NAVRS,
% and returns a scalar evaluated at X.
%     
% X = GA(FITNESSFCN,NAVRS,OPTIONS) finds the minimum for
% FITNESSFCN with the default optimization parameters replaced by values
% in the structure OPTIONS. OPTIONS can be created with the GAOPTIMSET
% function.
ga 是寻找最小值的,所以将原函数取负。


从本站翻出来一个老贴。
[parse]lihuanc[/parse]
关于优化方面的:
f(x1,x2)=21.5+x1*sin(4*pi*x1)+x2*sin(20*pi*x2)
-3.0<=x1<=12.1 4.1<=x2<=5.8

[parse]zonly[/parse]
用遗传算法算了下,得到一个最优值为38.8503
x1*=11.6255 x2*=5.7250
但似乎仍不是全局最优解

[parse]easyworm[/parse]
呵呵,这个问题的局部极小较多,我用NLPSolver1.0(到偶的网站www.easyworm.com下载)算了一下:
初始值取X1=11.600000, X2=4.500000
最优目标值为37.650301
最优点处X1*=11.625545, X2*=4.525056
lingo 8.0的计算结果为37.45030
最优点处X1*=11.62554, X2*=4.325057


2、gatool 的用法
在matlab7命令行输入 gatool,见附图。

在 PopulationSize=10000; 请注意Mutation函数的选择。

f(x1*,x2*)=-my_func1(x1*,x2*)=38.84741978236206,
where x1*=11.62378; x2*=5.72501

3、ga 函数的使用
因为要使用非原始设定,所以要采用 ga 的第2种调用方式,并且Mutation要采用mutationuniform函数。

opt1 = gaoptimset;
opt1.PopInitRange = [[-3.0 4.1];[12.1 5.8]];
opt1.PopulationSize = 1000;
opt1.MutationFcn=@mutationuniform;
[x, fval] = ga(@my_func1,2,opt1)

结果如下:
>> opt1

opt1 =

PopulationType: 'doubleVector'
PopInitRange: [2x2 double]
PopulationSize: 1000
EliteCount: 2
CrossoverFraction: 0.80000000000000
MigrationDirection: 'forward'
MigrationInterval: 20
MigrationFraction: 0.20000000000000
Generations: 100
TimeLimit: Inf
FitnessLimit: -Inf
StallGenLimit: 50
StallTimeLimit: 20
InitialPopulation: []
InitialScores: []
PlotInterval: 1
CreationFcn: @gacreationuniform
FitnessScalingFcn: @fitscalingrank
SelectionFcn: @selectionstochunif
CrossoverFcn: @crossoverscattered
MutationFcn: @mutationuniform
HybridFcn: []
Display: 'final'
PlotFcns: []
OutputFcns: []
Vectorized: 'off'

>> [x, fval] = ga(@my_func1,2,opt1)
Optimization terminated: stall generations limit exceeded.

x =

11.60992040806107 5.72602745388080

fval =

-38.61619496300001

>>

(缩略图,点击图片链接看原图)
function y = my_func2(x)
%fmax
r=sqrt((x(1)-50)^2+(x(2)-50)^2)+exp(1);
y=-(sin(r)/r+1);

function y = my_func2a(x)
%fmin
r=sqrt((x(1)-50)^2+(x(2)-50)^2)+exp(1);
y=(sin(r)/r+1);

原贴见
http://bbs.matwav.com/post/view?bid=7&id=45307&sty=0&tpg=2&ppg=1&age=0#45307

请注意 Mutation 选择 Gaussian 函数时, Scale 要设成 0;
结果:
minimize f(x) = 0.7827663723309104;
maximize f(x) = 1.1283745483594003

(缩略图,点击图片链接看原图)
(责任编辑:泉水)
顶一下
(8)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片