首页 > 解决方案 > 显式创建字典列表与使用循环迭代为 lambda 表达式创建字典

问题描述

考虑一个黑盒函数 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不一样yx和 和有什么区别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)

标签: pythonlistdictionary

解决方案


推荐阅读