我在研究中经常使用遗传算法,我遇到了一个有趣的问题,关于如何最好地在基因组上进行遗传操作假设你有一个由f(x,y)=ax^n+bx^n-1+定义的函数+周期^m+dy^m-1它只是一个多变量函数,计算起来有点贵,所以你要尽可能有效地进行遗传操作。
如果你用的是基因组的二元表示,我发现有两种合理的方式来进行基因操作让我们看看交叉阶段。
下面是在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

有没有人知道已经做了什么研究,显示了两种不同的方式来代表基因组的差异我还没有找到关于它的任何出版物,但这可能只是因为我不知道如何在谷歌智能地表达我的问题。
谢谢

最佳答案

我的主要意见如下:
突变阶段很大程度上取决于问题类型。
对于连续的、非线性的、动态的问题,比如你提到的天气气象物理问题,加上估计和预测过程,如果一个遗传算法框架被正确地描述,并且总是清晰地关注你和他一起追求的目标,那么它仍然可以很好地执行一个离散的变异策略-如所提出的单选择交叉-将执行非常差,就像一个标准的非指导,随机,暴力搜索正如你所说,这的确是最天真的做法性能和执行时间将以非双精度的方式表达这一事实。
清楚地知道这个问题是物理的——我假设得太多了——因此,假设存在一个动态系统,可能有一定数量的状态,有限的或不有限的,并且变量上有一定的连续性,并且有或没有一定的非线性度,这里的主要GA焦点应该包括贝叶斯估计在这种情况下,每一个获胜者或个人——或任何其他你想使用的描述性词汇——都会有一个突变阶段,而不是基于简单的参数交换这只是对遗传算法最简单、更容易、更清晰的解释。在这种情况下,解释变异阶段的更好、更快、更有效的方法等于应用一种统计估计器,能够从这个动态非线性系统中收集适当的梯度,在每个阶段进行估计在贝叶斯遗传算法框架下,粒子滤波器是一种很有意思的选择,可以用来准备一个好的变异阶段。
你使用多重嵌套积分的事实,启发了我,让我认为你的问题是真正动态的在这种情况下,通过一个更具统计意义的贝叶斯框架来指导遗传算法让我很有意义记住,贝叶斯方法在某些条件下也是稳健的。
如果问题显然是动态的,那么你应该面对事实,考虑放弃遗传算法,转向非线性优化技术甚至,如果问题可以适当地表示为参数搜索过程,参数估计和系统识别方法甚至可以更好地执行。
另一方面,如果你的问题是以一种无法区分的方式离散的,也就是说,如果你没有任何形式的PDE表达式,或者这些PDE很难解决,或者如果显然没有任何涉及状态的物理过程,那么你的问题主要是基于专家规则、数据库查找或处理大型数据系统,而你由于任何你认为相关的原因,放弃了没有这些数据的动力学模型,然后,只有到那时,我才会尝试将遗传算法作为一种蛮力方法来指导,在更好的解之间有随机交叉阶段从每个变异阶段的概率估计来看,离散贝叶斯框架在这里甚至是有用的。
如果你有更多的信息,我可以回答这个问题。。。。
祝你好运
hypfco公司

07-26 01:47