【问题标题】:Pass Optional Variable in Matlab Genetic Algorithm在 Matlab 遗传算法中传递可选变量
【发布时间】:2014-02-21 04:14:01
【问题描述】:

我在使用 Matlab 编码遗传算法时遇到问题。我正在使用ga 函数,我对ga 的概念及其工作原理没有任何问题。为了实现我的对象函数,我需要向这个函数传递一个额外的变量(除了参数向量)。 (我的意图实际上是尝试混合不同情节的配件,我正在将 Matlab 的ga 函数集成到我的另一个代码中)。我试过使用全局变量,它工作正常。但我只是想知道这个问题还有其他解决方案吗?随着全局变量开始为以后的任务变得越来越大。

【问题讨论】:

    标签: matlab arguments genetic-algorithm


    【解决方案1】:

    您可能想阅读函数句柄 - 特别是 parameterising function handles。这使您可以将额外的参数“绑定”到您的目标函数。例如,而不是

    ga(@myfcn, ...);
    

    你可能会说

    param = 17;
    fh = @(x) myfcn(x, param);
    ga(fh, ...);
    

    所以myfcn 总是将17 作为它的第二个参数。

    【讨论】:

    • 感谢您的来信。我之前也想过这个。目标函数是我自己定义的,所以那部分没有问题。 ga 函数只接受一个目标函数,它的输入 argumnet 是一个与参数数量大小完全相同的向量。所以我应该编辑 ga 功能并自己定制它。我跳到可能仍然有一个隐藏的选项,有人知道它。问题是我首先需要通过 ga 传递参数,然后将其传递给目标函数。
    • 嗯。我不确定我是否理解。如果您可以用一个您尝试过的示例以及为什么在参数中绑定不起作用来更新您的问题,那将会很有帮助。
    • 顺便说一句,我编辑了 ga 函数并使用了你的想法。现在它工作正常。对于其他遇到此问题的人,只需简单地编辑 matlab 的 ga 函数,在末尾添加一个参数,例如“extra_param”。并在函数定义的开头添加:fcn = @(x)fcn(x,extra_param)。现在已修复。感谢 Edric 的提示
    【解决方案2】:

    完整的答案是这样的。

    1. 找到 ga 函数。 (输入“编辑 ga”)
    2. 将其复制到一个新函数,例如 ga_customized。
    3. 像这样编辑新创建的函数:

      function [x,fval,exitFlag,output,population,scores] = ga_customized(fun,nvars,Aineq,bineq,Aeq,beq,lb,ub,nonlcon,intcon,options,extra_param)

    并添加此代码

    fun = @(x) fun(x, extra_param);
    

    还可以找到第 230 行附近的代码部分并像这样编辑它:

    if nargin < 12, extra_param = [];
        if nargin < 11, options = [];
            if nargin < 10,  intcon = [];
                if nargin < 9,  nonlcon = [];
                        if nargin < 8, ub = [];
                        if nargin < 7, lb = [];
                            if nargin <6, beq = [];
                                if nargin <5, Aeq = [];
                                    if nargin < 4, bineq = [];
                                        if nargin < 3, Aineq = [];
                                        end
                                     end
                                end
                            end
                        end
                    end
                end
            end
        end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      相关资源
      最近更新 更多