这段代码使用 Python 的优化库 scipy.optimize 来求解一个多目标优化问题。具体来说,它通过最小化一个目标函数 obj 来找到使得约束条件 con2con3 成立的最优解。

首先,定义了目标函数 obj,它是一个关于变量 xy 的函数。这个函数根据一些数学公式计算了一个值,并将其归一化到特定的范围。这个值是优化问题的一个目标,我们希望最小化这个值。

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)

接下来,定义了约束条件 con2con3。这些约束条件是关于变量 xy 的函数,它们限制了变量的取值范围。这里使用了不等式约束,因为我们希望变量的取值满足特定的不等式关系。

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)  # 输出最优值、求解状态、最优解
Python SciPy 优化库求解多目标优化问题

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

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