使用scipy求解优化问题
一、求解二次规划问题
min(X.T * P * X + C.T * X)
s.t. Xi > 0
∑Xi= 1
1.定义目标函数
def objective(x):return 0.5 * np.dot(x, np.dot(P, x)) + np.dot(c, x)
2. 定义等式约束
def equality_constraint(x):return np.sum(x) - 1
3.定义边界约束:x
# 定义边界约束:x 每个维度取值 0-1
bounds = [(0, 1), (0, 1), (0, 1)]
4. 定义约束条件
constraint = {'type': 'eq', 'fun': equality_constraint}
5.初始猜测值
initial_guess = np.array([1/3, 1/3, 1/3])
6.求解
# 使用 minimize 函数求解
result = minimize(objective, initial_guess, method='SLSQP', bounds=bounds, constraints=constraint)# 检查是否成功求解
if result.success:optimal_x = result.xprint(f'最优解 x* = {optimal_x}')print(f'最优目标函数值 = {result.fun}')
else:print("求解失败:", result.message)
7.完整代码
import numpy as np
from scipy.optimize import minimize# 定义对称矩阵 P,每个元素大于 0
P = np.array([[2.0, 0.5, 0.3],[0.5, 3.0, 0.2],[0.3, 0.2, 4.0]])
# 定义任意向量 c
c = np.array([-1.0, -2.0, -3.0])# 定义目标函数
def objective(x):return 0.5 * np.dot(x, np.dot(P, x)) + np.dot(c, x)# 定义等式约束:x 元素之和为 1
def equality_constraint(x):return np.sum(x) - 1# 定义边界约束:x 每个维度取值 0-1
bounds = [(0, 1), (0, 1), (0, 1)]# 定义约束条件
constraint = {'type': 'eq', 'fun': equality_constraint}# 初始猜测值
initial_guess = np.array([1/3, 1/3, 1/3])# 使用 minimize 函数求解
result = minimize(objective, initial_guess, method='SLSQP', bounds=bounds, constraints=constraint)# 检查是否成功求解
if result.success:optimal_x = result.xprint(f'最优解 x* = {optimal_x}')print(f'最优目标函数值 = {result.fun}')
else:print("求解失败:", result.message)