【问题标题】:Single calculation for objective function and constraints function in fminconfmincon中目标函数和约束函数的单次计算
【发布时间】:2017-01-07 02:38:47
【问题描述】:

在我的程序中,我需要解决优化程序中的边界值问题,该程序也具有非线性约束。使用fmincon 解决问题,我需要BVP 的解决方案来评估目标函数和非线性约束函数。

目前我正在解决目标函数和约束函数中的 BVP。有没有一种更有效的方法,在目标函数中对 BVP 进行一次评估后,我可以将解决方案传递给约束函数,以减少一次 BVP 评估。任何想法

【问题讨论】:

    标签: matlab optimization differential-equations


    【解决方案1】:

    创建一个带有额外输入的函数,用于区分两个调用。这基本上是目标和约束函数的包装,将所有必要的中间输出保存在persistent 变量中:

    function varargout = my_obj_con_function(..., option)
    
        persistent C, Ceq; % ... or any other data you might need
    
        switch (option)
    
            case 'obj'
    
                % objective function 
                [varargout{1}, data] = objfun(...); % 'data' is an example
    
                % constraint function 
                [C, Ceq] = confcn(data, ...);
    
            case 'con'
    
                % You've just computed this -- just return it
                varargout{1} = C;
                varargout{2} = Ceq;
                return 
    
        end
    
    end
    

    这样使用:

    [...] = fmincon(@(x) my_obj_con_function(x, ..., 'obj'), ...
                    x0,...
                    Lb, Ub, ...
                    A, b,...
                    Aeq, beq, ...
                    @(x) my_obj_con_function(x, ..., 'con'), ...);
    

    这明确假设fmincon 总是调用约束函数调用目标函数之后,完全相同决策值相同变量。现在我不确定这是否可以保证——您可能希望在不能保证的情况下建立一些保护和机制。

    【讨论】:

    • 我实施并发现优化过早地停止说约束不满足并且步长达到其容差。如果我按照问题中的说明单独运行它们(即),那么它会继续。缺少某些东西,我不确定它是否在需要调整的 fmincon 算法中
    • @qwerty123 您是否检查过fminconx 使用相同的值来评估objfcn 和包装器内的confcn
    • 我没有将 x 作为输入参数传递给 confcn。根据上面的伪代码,我只使用data 到我的约束计算所需的confcn。所以我可能不明白'检查是否在objfcnconfcn by fmincon 中使用相同的 x'
    • @qwerty123 啊,我明白了。 fmincon 通常会围绕当前感兴趣的值 x 评估目标函数很多次,以获得它的导数。然后它继续评估约束函数以查看在x 处是否满足约束,通常还会多次获得 its 导数。所以做你想做的可能不是那么简单——你可能需要存储data的多个副本以及相应的值x,然后再检测which x fmincon 正在计算输出...
    • @qwerty123 ...通常情况下,仅仅忍受多次重新计算目标函数的低效率会更容易很多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多