多变量遗传算法对基因组执行遗传操作的不同方式的性能影响
Performance impacts of different ways to perform genetic operations on the genome of a multivariable genetic algorithm
我在研究中经常使用遗传算法,我 运行 遇到了一个有趣的问题,即如何最好地对基因组执行遗传操作。假设你有一个由 f(x,y) = ax^n + bx^n-1 + ... + cy^m + 定义的函数dy^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 点交叉:
%% 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
有谁知道已经完成的任何研究显示了两种不同的基因组表示方式的差异?我还没有找到任何关于它的发表,但这可能只是因为我不知道如何在 google.
中巧妙地表达我的问题
谢谢
我的主要评论如下:
突变阶段强烈取决于问题类型。
对于连续、非线性、动力学问题,例如您引用的天气气象物理问题,与估计和预测过程,仍然是一个 GA 框架可以表现得很好,如果它被正确地陈述并且始终明确关注你与他一起追求的东西。离散变异策略——例如所提出的单一选择性交叉——会表现得非常差,就像标准的非引导、随机、暴力搜索一样。正如您所说,这确实是最幼稚的做法。性能和执行时间,将以毫无疑问的方式表达这一事实。
清楚问题是物理问题——我假设太多了——因此,假设有一个动力系统,可能有一定数量的状态,有限与否,并且给定变量具有一定的连续性,无论是否具有一定的非线性度,这里的主要 GA 焦点 应该 涉及 贝叶斯估计器 。在这种情况下,每个 winner 或 individuals - 或您希望应用的任何其他描述性词 - 都会有一个 突变阶段 不是基于简单的 交换 参数。这只是 GA 最简单、更简单、更精彩的解释。在这种情况下解释 突变 阶段的更好、更快、有效的方法等于应用统计估计器,该统计估计器能够从这个动态非线性系统中收集适当的梯度,在每个阶段进行估计。在 Bayesian GA 框架下,粒子过滤器 是准备良好 变异阶段 的有趣替代方案。
您使用的是多个嵌套积分这一事实启发我认为您的问题是真正动态的。在这种情况下,通过更具统计性的贝叶斯框架来指导 GA 让我觉得很有意义。请记住,贝叶斯方法在某些条件下也很稳健。
如果问题明显是动态的,那么你应该面对现实,并考虑丢弃 GA,并转向 Non-线性优化 技术。甚至 参数估计 和 系统识别 方法甚至会表现得更好,如果问题可以适当地表示为参数搜索过程的话。
换句话说,如果您的问题无法区分 离散 - 也就是说,如果您没有任何类型的 PDE 表达式,或者如果这些 PDE 真的很容易解决,或者如果显然没有任何涉及状态的物理过程——并且您的问题主要基于专家规则、数据库查找或处理大型数据系统并且您已经丢弃了——出于您认为相关的任何原因- 没有来自这些数据的动力学模型 - 然后,只有这样,我会尝试将 GA 作为一种蛮力方法,在更好的解决方案之间随机交叉阶段。根据每个 突变阶段 的概率估计, 离散贝叶斯 框架甚至在这里很有用。
如果你有更多的信息,我可以做出这个回答evolve
.....
祝你好运
hypfco
我在研究中经常使用遗传算法,我 运行 遇到了一个有趣的问题,即如何最好地对基因组执行遗传操作。假设你有一个由 f(x,y) = ax^n + bx^n-1 + ... + cy^m + 定义的函数dy^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 点交叉:
%% 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
有谁知道已经完成的任何研究显示了两种不同的基因组表示方式的差异?我还没有找到任何关于它的发表,但这可能只是因为我不知道如何在 google.
中巧妙地表达我的问题谢谢
我的主要评论如下:
突变阶段强烈取决于问题类型。
对于连续、非线性、动力学问题,例如您引用的天气气象物理问题,与估计和预测过程,仍然是一个 GA 框架可以表现得很好,如果它被正确地陈述并且始终明确关注你与他一起追求的东西。离散变异策略——例如所提出的单一选择性交叉——会表现得非常差,就像标准的非引导、随机、暴力搜索一样。正如您所说,这确实是最幼稚的做法。性能和执行时间,将以毫无疑问的方式表达这一事实。
清楚问题是物理问题——我假设太多了——因此,假设有一个动力系统,可能有一定数量的状态,有限与否,并且给定变量具有一定的连续性,无论是否具有一定的非线性度,这里的主要 GA 焦点 应该 涉及 贝叶斯估计器 。在这种情况下,每个 winner 或 individuals - 或您希望应用的任何其他描述性词 - 都会有一个 突变阶段 不是基于简单的 交换 参数。这只是 GA 最简单、更简单、更精彩的解释。在这种情况下解释 突变 阶段的更好、更快、有效的方法等于应用统计估计器,该统计估计器能够从这个动态非线性系统中收集适当的梯度,在每个阶段进行估计。在 Bayesian GA 框架下,粒子过滤器 是准备良好 变异阶段 的有趣替代方案。
您使用的是多个嵌套积分这一事实启发我认为您的问题是真正动态的。在这种情况下,通过更具统计性的贝叶斯框架来指导 GA 让我觉得很有意义。请记住,贝叶斯方法在某些条件下也很稳健。
如果问题明显是动态的,那么你应该面对现实,并考虑丢弃 GA,并转向 Non-线性优化 技术。甚至 参数估计 和 系统识别 方法甚至会表现得更好,如果问题可以适当地表示为参数搜索过程的话。
换句话说,如果您的问题无法区分 离散 - 也就是说,如果您没有任何类型的 PDE 表达式,或者如果这些 PDE 真的很容易解决,或者如果显然没有任何涉及状态的物理过程——并且您的问题主要基于专家规则、数据库查找或处理大型数据系统并且您已经丢弃了——出于您认为相关的任何原因- 没有来自这些数据的动力学模型 - 然后,只有这样,我会尝试将 GA 作为一种蛮力方法,在更好的解决方案之间随机交叉阶段。根据每个 突变阶段 的概率估计, 离散贝叶斯 框架甚至在这里很有用。
如果你有更多的信息,我可以做出这个回答evolve
.....
祝你好运 hypfco