数学建模笔记(三)非线性规划和多目标优化

文章目录

  • 数学建模笔记(三)非线性规划和多目标优化
      • 非线性规划概念和理论
          • 非线性规划问题的数学模型
          • 有约束非线性规划的求解
          • 凸规划
      • 一个简单的非线性规划模型
      • 二次规划模型
      • 多目标规划问题

数学建模笔记(三)非线性规划和多目标优化

非线性规划概念和理论

非线性规划问题的数学模型

数学建模笔记(三)非线性规划和多目标优化_第1张图片

有约束非线性规划的求解

常见的处理思路是:可能的话将非线性问题转化为线性问题,将约束问题转化为无约束问题。
1.对有等式约束的非线性规划问题使用Lagrange乘数法求解
2.罚函数法:
利用目标函数和约束函数构造带参数的增广目标函数,从而转换成一系列无约束非线性规划问题来进行求解。

凸规划

基本概念:
1.凸集与凸函数的定义
凸集:
在这里插入图片描述凸函数:
在这里插入图片描述数学建模笔记(三)非线性规划和多目标优化_第2张图片例题1.
数学建模笔记(三)非线性规划和多目标优化_第3张图片求解:
先对目标函数和约束函数中的非线性函数求二阶行列式,若均大于0,则是凸优化问题。
求解代码:

import numpy as np
import cvxpy as cp
x=cp.Variable(2,pos=True)
obj=cp.Minimize(sum(x**2)-4*x[0]+4)
con=[-x[0]+x[1]-2<=0,
x[0]**2-x[1]+1<=0]
prob = cp.Problem(obj, con)
prob.solve(solver='CVXOPT')
print("最优值为:",round(prob.value,4))
print("最优解为:\n", np.round(x.value,4))
#-------------结果--------------
最优值为: 3.7989
最优解为:
 [0.5536 1.3064]

一个简单的非线性规划模型

数学建模五步骤:
提出问题、选择建模方法、推导模型的数学表达式、求解模型、回答问题
例题2.
数学建模笔记(三)非线性规划和多目标优化_第4张图片19英寸数量 x 1 x_1 x1
21英寸数量 x 2 x_2 x2
19英寸利润 x 1 ∗ ( 339 − 195 − 0.01 x 1 − 0.003 x 2 ) x_1* (339-195-0.01x_1-0.003x_2) x1(3391950.01x10.003x2)
21英寸利润 x 2 ∗ ( 399 − 225 − 0.01 x 2 − 0.004 x 1 ) x_2* (399-225-0.01x_2-0.004x_1) x2(3992250.01x20.004x1)
总利润 x 1 ∗ ( 339 − 195 − 0.01 x 1 − 0.003 x 2 ) + x 2 ∗ ( 399 − 225 − 0.01 x 2 − 0.004 x 1 ) − 400000 x_1*(339-195-0.01x_1-0.003x_2)+x_2*(399-225-0.01x_2-0.004x_1)-400000 x1(3391950.01x10.003x2)+x2(3992250.01x20.004x1)400000
问题求解:


