考虑黑盒函数f,该函数输入x并返回实数a。
def foo(x): ... return a
我们知道f是x的确定函数。 假设
x = []
for i in range(2):
x.append({'type': 'eq', 'fun': lambda x: x[i] + x[3+i] - 1000})
和
y = [{'type': 'eq', 'fun': lambda x: x[0] + x[3+0] - 1000},
{'type': 'eq', 'fun': lambda x: x[1] + x[3+1] - 1000}
]
我得到了foo(x) != foo(y)
,这意味着x与y不同。
x
与y
怎么可能不同? x
和y
有什么区别?
这是一个可验证且完整的示例:
import pandas as pd
import numpy as np
from scipy.optimize import minimize, Bounds
X0 = [0,0,0,0]
x = []
for i in range(2):
x.append({'type': 'eq', 'fun': lambda x: x[i] + x[2+i] - 1000})
y = [{'type': 'eq', 'fun': lambda x: x[0] + x[2] - 1000},
{'type': 'eq', 'fun': lambda x: x[1] + x[3] - 1000}
]
def f(a):
return a[0] + a[1] + a[2] + a[3]
print(minimize(f, X0, constraints=x,
bounds = bounds, options={'disp': False} ).x)
print(minimize(f, X0, constraints=y,
bounds = bounds, options={'disp': False} ).x)
此打印:
[724.07734394 500. 0. 500.]
[500。 500. 500. 500。]
实际上,y给出正确的结果。为什么x给出错误的结果?
回答我自己的问题:
执行以下操作:
import pandas as pd
import numpy as np
from scipy.optimize import minimize, Bounds
X0 = [0,0,0,0]
x = []
for i in range(2):
x.append({'type': 'eq', 'fun': lambda a, i=i: a[i] + a[split+i] - 1000})
y = [{'type': 'eq', 'fun': lambda x: x[0] + x[2] - 1000},
{'type': 'eq', 'fun': lambda x: x[1] + x[3] - 1000}
]
def f(a):
return a[0] + a[1] + a[2] + a[3]
print(minimize(f, X0, constraints=x,
bounds = bounds, options={'disp': False} ).x)
print(minimize(f, X0, constraints=y,
bounds = bounds, options={'disp': False} ).x)