微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果目标函数的参数过多,SciPy微分进化将失败 代码有关输入文件,请参见GitHub repo针对实际问题的程序输出有关优化问题的更多信息

如何解决如果目标函数的参数过多,SciPy微分进化将失败 代码有关输入文件,请参见GitHub repo针对实际问题的程序输出有关优化问题的更多信息

差分进化算法的SciPy implementation是否具有最大数量的变量?我的code适用于具有8个变量的玩具问题版本,但是当我尝试优化具有4000个变量的实际问题时,始终为目标函数返回无穷大的值。

代码(有关输入文件,请参见GitHub repo

import numpy as np
from scipy.optimize import differential_evolution as de
from scipy.optimize import NonlinearConstraint as nlc

def kf(x,w,freq):
    kc = x>0
    kw = ~np.any(w[~kc,:],axis=0)
    return -freq[kw].sum()

def cons_fun(x):
    return np.sum(x>0)

def optimize(w,freq):
    cons = nlc(cons_fun,-np.inf,1000)
    bnds = [np.array([-1,1]),]*w.shape[0]
    res = de(kf,args=(w,freq),maxiter=1000,bounds=bnds,popsize=2,polish=False,constraints=cons,disp=True,workers=-1,updating='deferred')
    output = res.x>0
    np.save('output.npy',output)

if __name__ == '__main__':
    # try optimizing toy version of problem
    small_w = np.load('small_w.npy')
    small_freq = np.load('small_freq.npy')
    optimize(small_w,small_freq)
    
    # try optimizing actual problem
    w = np.load('w.npy')
    freq = np.load('freq.npy')
    optimize(w,freq)

针对实际问题的程序输出

differential_evolution step 1: f(x)= inf
differential_evolution step 2: f(x)= inf
differential_evolution step 3: f(x)= inf

...等等数百步

有关优化问题的更多信息

我正在尝试确定一组1000个汉字,以最大程度地提高您书写常用单词的能力。数组w一个稀疏布尔矩阵,其形状为4000(潜在字符数)乘以30000(字数)。如果与该行相对应的字符出现在与该列相对应的单词中,则w的元素为true。数组freq一个长度为30000的向量,其中包含单词频率值。

目标函数kf以4000个元素的数组x为参数。数组x的值介于-1和1之间。字符的试用集由x中的正元素确定。非线性约束将x中正元素的数量限制为1000。

解决方法

differential_evolution 中可以使用的变量数量没有限制。

对于具有 differential_evolution 的约束最小化,目标函数仅为 evaluated if the constraints are feasible。这样计算时间就不会浪费在试验解决方案上。

在以下情况下接受试用解决方案:

        * it satisfies all constraints and provides a lower or equal objective
          function value,while both the compared solutions are feasible
        - or -
        * it is feasible while the original solution is infeasible,- or -
        * it is infeasible,but provides a lower or equal constraint violation
          for all constraint functions.

您是否调查过您的约束函数以检查是否可以在 bounds 内创建可行的解决方案?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。