【发布时间】:2015-06-17 14:24:25
【问题描述】:
我在研究中经常使用遗传算法,并且遇到了一个有趣的问题,即如何最好地对基因组执行遗传操作。假设您有一个由 f(x,y) = ax^n + bx^n-1 + ... + cy^m + d 定义的函数y^m-1 ... 等等。它只是一个多变量函数,计算起来有些昂贵,因此您要尽可能地提高遗传操作的效率。
如果您使用的是基因组的二进制表示,我发现有 2 种合理的方法可以执行遗传操作。让我们只看交叉阶段。
这是 Matlab 中矢量化锦标赛选择的代码(用于变量名称的上下文)
%% Tournament Selection
T = round(rand(2*popSize,S)*(popSize-1)+1); % Tournaments
[~,idx] = max(F(T),[],2); % Index of Winners
W = T(sub2ind(size(T),(1:2*popSize)',idx)); % Winners
因此,您有 2 个不同的变量正在优化,我的问题是您是否要拆分遗传操作,以便将交叉分别应用于每个变量,然后将数组重新连接在一起,看起来像这样两点交叉:
%% 2 Point Crossover
Pop2 = Pop(W(1:2:end),:); % Set Pop2 = Pop Winners 1
P2A = Pop(W(2:2:end),:); % Assemble Pop2 Winners 2
% Split Pop2 for x and y genomes
xPop2 = Pop2(:,1:genome/2);
yPop2 = Pop2(:,genome/2 + 1:end);
% Split P2A for x and y genomes
xP2A = P2A(:,1:genome/2);
yP2A = P2A(:,genome/2+2:end);
% For x genome
Ref = ones(popSize,1)*(1:genome/2); % Reference Matrix
CP = sort(round(rand(popSize,2)*(genome/2-1)+1),2); % Crossover Points
xidx = CP(:,1)*ones(1,genome/2)<Ref & CP(:,2)*ones(1,genome/2)>Ref; % Logical Index
xPop2(xidx) = xP2A(xidx); % Recombine Winners
% For y genome
Ref = ones(popSize,1)*(1:genome/2); % Reference Matrix
CP = sort(round(rand(popSize,2)*(genome/2-1)+1),2); % Crossover Points
yidx = CP(:,1)*ones(1,genome/2)<Ref & CP(:,2)*ones(1,genome/2)>Ref; % Logical Index
yPop2(yidx) = yP2A(yidx); % Recombine Winners
Pop2 = horzcat(xPop2,yPop2);
P2A = horzcat(xP2A,yP2A);
或者你是否将基因组视为一个单一的交叉操作,只执行 2 点交叉,就好像它只是一个单一的可变基因组,像这样:
Pop2 = Pop(W(1:2:end),:); % New Pop is Winners of old Pop
P2A = Pop(W(2:2:end),:); % Assemble Pop2 Winners 2
Ref = ones(popSize,1)*(1:genome); % Ones Matrix
CP = sort(round(rand(popSize,2)*(genome-1)+1),2); % Crossover Points
idx = CP(:,1)*ones(1,genome)<Ref&CP(:,2)*ones(1,genome)>Ref; % Index
Pop2(idx)=P2A(idx); % Recombine Winners
有没有人知道已经进行的任何研究表明两种不同的基因组表示方式的差异?我还没有找到任何关于它的发布,但这可能只是因为我不知道如何在谷歌中巧妙地表达我的问题。
谢谢
【问题讨论】:
-
这个研究分支确实很有趣,当然,有标准的、经过验证的、简单的程序来解决、解决和分析这类问题。首先,我想知道:1.您的具体问题是什么?:解决或优化解决方案的框架? / 选择突变程序的方法?选择目标函数的方法? 2. 实际上,多项目标函数不是一个复杂的函数来解决 - 这是 C0,..,Cn 连续的:),或者您实际上是否需要将 GA 应用于非 C0,...Cn 函数,例如离散过程?
-
3.您是否绑定到 GA 类方法?你能扩展到其他人吗? 4. 作为参考,您的问题工作侧重于哪个学科,IT、数学、工程?
-
所以我的主要问题是如何在交叉阶段用二进制表示多变量函数。我已经介绍了两种不同的交叉技术,第一种只是简单地交叉整个基因组,第二种技术首先将基因组分割成各个变量并分别交叉每个变量。我很好奇是否有研究表明哪个更好?我猜想如果变量太多,您不想将它们分开,但是对于 2 个变量的情况,我的收敛速度会稍微快一点
-
2.我给出的函数与我刚刚展示的多变量函数的问题完全无关。我实际处理的函数是非常计算积分的总和。 3. 我正在做的研究是基于遗传算法的使用,所以我不能使用其他方法来解决这个特定问题。 4. 我是一名物理和数学专业的学生,但该项目是针对国家天气中心(气象)的,现在我对 GA 本身进行研究,所以我想说这更像是一个一般性问题,而不是与任何特定学科相关的问题!
标签: matlab optimization genetic-algorithm evolutionary-algorithm genome