Python SciPy 优化库求解多目标优化问题
这段代码使用 Python 的优化库 scipy.optimize
来求解一个多目标优化问题。具体来说,它通过最小化一个目标函数 obj
来找到使得约束条件 con2
和 con3
成立的最优解。
首先,定义了目标函数 obj
,它是一个关于变量 x
和 y
的函数。这个函数根据一些数学公式计算了一个值,并将其归一化到特定的范围。这个值是优化问题的一个目标,我们希望最小化这个值。
def obj(X):
x = X[0]
y = X[1]
zuli = 4.05950528e+01 + 8.46631161e-01 * x - \
1.93679792e-02 * y - 2.29699455e-02 * x ** 2 \
+ 1.36511669e-04 * x * y
zuli /= 36.47
k1 = 15.9
k2 = 3.27944218
k3 = -5.60411769
k4 = 10.76586634
xiaolv = 25 / (1 + 1.5 * np.exp(-k1 * x / 10)) \
+ 25 / (1 + 1.5 * np.exp(-k2 * y / 1000)) \
+ 50 / (1 + 1.5 * np.exp(-k3 * x / 10 - k4 * y / 1000))
xiaolv /= 82.98
return -0.5 * xiaolv + 0.5 * zuli
然后,定义了一个匿名函数 myobj
,它将目标函数 obj
作为输入。这样做是为了满足 scipy.optimize
库的要求,因为它要求目标函数只有一个参数。
myobj = lambda x: obj(x)
接下来,定义了约束条件 con2
和 con3
。这些约束条件是关于变量 x
和 y
的函数,它们限制了变量的取值范围。这里使用了不等式约束,因为我们希望变量的取值满足特定的不等式关系。
def con2(X):
x = X[0]
y = X[1]
return -(-0.8648 + 0.05428 * x + 0.001844 * y - 3)
def con3(X):
x = X[0]
y = X[1]
return 43.96 + 1.149 * x + 0.05897 * y - 0.02063 * x ** 2 + 2e-5 * x * y - 85 - 3.114e-5 * y ** 2
然后,将目标函数和约束条件打包成一个列表 mycons
,以便传递给优化函数。
mycons = (
{'type': 'ineq', 'fun': lambda x: con2(x)},
{'type': 'ineq', 'fun': lambda x: con3(x)}
)
定义了变量的取值范围 bound
。这里使用了一个空的列表,然后往里面添加了两个元组,每个元组表示一个变量的取值范围。最后,将列表转换为元组。
bound = []
bound.append((15, 45))
bound.append((600, 1300))
bound = tuple(bound)
定义了一个空的列表 xcall
,用于存储优化过程中的中间结果。
xcall = []
定义了初始变量的取值 x0
。
x0 = [18, 890]
使用 scipy.optimize.minimize
函数来求解优化问题。传递了目标函数 myobj
、初始变量取值 x0
、变量取值范围 bound
、约束条件 mycons
和一些其他参数。求解结果存储在变量 res
中。
res = minimize(myobj, x0, bounds=bound, constraints=mycons, options={'disp': True, 'maxiter': 200},
callback=xcall.append)
最后,打印出最优值、求解状态、最优解。
print(res.fun, '\n', res.success, '\n', res.x, res.message) # 输出最优值、求解状态、最优解
原文地址: http://www.cveoy.top/t/topic/fN5i 著作权归作者所有。请勿转载和采集!