引入
常见的收益率、空间运动、运输问题等问题,往往设计到的形式,属于非线性,需要用到非线性规划。
非线性规划
一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。
模型特点
- 至少一个变量时非线性。
- 线性规划有求准确解的一般方法,且最优解只存在于可行域的边界上;而非线性规划还没有适合各种问题的一般解法,且其最优解(如果有)可能在其可行域的任意一点达到。
- 对于建模来说,一般求近似解
非线性规划模型的标准型
Python代码
import numpy as np
from scipy.optimize import minimize
# 目标函数
def quadratic_objective(variables):
return variables[0] ** 2 + variables[1] ** 2 + variables[2] ** 2 + 8
# 约束条件 constraint1 到 constraint4
def inequality_constraint_1(variables):
return variables[0] ** 2 - variables[1] + variables[2] ** 2
def inequality_constraint_2(variables):
return -(variables[0] + variables[1] ** 2 + variables[2] ** 2 - 20)
def equality_constraint_1(variables):
return -variables[0] - variables[1] ** 2 + 2
def equality_constraint_2(variables):
return variables[1] + 2 * variables[2] ** 2 - 3
# 边界约束 bounds
lower_bound = (0.0, None)
bounds = (lower_bound, lower_bound, lower_bound)
# 约束字典 constraints
constraint_1_dict = {'type': 'ineq', 'fun': inequality_constraint_1}
constraint_2_dict = {'type': 'ineq', 'fun': inequality_constraint_2}
constraint_3_dict = {'type': 'eq', 'fun': equality_constraint_1}
constraint_4_dict = {'type': 'eq', 'fun': equality_constraint_2}
constraints = (constraint_1_dict, constraint_2_dict, constraint_3_dict, constraint_4_dict)
# 初始化初始变量 initial_variables
initial_variables = np.array([0, 0, 0])
# 使用 minimize 函数求解优化问题
solution = minimize(quadratic_objective, initial_variables, method='SLSQP', bounds=bounds, constraints=constraints)
optimized_variables = solution.x
print('目标值: ' + str(quadratic_objective(optimized_variables)))
print('答案为')
print('x1 = ' + str(optimized_variables[0]))
print('x2 = ' + str(optimized_variables[1]))
print('x3 = ' + str(optimized_variables[2]))