import sympy as sp
import pylab as plt
plt.rc('text', usetex=True) #使用 LaTeX字体
plt.rc('font',size=14)
sp.var('x1, x2') #定义符号变量
y = (339-0.01*x1-0.003*x2)*x1+(399-0.004*x1-0.01*x2)*x2-(400000+195*x1+225*x2)
y = sp.simplify(y) #化简
dy1 = y.diff(x1) #求关于 x1的偏导
dy2 = y.diff(x2) #求关于 x2的偏导
s = sp.solve([dy1, dy2], [x1, x2])
x10 = round(float(s[x1])) #取整
x20 = round(float(s[x2]))
y0 = y.subs({x1: x10, x2: x20}) #符号函数代入数值
f = sp.lambdify('x1, x2', y, 'numpy') #符号函数转换为匿名函数
x = plt.linspace(0, 10000, 100)
X, Y = plt.meshgrid(x, x) #转换为网格数据
Z = f(X, Y)
ax=plt.subplot(121, projection='3d') #第一个子窗口三维画图
ax.plot_surface(X, Y, Z,cmap='viridis')
ax.set_xlabel('$x_1$'); ax.set_ylabel('$x_2$')
plt.subplot(122) #激活第二个子窗口
contr=plt.contour(X,Y,Z,10) #10条等高线
plt.clabel(contr) #等高线标注
plt.ylabel('$x_2$',rotation=0)
plt.xlabel('$x_1$')
sp.var('a', pos=True) #定义灵敏度 分析 的符号参数
y = (339-a*x1-0.003*x2)*x1+(399-0.004*x1-0.01*x2)*x2-(400000+195*x1+225*x2)
y = sp.simplify(y) #化简
dy1 = y.diff(x1) #求关于 x1的偏导
dy2 = y.diff(x2) #求关于 x2的偏导
s = sp.solve([dy1, dy2], [x1, x2])
sx1 = s[x1]; sx2 = s[x2] #提取解分量
s1 = sp.lambdify('a', sx1, 'numpy') #符号函数转换为匿名函数
s2 = sp.lambdify('a', sx2, 'numpy')
a0 = plt.linspace(0.002, 0.02, 50)
plt.figure()
plt.subplots_adjust(wspace = 0.65)
plt.subplot(121); plt.plot(a0, s1(a0))
plt.xlabel('$a$'); plt.ylabel('$x_1$')
plt.subplot(122); plt.plot(a0, s2(a0))
plt.xlabel('$a$'); plt.ylabel('$x_2$')
#plt.subplot_tool() #调整位置的工具
dx1 = sx1.diff(a); dx10 = dx1.subs(a, 0.01)
sx1a = dx10 * 0.01 / 4735
dx2 = sx2.diff(a); dx20 = dx2.subs(a, 0.01)
sx2a = dx20 * 0.01 / 7043
Y = y.subs({x1: s[x1], x2: s[x2]}) #求关于 a的目标函数
Y = sp.factor(Y); Y = sp.simplify(Y)
Ya = sp.lambdify('a', Y, 'numpy') #转换为匿名函数
a0 = plt.linspace(0.002, 0.02, 1000)
plt.figure(); plt.plot(a0, Ya(a0))
plt.xlabel('$a$'); plt.ylabel('$y$', rotation=0)
Sya = - 4735 ** 2 * 0.01 / 553641.025
y2 = y.subs({x1: 4735, x2: 7043, a: 0.011}) #计算近似最优利润
y3 = Y.subs(a, 0.011) #计算最优利润
delta = (y3 - y2) / y2 #计算利润的相对误差
plt.show()

二次规划模型

定义:
数学建模笔记(三)非线性规划和多目标优化_第5张图片### 非线性规划的求解和应用
对于一般的非线性规划问题,由于不是凸优化,就不能使用cvxpy库求解。而需要使用scipy.optmize模块的minimize函数求解。
例题5.
数学建模笔记(三)非线性规划和多目标优化_第6张图片由于不是凸函数,不能使用cvxpy库求解。
求解程序:

import numpy as np
from scipy.optimize import minimize
c2 = np.array([[-1, -0.15],[-0.15, -2]])
c1 = np.array([98, 277])
a = np.array([[1, 1], [1, -2]])
b = np.array([100, 0])
obj = lambda x: x @ c2 @ x + c1 @ x
con ={'type': 'ineq', 'fun': lambda x: b-a@x}
bd = [(0, np.inf) for i in range(a.shape[1])]
res = minimize(obj, np.ones(2), constraints=con, bounds=bd)
print(res) #输出解的信息
#-------------
 fun: 0.0
     jac: array([ 97.99999999, 276.99999997])
 message: 'Optimization terminated successfully'
    nfev: 6
     nit: 2
    njev: 2
  status: 0
 success: True
       x: array([0., 0.])

多目标规划问题

定义:
数学建模笔记(三)非线性规划和多目标优化_第7张图片一般多目标规划问题没有最优解,只有满意解或有效解。
求有效解的预处理:
(1)无量纲化处理:每个目标函数的量纲通常是不一样的,在进行加权求解时由于量
纲的不可公度性,需要先进行无量纲化处理。
(2)数量级的归一化处理:当各个目标函数的数量级差异较大时,容易出现大数吃小
数现象,即数量级较大的目标在决策分析过程中容易占优,从而影响决策结果。
求解方法:
1.线性加权法
基本思想为根据目标的重要性确定一个权重,以目标函数的加权平均值为评价函数,是其达到最优。
2. ϵ \epsilon ϵ约束化
其中 ϵ i \epsilon_i ϵi是决策者对第i个目标容许接受阈值。
3.理想点法
基本思想:以每个单目标最优值为该目标的理想值,使每个目标函数值与理
想值的差的加权平方和最小。
4.优先级法
基本思想:根据目标重要性分成不同优先级,先求优先级高的目标函数的最优
值,在确保优先级高的目标获得不低于最优值的条件下,再求优先级低的目标函数。

你可能感兴趣的:(数学建模训练笔记)