数学建模之优化问题中的规划问题

发布于:2023-01-13 ⋅ 阅读:(444) ⋅ 点赞:(0)

前言:规划问题分为线性规划和非线性规划两大类,其中线性规划采用cvxpy库就可以解决;非线性规划分为凸规划和非凸规划,做题时应先判断是否是凸规划。对于凸规划采用cvxpy可以解决,非凸规划采用scipy.optimize中的minimize函数解决。每一个小节的实例及代码在参考书籍上都有,文章中就没有打出。

当然对于规划类问题,首推的还是lingo:lingo可以解决所有的规划问题,对于多目标规划化和Python一样无法直接求解,化成单目标即可。推荐学习视频:b站up:爆肝杰哥

Lingo建模基础入门_Savanna07的博客-CSDN博客_lingo中if函数的用法例题

参考书籍:《python数学建模算法与应用》 司守奎 孙玺菁  (强烈推荐!)

具体代码书上有写我就没有再敲出来

1、线性规划模型:求解优化问题(LP

库:cvxpy numpy pandas

cvxpy是用于求解凸规划问题的库,在使用前必须要验证目标函数和约束条件都是凸函数,但对于线性规划可以直接使用。

步骤:

1、构造目标函数的系数向量、约束矩阵、常数向量(如果这三个都十分简单也可以不用构造矩阵,直接在下面的表达式中表达)

2、未知数:x=cp.Variable(n,pos/integer=True) pos/integer设置是小数还是整数

cvxpy中有三种数据类型,标量、向量和矩阵。n可以是数字,也可以是矩阵,

矩阵的行和列都是从0开始计数的。

3、目标函数:obj=cp.Maximize/Minimize(expression)

矩阵乘法用x@y,矩阵对应元素相乘用cp.multiply(x,y)

cp.sum()可以在里面包含有未知数,常常obj=cp.Minimize(cp.sum(cp.multiply(x,y)))

cp.quad_form(x,p):求x’px的函数,x’表示x的转置

4、约束条件:支持多个约束条件放在一起 cons=[expression1,expression2…]

5、求解:prob=cp.Problem(obj,cons)

prob.solve(solver=”GLPK_MI”)          solver=”GLPK_MI”:求解线性规划

x.value:最优解                       prob.value:最优值

6、灵敏度分析

数学建模评价类方法01——灵敏度分析_显然易证的博客-CSDN博客_数学建模灵敏度分析

灵敏度分析:将模型中一个容易受到外界影响的参数(该参数在模型中已经有确定的值)未知数化,分析他变化时的各种结果的变化。

分析方法:1、求偏导法:对目标函数中的决策变量求偏导(适用于简单函数,复杂函数一般不连续)

                  2、蒙特卡洛技术

2、整数规划要求一部分或全部决策变量必须取整数值的规划问题成为整数规划(IP)

如果一个线性规划模型中的部分或全部决策变量取整数值,则该线性规划模型为整数线性规划模型。

常见的有:背包问题,指派问题(两者均为0-1规划),旅行商问题(TSP)

算法和线性规划一致,只需要在设置未知数时integer=True

0-1规划在构造约束条件时可以用cp.sum(x,axis=0/1)来表示0-1变量的值

3、非线性规划:在目标函数或约束条件中至少有一个表达式是非线性的函数

线性规划问题的最优解只能在可行域的边界上取得(特别是在可行域的顶点处取得),求出的解也是全局最优解。而非线性规划的最优解可能在可行域的任意一点取得,且一般求出的最优解也只是局部最优解

因为cvxpy只能求解凸规划问题,所以遇到非线性规划一定要先判断是否是凸规划,如果不是则采用scipy.optimize模块解决。(但有些非凸规划中我用cvxpy也能解出答案,不是很懂为什么?)

凸规划有以下性质:

1、局部最优解就是全局最优解

2、当目标函数是严格凸函数时,最优解唯一

凸函数:f(x1+x2)<=f(x1)+f(x2)   严格凸函数:f(x1+x2)<f(x1)+f(x2)

如何判断凸规划:对目标函数和约束条件求Hesse矩阵,Hesse矩阵半正定(各阶顺序主子式>=0),如果全部正定(各阶顺序主子式>0)则为严格凸规划。线性函数不用求。

Hesse矩阵:函数对各个变量的二阶偏导数矩阵,如下图所示。

步骤:和线性规划一致,但在解题步骤时solver要进行改变

比如在非线性规划中无整数时可以用CVXOPT,有整数时可以使用CPLEX

注:LP代表线性规划,无论是否有整数都用GLPK_MI;MIP代表就是含有整数的规划问题

4、二次规划模型:特殊的非线性规划模型(QP

目标函数是决策向量的二次函数,约束条件都是线性的

步骤:和非线性模型的解题步骤相同

5、非凸规划问题

非凸规划问题采用scipy.optimize模块中的minimize函数求解,求出的只是局部最优解

python 非线性规划(scipy.optimize.minimize)_ronaldo2018的博客-CSDN博客_scipy.optimize.minimize

函数解释:minimize(fun,x0,constraints=con,bounds=bd)

fun:求最小值的目标函数,如果是求最大值则取负号

x0:变量的初始猜测值,如果有多个变量需要每个都有。常见的可以用np.random.randon(n)来设置

constraints:约束条件

bounds:决策向量的界限

因为是局部最优解,如果想要得到全局最优解可以多设置几组初始猜测值,将得到的结果进行对比,找出最小的那个就可能是全局最优解。

6、多目标规划:同时希望每个目标都尽可能大(或小)

在多目标规划问题中一般不能求出绝对最优解,求的是满意解或有效解。

满意解:决策者给每个目标函数一个上限(或下限),当在这个范围内时就是满意的,对应的解为满意解

准备工作:因为目标函数的不可公度性,在求解前需要对目标函数进行预处理

(1)无量纲化处理

(2)数量级归一化处理:数量级大的目标容易在决策时占优,从而影响决策结果

解题方法:

1、线性加权法

根据目标的重要性确定一个权重,以目标函数的加权平均值为评价函数,求评价函数的最优解。

该方法具有较强的主观性,重要程度高的权重大,重要程度低的权重小。权重可以在网上查找相关论文,根据他人给出的权重来作为参考。

2、理想点法

将每个单目标最优值求出,使每个目标函数与理想值得差的平方和最小

第一步:求出每个目标函数的理想值(单目标规划问题)

第二步:构造每个目标函数与理想值差的平方和

第三步:求构造后的函数的最优解

3、优先级法(序贯解法)

根据目标重要性分先后级,先求优先级高的目标函数的最优值,将求出的最优值作为条件求下一级目标函数的最优值,依次类推

第一步:确定优先级

第二步:求第一级单目标最优值

第三步:以第一级单目标等于最优值为约束,求第二级目标最优

第四步:以第一、第二级单目标等于其最优值为约束,求第三级目标最优。以此类推

 例如动态规划等其他规划问题就不在此讲述了

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到