为了账号安全,请及时绑定邮箱和手机立即绑定

具有两个约束的 Python 数组优化

具有两个约束的 Python 数组优化

倚天杖 2023-09-26 16:56:06
我有一个优化问题,我试图找到一个需要同时优化两个函数的数组。在下面的最小示例中,我有两个已知数组w和x一个未知数组y。我将数组初始化y为仅包含 1。然后我指定函数np.sqrt(np.sum((x-np.array)**2)并想要找到y数组np.sqrt(np.sum((x-y)**2) 方法5np.sqrt(np.sum((w-y)**2) 方法8下面的代码可用于成功地y针对单个数组进行优化,但我希望找到同时y针对两者x进行优化的解决方案y,但不确定如何指定这两个约束。y只能包含大于 0 的值。关于如何解决这个问题有什么想法吗?w = np.array([6, 3, 1, 0, 2])x = np.array([3, 4, 5, 6, 7])y = np.array([1, 1, 1, 1, 1])def func(x, y):    z = np.sqrt(np.sum((x-y)**2)) - 5    return  np.zeros(x.shape[0],) + zr = opt.root(func, x0=y, method='hybr')print(r.x)# array([1.97522498 3.47287981 5.1943792  2.10120135 4.09593969])print(np.sqrt(np.sum((x-r.x)**2)))# 5.0
查看完整描述

1 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

一种选择是使用scipy.optimize.minimize代替root,这里您有多个求解器选项,其中一些(即SLSQP)允许您指定多个约束。请注意,我更改了变量名称,以便这x是您要优化的数组并y定义z约束。


from scipy.optimize import minimize

import numpy as np


x0 = np.array([1, 1, 1, 1, 1])

y = np.array([6, 3, 1, 0, 2])

z = np.array([3, 4, 5, 6, 7])


constraint_x = dict(type='ineq',

                    fun=lambda x: x)   # fulfilled if > 0

constraint_y = dict(type='eq',

                    fun=lambda x: np.linalg.norm(x-y) - 5)  # fulfilled if == 0

constraint_z = dict(type='eq',

                    fun=lambda x: np.linalg.norm(x-z) - 8)  # fulfilled if == 0


res = minimize(fun=lambda x: np.linalg.norm(x), constraints=[constraint_y, constraint_z], x0=x0,

               method='SLSQP', options=dict(ftol=1e-8))  # default 1e-6


print(res.x)                    # [1.55517124 1.44981672 1.46921122 1.61335466 2.13174483]

print(np.linalg.norm(res.x-y))  # 5.00000000137866

print(np.linalg.norm(res.x-z))  # 8.000000000930026

这是一个最小化器,因此除了约束之外,它还需要一个函数来最小化,我只选择了 的范数y,但将函数设置为常量(即 lambda x: 1)也可以。另请注意,约束并未完全ftol满足,您可以通过将可选参数设置为较小的值(即 )来提高准确性1e-10。


查看完整回答
反对 回复 2023-09-26
  • 1 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信