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()
基于Scipy.optimize.minimize实现的二元目标函数优化

原文地址: https://www.cveoy.top/t/topic/fOgS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录