Scipy差分进化-非连续边界

ia2d9nvy  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(44)

我正在尝试设置differential_evolution算法。我有大约15个变量,每个都有自己的边界(假设它们都有相同的边界(150,250))。我已经成功地做到了这一点。
现在,我想添加任何参数设置为0的可能性(或者任何小的数字都可以)。
有没有办法把参数的边界设为(0,0.1) U (150, 250)?这是否可以通过某种限制来实现?

tf7tbtn2

tf7tbtn21#

我大胆猜一下。配置differential_evolution以满足您想要的约束类型就足够了。仅仅运行一个有意义的优化是不够的,但是为一个您没有提供的目标函数进行调优是没有意义的。

import numpy as np
from scipy.optimize import differential_evolution, LinearConstraint

def objective(x: np.ndarray) -> float:
    a, b, a_selected, b_selected = x
    return a*b

constraint = LinearConstraint(
    A=(
        (1, 0, -150,    0),  # a >= 150s
        (1, 0, -250,    0),  # a <= 250s
        (0, 1,    0, -150),  # b >= 150t
        (0, 1,    0, -250),  # b <= 250t
    ),
    lb=(0, -np.inf, 0, -np.inf),
    ub=(+np.inf, 0, +np.inf, 0),
)

result = differential_evolution(
    func=objective,
    bounds=(
        (0, 250),
        (0, 250),
        (0, 1),
        (0, 1),
    ),
    integrality=(False, False, True, True),
    constraints=constraint,
)
assert result.success, result.message
a, b, a_selected, b_selected = result.x
print(f'a = {np.round(a, 3)}, selected: {a_selected}')
print(f'b = {np.round(b, 3)}, selected: {b_selected}')
print(f'f = {np.round(result.fun, 3)}')

相关问题