5

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

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

我应该用什么替换 ???'s 来强制这些变量在给定范围内是整数?

4

3 回答 3

3

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

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

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)

两者都是使用差分进化解决离散优化问题的常用技术,并且它们工作得很好。

于 2016-05-27T12:51:55.590 回答
1

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

从 scipy 源代码看来,他们的 DE 是基于 Storn, R 和 Price, K,差分进化 - 连续空间上全局优化的简单有效的启发式算法,全局优化杂志,1997

然而,正如这篇评论论文所指出的那样,该领域已经取得了进展。 差异进化的最新进展——一项更新的调查

有几篇论文介绍了对算法的更改,以便它可以处理整数。我没有时间查看所有选项,但也许本文可以提供帮助。

一种改进的混合整数规划问题的差分进化算法

于 2017-10-03T11:27:17.530 回答
0

我应该用什么替换 ???'s 来强制这些变量在给定范围内是整数?

wrapdisc是一个包,它是一个瘦包装器,它可以让您使用各种优化器优化有界整数变量和浮点数scipy.optimize。它的自述文件中有一个使用示例。有了它,您根本不必调整目标函数。它在内部使用舍入来支持整数,尽管这个细节对用户是隐藏的。

于 2021-12-12T03:10:08.127 回答