基于Scipy.optimize.minimize实现的二元目标函数优化
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import minimize
# 定义目标函数,该函数包含两个变量,分别代表两个指标
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
# 使用lambda表达式定义一个新的目标函数,该函数接受一个参数
myobj = lambda x: obj(x)
# 定义第一个约束条件函数
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 = (
{'type': 'ineq', 'fun': lambda x: con2(x)}, # 不等式约束条件
{'type': 'ineq', 'fun': lambda x: con3(x)} # 不等式约束条件
)
# 定义变量的取值范围
bound = []
bound.append((15, 45)) # 第一个变量的取值范围
bound.append((600, 1300)) # 第二个变量的取值范围
bound = tuple(bound)
# 初始化一个空列表,用于存储每次迭代的结果
xcall = []
# 设置初始值
x0 = [18, 890]
# 使用minimize函数进行优化求解,并传入目标函数、初始值、
# 取值范围以及约束条件等参数
res = minimize(myobj, x0, bounds=bound, constraints=mycons, options={'disp': True, 'maxiter': 200},
callback=xcall.append)
# 打印优化结果,包括最优值、求解状态、最优解以及求解信息
print(res.fun, '
', res.success, '
', res.x, res.message)
# 将每次迭代的结果保存到文件中
for i in range(len(xcall)):
np.savetxt('中间结果' + str(i) + '.csv', xcall[i])
# # 下面是绘图部分,用于可视化搜索过程
# # 设置字体和负号显示
# plt.rcParams['font.sans-serif'] = ['FangSong']
# plt.rcParams['axes.unicode_minus'] = False
#
# # 绘制搜索过程中目标函数值的变化曲线
# plt.xlabel('搜索次数(次)', fontsize=13)
# plt.plot(np.arange(len(xcall)), -np.array([x[0] for x in xcall]), marker='.')
# plt.show()
原文地址: https://www.cveoy.top/t/topic/fOgS 著作权归作者所有。请勿转载和采集!