【发布时间】:2019-04-25 17:48:40
【问题描述】:
我有一些猜测的输入数据 (X0),我想在多个函数中优化它们,如下所述。
X0 = [A, B, C, D, E, F, G, H, I, J, K] #每个元素都是一个浮点值
功能:
F1 = A + B + C + D - 200 = 0
F2 = C + D + E - 50 = 0
F3 = C + D + E + F + G - 45 = 0
F4 = E + F + G + H + I + J + K - 67 = 0
F5 = H + I + J + K - 64 = 0
我不确定 scipy 如何优化多个函数中的输入数据。 我在下面准备了一个脚本;我不确定它是否响应。
from scipy.optimize import minimize
x0 = np.array([1. for i in range(11)])
def my_function(A, B, C, D, E, F, G, H, I, J, K):
F1 = A + B + C + D - 200
F2 = C + D + E - 50
F3 = C + D + E + F + G - 45
F4 = E + F + G + H + I + J + K - 67
F5 = H + I + J + K - 64
return F1 + F2 +F3 +F4 + F5
cons = ({'type': 'ineq', 'my_function': lambda A, B, C, D: A + B + C + D - 200},
{'type': 'ineq', 'my_function': lambda C, D, E: C + D + E - 50},
{'type': 'ineq', 'my_function': lambda C, D, E, F, G: C + D + E + F + G - 45},
{'type': 'ineq', 'my_function': lambda E, F, G, H, I, J, K: E + F + G + H + I + J + K - 67},
{'type': 'ineq', 'my_function': lambda H, I, J, K: H + I + J + K - 64})
res = minimize(my_function, x0, method='BFGS', constraints=cons )
【问题讨论】:
-
创建一个函数
def my_function,其中函数的参数将是A、B、C、...K。然后,将F的所有值相加,即此函数将返回F1+F2+....+F5。这是你现在的目标功能。然后在此函数上使用scipy.optmize.minimize,将具有任意值的N元素数组作为初始值传递,然后就完成了。唯一的细节是传递约束。约束是 5 个 lambda 函数,也就是你的五个Fs -
我在上面准备了一个脚本;但我不确定它是否正确。
-
你很亲密。刚刚发布了对您的代码的修复,看看:}
-
感谢您的帮助。有用。一个问题:我可以只在约束中导入函数吗?因为当我从 my_function(X) 中排除函数并且只保留“A、B、C、D、E、F、G、H、I、J、K = X”并将其返回到任何标量时,它可以工作并且我得到了相同的结果。
-
当然,我只是凭直觉来最小化你的函数之间的关系。如果他们的关系是非线性的,这可能更必要。但是你所有的函数都是线性函数,所以你可以只返回它们的值之和并将其最小化。我只是确保说明您能够推广到非线性情况的一般想法;}