Python 带整数的Scipy微分进化
我正在尝试使用scipy.optimize.differential_evolution运行优化。代码为x中的每个变量调用边界。但我想要一个解决方案,其中x的部分必须是整数,而其他部分可以作为浮点数自由变化。我的代码的相关部分如下所示Python 带整数的Scipy微分进化,python,scipy,mathematical-optimization,differential-evolution,Python,Scipy,Mathematical Optimization,Differential Evolution,我正在尝试使用scipy.optimize.differential_evolution运行优化。代码为x中的每个变量调用边界。但我想要一个解决方案,其中x的部分必须是整数,而其他部分可以作为浮点数自由变化。我的代码的相关部分如下所示 bounds = [(0,3),(0,3),(0,3),???,???] result = differential_evolution(func, bounds) 我应该用什么替换???来强制这些变量为给定范围内的整数?如评论中所述,不直接支持
bounds = [(0,3),(0,3),(0,3),???,???]
result = differential_evolution(func, bounds)
我应该用什么替换???来强制这些变量为给定范围内的整数?如评论中所述,不直接支持“整数约束” 但是,您可以最小化修改后的目标函数,例如:
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)
这两种技术都是使用差分进化来处理离散优化问题的常用技术,它们工作得非常好。差分进化可以支持整数约束,但当前的scipy实现需要更改 从scipy源代码来看,他们的DE似乎是基于Storn,R和Price,K,差分进化-连续空间上全局优化的一种简单有效的启发式算法,《全局优化杂志》,1997年 然而,正如本审查文件所指出的,在这一领域已经取得了进展 有几篇文章介绍了对算法的修改,使其能够处理整数。我还没来得及研究所有的选择,但这份文件或许会有所帮助
你不能。实际上,
scipy.optimize
中的解算器都不支持这样的约束。还有另外两个Python库用于构建遗传算法,它们提供对变异函数的控制,从而可以将解向量中的部分或所有元素约束为整数。根据问题的性质,您还可以查看整数编程库,如或。好的,谢谢。那我去找迪普,祝你好运!您可能应该考虑一下,您的优化问题是否可以表示为可以使用现有解算器解决的形式。可能是另一个值得探索的选择。我很难在不了解您试图解决的问题的性质的情况下提供任何具体的建议。这是两种有趣的方法。第一个似乎产生了一个独特的解决方案,但代价是增加了一个参数($K$)。对于给定的“典型”问题类型,是否有关于具体选择其中一种的建议?例如,在二进制变量的情况下?那么,将这两种方法结合起来如何?@Unis我已经在一些调度任务中尝试了第二种方法,效果非常好。不确定是否有任何建议。。。