具有整数的Scipy差分进化

时间:2016-02-18 23:49:23

标签: python scipy mathematical-optimization differential-evolution

我尝试使用scipy.optimize.differential_evolution运行优化。代码调用x中每个变量的边界。但我想要一个解决方案,其中x的部分必须是整数,而其他部分可以自由地作为浮点数。我的代码的相关部分看起来像

    bounds = [(0,3),(0,3),(0,3),???,???]
    result = differential_evolution(func, bounds)

如何更换???以强制这些变量在给定范围内的整数?

2 个答案:

答案 0 :(得分:2)

如评论中所述,没有直接支持“整数约束”。

然而,您可以最小化修改后的目标函数,例如:

def func1(x):
    return func(x) + K * (x[3] - round(x[3]))**2

这会强制x[3]为整数值(遗憾的是你必须调整K参数)。

另一种方法是在评估目标函数之前舍入(部分)实值参数:

def func1(x):
    z = x;
    z[3] = round(z[3])
    return func(z)

两种方法都是使用差分进化来处理离散优化问题的常用技术,它们运行良好。

答案 1 :(得分:0)

差异进化可以支持整数约束,但是需要更改当前的scipy实现。

从scipy源代码看,它们的DE基于Storn,R和Price,K,差分进化 - 一种简单而有效的连续空间全局优化启发式,全球优化期刊,1997

然而,正如本评论文件Recent advances in differential evolution – An updated survey

所指出,这一领域取得了进展

有一些论文引入了算法的变化,以便它可以处理整数。我没有时间看所有选项,但也许这篇论文可能有所帮助。

An Improved Differential Evolution Algorithm for Mixed Integer Programming Problems