我正在尝试设置differential_evolution算法。我有大约15个变量,每个都有自己的边界(假设它们都有相同的边界(150,250))。我已经成功地做到了这一点。现在,我想添加任何参数设置为0的可能性(或者任何小的数字都可以)。有没有办法把参数的边界设为(0,0.1) U (150, 250)?这是否可以通过某种限制来实现?
differential_evolution
(150,250)
(0,0.1) U (150, 250)
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)}')
1条答案
按热度按时间tf7tbtn21#
我大胆猜一下。配置
differential_evolution
以满足您想要的约束类型就足够了。仅仅运行一个有意义的优化是不够的,但是为一个您没有提供的目标函数进行调优是没有意义的。