我尝试使用scipy.optimize.differential_evolution运行优化。代码调用x中每个变量的边界。但我想要一个解决方案,其中x的部分必须是整数,而其他部分可以自由地作为浮点数。我的代码的相关部分看起来像
bounds = [(0,3),(0,3),(0,3),???,???]
result = differential_evolution(func, bounds)
如何更换???以强制这些变量在给定范围内的整数?
答案 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