python中非线性数值优化的cma-es协方差矩阵自适应进化策略

cma的Python项目详细描述


一种困难(非凸, 病态、多模态、粗糙、噪声)优化问题 连续搜索空间,用python实现。

典型的应用领域是有约束或无约束的 目标函数具有:

  • 搜索5到(几个)100之间的空间维度,
  • 没有可用的渐变,
  • 至少,比方说,100倍的维函数计算需要 得到满意的解决方案,
  • 不可分离、病态或崎岖/多模式景观。

CMA-ES是相当可靠的,但是预算很小(功能较少 比,比如说,100倍的维度)或者非常小的维度 有更好(即更快)的方法可用。

pycma模块提供了 类cma.CMAEvolutionStrategy中的cma-es算法 cma.purecma.CMAES

安装

有几种安装方法:

  • 在终端命令行中键入:

    python -m pip install cma
    

    只键入pip而不是python -m pip就足够了。或者, 或者:

    easy_install cma
    

    软件包将自动下载和安装。到 {STR 1 } $升级< /强>现有的安装,“^ TT6}$”必须被替换 在这两种情况下都是“-U cma”。如果你从没听说过pipsee here

  • 下载并解压缩cma-...tar.gz文件,然后键入:

    pip install -e cma
    

    或:

    python setup.py install
    

    cma-...文件夹中(在windows下 “setup.py install”)。

  • 在windows下还可以下载ms-windows安装程序。

安装可能需要根权限。在这种情况下,尝试 pip的--user选项或以sudo开头。

来自tar存档的文件夹cma也可以在没有 任何安装(只要import需要找到它)。

用法示例

在python外壳中:

>>> import cma
>>> help(cma)
    <output omitted>
>>> es = cma.CMAEvolutionStrategy(8 * [0], 0.5)
(5_w,10)-aCMA-ES (mu_w=3.2,w_1=45%) in dimension 8 (seed=468976, Tue May  6 19:14:06 2014)
>>> help(es)  # the same as help(cma.CMAEvolutionStrategy)
    <output omitted>
>>> es.optimize(cma.ff.rosen)
Iterat #Fevals   function value    axis ratio  sigma  minstd maxstd min:sec
    1      10 1.042661803766204e+02 1.0e+00 4.50e-01  4e-01  5e-01 0:0.0
    2      20 7.322331708590002e+01 1.2e+00 3.89e-01  4e-01  4e-01 0:0.0
    3      30 6.048150359372417e+01 1.2e+00 3.47e-01  3e-01  3e-01 0:0.0
  100    1000 3.165939452385367e+00 1.1e+01 7.08e-02  2e-02  7e-02 0:0.2
  200    2000 4.157333035296804e-01 1.9e+01 8.10e-02  9e-03  5e-02 0:0.4
  300    3000 2.413696640005903e-04 4.3e+01 9.57e-03  3e-04  7e-03 0:0.5
  400    4000 1.271582136805314e-11 7.6e+01 9.70e-06  8e-08  3e-06 0:0.7
  439    4390 1.062554035878040e-14 9.4e+01 5.31e-07  3e-09  8e-08 0:0.8
>>> es.result_pretty()  # pretty print result
termination on tolfun=1e-11
final/bestever f-value = 3.729752e-15 3.729752e-15
mean solution: [ 1.          1.          1.          1.          0.99999999  0.99999998
  0.99999995  0.99999991]
std deviation: [  2.84303359e-09   2.74700402e-09   3.28154576e-09   5.92961588e-09
   1.07700123e-08   2.12590385e-08   4.09374304e-08   8.16649754e-08]

用初始解all优化8维rosenbrock函数 零和首字母sigma = 0.5

几乎同样的效果可以通过以下方式实现,而不是“精心设计”:

>>> import cma
>>> xopt, es = cma.fmin2(cma.ff.rosen, 8 * [0], 0.5)
    <output omitted>

更详细地展示ask-and-tell接口

>>> import cma
>>> es = cma.CMAEvolutionStrategy(12 * [0], 0.5)
>>> while not es.stop():
...     solutions = es.ask()
...     es.tell(solutions, [cma.ff.rosen(x) for x in solutions])
...     es.logger.add()  # write data to disc to be plotted
...     es.disp()
    <output omitted>
>>> es.result_pretty()
    <output omitted>
>>> cma.plot()  # shortcut for es.logger.plot()
CMA-ES on Rosenbrock function in dimension 8

对12维rosenbrock函数的一次运行。

CMAOptions类管理CMAEvolutionStrategy的选项, 例如,详细选项如下:

>>> import cma
>>> cma.s.pprint(cma.CMAOptions('erb'))
{'verb_log': '1  #v verbosity: write data to files every verb_log iteration, writing can be time critical on fast to evaluate functions'
 'verbose': '1  #v verbosity e.v. of initial/final message, -1 is very quiet, not yet implemented'
 'verb_plot': '0  #v in fmin(): plot() is called every verb_plot iteration'
 'verb_disp': '100  #v verbosity: display console output every verb_disp iteration'
 'verb_filenameprefix': 'outcmaes  # output filenames prefix'
 'verb_append': '0  # initial evaluation counter, if append, do not overwrite output files'
 'verb_time': 'True  #v output timings on console'}

选项的传递方式如下:

>>> import cma
>>> es = cma.CMAEvolutionStrategy(8 * [0], 0.5,
                                  {'verb_disp': 1}) # display each iteration

文件

阅读完整的软件包文档:

另请参见

依赖关系

  • 必需:numpy–数字、字符串、记录和对象的数组处理
  • 可选(强烈建议):matplotlib–python绘图包(包括pylab

使用pip install numpy等进行安装。对于依赖性较小的cma-es的python实现,请参见here

许可证:BSD

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Apache Flink外部Jar   创建和强制转换对象数组时发生java错误   Java,添加数组   具有相同包结构和类的java JAR   java Jenkins未能构建Maven项目   java为什么一个forloop比另一个更快,尽管它们做的“一样”?   servlets在将“/”站点迁移到Java EE包时处理contextpath引用   无法解析java MavReplugin:2.21或其某个依赖项   泛型如何编写比较器来泛化Java中的两种类型的对象?   java Android Emulator未在netbeans上加载   多线程Java使用线程对数组中的数字求和:在同步块中使用新变量作为锁:差异   java如何在JSP/servlet中设置<input>标记的值?