文章目录

  • 线性规划
  • 整数规划
    • 一般的整数线性规划问题
    • 0-1整数规划
    • 广义指派问题
  • 非线性规划
    • 二次规划

线性规划

 运筹学对于线性规划问题直接使用图解法,单纯形法利用求解。在python中可以直接使用scipy.optimize模块的linprog函数求解。
linprog函数的调用方式:

     scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None,method='highs', callback=None, options=None, x0=None, integrality=None)

常用参数解释:
(1)  c:价格向量
(2)  A_ub:不等式约束技术系数矩阵
(3)  b_ub:不等式约束资源向量
(4)  A_eq:等式约束技术系数矩阵
(5)  b_eq:等输约束资源向量
(6)  bounds:表示决策变量的上下界的元组。这里值得注意的是每个决策变量的上下界默认为(0,None),None在linprog函数中表示正/负无穷。如果有变量不是这个范围都要记得修改bounds参数
将数学模型化为linprog支持的形式

示例
 求解的难点就是把上面的各个参数表示出来

# 导入linprog函数和numpy包
import numpy as np
from scipy.optimize import linprog
#注意,对于shape==(n,)的数组,可以理解为列向量,也可以理解为行向量
c=np.array([-1,2,3])
A_ub=np.array([[-2,1,1],[3,-1,-2]])
A_eq=np.array([[4,-2,-1]])
b_ub=np.array([9,-4])
b_eq=np.array([-6])
low=[-10,0,None];high=[None]*3
bounds=tuple(zip(low,high))
res=linprog(c,A_ub,b_ub,A_eq,b_eq,bounds)
print("求解状态:",res.status)
print("最优解:",res.x)
print("最优值:",-res.fun)

整数规划

一般的整数线性规划问题

 什么是整数规划:限制全部或部分决策变量的取值为整数的线性规划问题。
 不比线性规划有单纯形法杀穿一切,没有一种算法可以有效解决一切整数规划问题。但是对于使用python直接用cvxpy无脑求解就行了。
 cvxpy是一种用于凸优化问题的Python嵌入式建模语言。它会自动将问题转换为标准形式,调用解算器,并解开结果。
 关于cvxpy的一些基础操作:

1.用Variables创建决策变量
语法:class cvxpy.expressions.variable.Variable(shape: int | Iterable[int, ...] = (), name: str | None = None, var_id: int | None = None, **kwargs: Any)
常用参数:
(1)shape:决定创建的决策变量的形状,决策变量可以是标量,向量,矩阵。比如我需要5个决策变量:x1,x2,
x3,x4,x5。我就可以这样创建决策变量:x=cp.Varible(5) ,x是一个向量(x1,x2,x3,x4,x5)
(2)integer:设定决策变量为整数。x=cp.Varible(5,integer=True)
2.用Problem生成问题
语法:class cvxpy.Problem(objective: Union[Minimize, Maximize], constraints: Optional[List[Constraint]] = None)
就是把目标(objective)和约束条件(constraints)传入就可以了
3.用Minimize或者Maximize函数生成objective
语法:class cvxpy.Maximize(expr)  其中expr必须是标量class cvxpy.Minimize(expr)
4.用solve求解问题
语法:solve(*args, **kwargs)
常用参数:
(1)solver:求解器,不同的问题可能需要选择不同的求解器下面给出常用求解器以及适用范围


示例

import cvxpy as cp
import numpy as np
c=np.array([40,90])
x=cp.Variable(2,integer=True)
cons1=[np.array([9,7])@x<=56]
cons2=[np.array([7,20])@x>=70]
cons3=[x>=0]
cons=cons1+cons2+cons3
obj=cp.Minimize(c@x)
problem=cp.Problem(obj,cons)
problem.solve(solver="GLPK_MI")
print("求解状态:",problem.status)
print("最优解:",x.value)
print('最优值:',problem.value)

0-1整数规划

 0-1整数规划是指在整数规划的基础上限制决策变量只能取0-1,求解方式与一般的整数规划大同小异,只不过给决策变量加一个限制:既要大于等于0又要小于等于1.于是逼迫决策变量为整数时只能取0或1。
 指派问题的标准形式经常表现为0-1规划模型,标准指派问题的特点是:一个人只可以干一项工作,一项工作只能被一个人干。基于这种特点可以想到指派问题的解是一个置换矩阵(各行各列和为1),因为这样才能保证上述特征。
示例

import cvxpy as cp
import numpy as np
x=cp.Variable((5,5),integer=True)
c=np.array([[ 4,8,7,15,12],[ 7,9,17,14,10],[ 6,9,12,8,7.],[ 6,7,14,6,10.],[ 6,9,12,10,6.]])
# 用(*)做元素级乘法报错了,所以改用mutiply。我不太清楚为什么不能用(*)做
obj=cp.Minimize(cp.sum(cp.multiply(c,x)))
cons1=[cp.sum(x,axis=0)==1]
cons2=[cp.sum(x,axis=1)==1]
cons3=[x>=0,x<=1]
cons=cons1+cons2+cons3
prob=cp.Problem(obj,cons)
prob.solve(solver='GLPK_MI')
print(prob.status)
print(prob.value)
print(x.value)

广义指派问题

 广义指派问题和标准指派问题差异在与后者可能是目标函数求极大值,人数与任务量不等,一人可有多个任务,某任务不能有某人完成。要手算的话这种问题需要化为标准形式再用匈牙利算法。但是用python直接当做一般的整数规划问题就行了。
示例

import cvxpy as cp
import numpy as np
x=cp.Variable((2,7),integer=True)
l=np.array([48.7,52.0,61.3,72.0,48.7,52.0,64.0])
w=np.array([2000,3000,1000,500,4000,2000,1000])
a=np.array([8,7,9,6,6,4,8])
# 不太目标为什么cvxpy中(7,)和(2,7)不能广播,在numpy中是可以广播的。改成(1,7)后没问题。
total_load=cp.sum(cp.multiply(l.reshape(1,7),x))
obj=cp.Maximize(total_load)
cons1=[cp.sum(x,axis=0)<=a]
cons2=[cp.multiply(l.reshape(1,7),x)<=1020]
cons3=[cp.multiply(w.reshape(1,7),x)<=40000]
cons4=[cp.sum(cp.multiply(l[4:].reshape(1,3),x[:,4:]))<=302.7]
cons5=[x>=0]
cons=cons1+cons2+cons3+cons4+cons5
prob=cp.Problem(obj,cons)
prob.solve(solver='GLPK_MI')
print(prob.status)
print(prob.value)
print(x.value)

import cvxpy as cp
import numpy as np
# 决策变量X={x_ij | i=1,2 and j=1,2,3,4,5,6,7}, x_ij为整数
X=cp.Variable((2,7),integer=True)
# 厚度系数向量
L=np.array([48.7,52.0,61.3,72.0,48.7,52.0,64.0])
# 重量系数向量
W=np.array([2000,3000,1000,500,4000,2000,1000])
# 件数向量
A=np.array([8,7,9,6,6,4,8])
# 限制条件1:两个平板车上j种货物的装载量之和小于j种货物数量
cons1=[cp.sum(X,axis=0)<=A]
# 限制条件2:一个平板车上各种货物的厚度和小于1020
cons2=[cp.multiply(L.reshape(1,7),X)<=1020]
# 限制条件3:一个平板车上各种货物的重量和小于40000
cons3=[cp.multiply(W.reshape(1,7),X)<=40000]
# 限制条件4:两辆平板车上5,6,7类货箱的厚度和不超过302.7
cons4=[cp.sum(cp.multiply(X[:,4:],L[4:].reshape(1,3)))<=302.7]
# 限制条件5:X>=0
cons5=[X>=0]
# 限制条件
constraints=cons1+cons2+cons3+cons4+cons5
# 目标:两辆平板车装的重量最大
objective=cp.Maximize(cp.sum(cp.multiply(W.reshape(1,7),X)))
# 创建问题
problem=cp.Problem(objective,constraints)
# 求解
problem.solve(solver='GLPK_MI')
print(problem.status)
print(problem.value)
print(X.value)

非线性规划

 手算非线性规划问题比较麻烦,用python来算是比较简单的。scipy.optimize模块的minimize函数或cvxpy包配合上支持求解非线性规划的solver都可以来求解非线性规划问题。
 非线性规划是指有非线性约束条件或目标函数的数学规划,是运筹学的一个重要分支。非线性规划研究一个n元实函数在一组等式或不等式的约束条件下的极值问题,且目标函数和约束条件至少有一个是未知量的非线性函数。
 使用minimize函数求解的基础知识(minimize貌似没法解既有不等式约束又有等式约束的非线性规划问题)

1.语法:scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)
2.常用参数:
(1)fun:要被极小化的可调用函数,它含有一个参数x,这个参数应该被视为一个shape==(n,)的向量
(2)x0:最优解的初始估计值,它也是一个向量且x0.shape==x.shape
(3)bounds:决策变量的上下界的元组
(4)constraints:这个constraints是一个字典,比较常用
的两个key是'type'和'fun'。前者用于表明约束条件的类型:
可选‘eq’或‘ineq’。后者是用来定义约束的可调用函数对象。
这里有一个易错点:Equality constraint means that the constraint function result is to be zero whereas inequality means that it is to be non-negative. Note that COBYLA only supports inequality constraints.
意思就是说如果你的约束类型是等式约束,那么这个等式约束右侧应该为0.如果是不等式约束,那么不等式应该是大于0的,比如AX<=b,应该变形为b-AX>=0.于是f(x)=b-AX.

示例

from scipy.optimize import minimize
import numpy as np
# 这道题的obj是没法用矩阵运算表示出来的,所以用用这种方式定义函数。
# 一维序列如list和tuple都可以当做行向量或列向量。于是x还是一个向量。
def obj(x):x1,x2,x3=xreturn (2+x1)/(1+x2)-3*x1+4*x3
# 设初始猜测的最优解看着范围猜,别太离谱
x0=[0.6]*3
low=[0.1]*3;high=[0.9]*3
bounds=tuple(zip(low,high))
# 非线性规划可以没有约束条件
res=minimize(obj,x0,bounds=bounds)
res

from scipy.optimize import minimize
# 目标化为一般形式:min z'=-...,最优解不变,最优值互为相反数
# 这题目标函数也可以写为 lambda x:np.array([-1,-1,-3,-4,-2])@x+np.array([8,2,3,1,2])@x
def objective(x):return np.array([-1,-1,-3,-4,-2])@x**2+np.array([8,2,3,1,2])@x
# Equality constraint means that the constraint function result is to be zero whereas inequality means that it is to be non-negative.
# 所以定义不等式约束的函数fun>=0
A=[[1,1,1,1,1],[1,2,2,1,6],[2,1,6,0,0],[0,0,1,1,5]]
b=np.array([400,800,200,200])
def fun(x):return b-A@x
constraints={'type':'ineq','fun':fun}
# 决策变量的上下界元组
low=[0]*5
high=[99]*5
bounds=tuple(zip(low,high))
x0=np.ones(5)*50
res=minimize(objective,x0,bounds=bounds,constraints=constraints)
print('求解状态:',res.success)
print("最优解:",res.x)
print("最优值:",-res.fun)

二次规划

 二次规划指的是目标为决策变量的二次函数而约束全部是线性的非线性规划问题。这种问题可以用cvxpy包加上支持二次规划的solver进行求解。
示例

import cvxpy as cp
import numpy as np
c1=np.array([1.5,1,0.85]);c2=np.array([3,-8.2,-1.95])
x=cp.Variable(3) # x.shape==(3,)
objective=cp.Minimize(c1@x**2+c2@x)
cons1=[np.array([1,0,1])@x<=2]
cons2=[np.array([-1,2,0])@x<=2]
cons3=[np.array([0,1,2])@x<=3]
cons4=[np.ones(3)@x==3]
cons=cons1+cons2+cons3+cons4
problem=cp.Problem(objective,cons)
problem.solve(solver="ECOS")
print(problem.status)
print(problem.value)
print(x.value)

数学建模——规划问题相关推荐

  1. MATLAB数学建模-规划模型总结| MATLAB求解

    目录 1 线性规划问题(LP) 风格1 风格2 2 非线性规划 3 动态规划 A星算法 基于dijkstra的概率路线图 4 多目标规划 帕累托最优 支配(Dominace) 不可支配解集 帕累托最优 ...

  2. (二)MATLAB数学建模——规划问题

    目录 一.简介 二.线性规划 (一)线性规划问题解的概念 (二)实例运用 三.非线性规划 (一)非线性规划问题解的概念 (二)实例运用 一.简介 规划类问题是常见的数学建模问题,利用Matlab可以简 ...

  3. 数学建模 —— 规划模型

    文章目录 前言 一.数学规划的一般形式 二.线性规划 1.MATLAB中线性规划的标准型 2.MATLAB求解线性规划的函数 -- linprog 三.非线性规划 1.MATLAB中非线性规划的标准型 ...

  4. 数学建模——规划模型

    一:线性规划问题 定义:在一组线性规划约束条件的限制下,求一线性目标函数最大或最小值的问题. 线性规划标准式: 目标函数:f(x)= 约束条件:{Ax<=b Aeq*x=beq lb<=x ...

  5. 【数学建模】非线性规划模型与01规划模型(最优化)

    文章目录 一.算法介绍 1. 01规划模型 二.适用问题 三.算法总结 四.应用场景举例 1.非线性规划模型 2.01规划模型 五.LINGO代码 1.非线性规划模型 2.01规划模型 六.实际案例 ...

  6. Python小白的数学建模课-05.0-1规划

    0-1 规划不仅是数模竞赛中的常见题型,也具有重要的现实意义. 双十一促销中网购平台要求二选一,就是互斥的决策问题,可以用 0-1规划建模. 小白学习 0-1 规划,首先要学会识别 0-1规划,学习将 ...

  7. 2022国赛数学建模思路 - 复盘:生成规划模型

    2022 高教社杯(国赛数学建模)思路解析 2022高教社杯ABCD赛题思路解析: https://blog.csdn.net/dc_sinor/article/details/126211983 0 ...

  8. 2016年全国研究生数学建模竞赛华为杯A题多无人机协同任务规划求解全过程文档及程序

    2016年全国研究生数学建模竞赛华为杯 A题 多无人机协同任务规划 原题再现:   无人机(Unmanned Aerial Vehicle,UAV)是一种具备自主飞行和独立执行任务能力的新型作战平台, ...

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

    前言:规划问题分为线性规划和非线性规划两大类,其中线性规划采用cvxpy库就可以解决:非线性规划分为凸规划和非凸规划,做题时应先判断是否是凸规划.对于凸规划采用cvxpy可以解决,非凸规划采用scip ...

最新文章

  1. 仅展示近三天的动态设置_微信朋友圈设置三天可见了吗?
  2. springboot2.0系列(二):配置属性
  3. php截取字符串函数 左右,php截取中文字符串函数的技巧
  4. 深入了解jquery中的ajax方法参数
  5. [裴礼文数学分析中的典型问题与方法习题参考解答]5.1.8
  6. UTM坐标和WGS84坐标(如何转换?)
  7. 日本JAFFE表情库
  8. Windwos tar 命令详解
  9. 解谜游戏中谜题与剧本
  10. java 对战平台-魔兽版
  11. 在传统软件公司十年深恶痛绝的感受
  12. 从零开始仿写一个抖音App——音视频开篇,移动安全入门
  13. java与英语词汇_Java英语词汇表
  14. 已知函数fx=sin(wx+φ)_考点13 y=sin(wx+φ)的图像与性质(解析版)
  15. 作为成员的结构体(作为结构体的成员的结构体)
  16. CPU性能测试工具-Unixbench
  17. java连连看实验报告_连连看实验报告
  18. AT24C02读写程序
  19. 曼哈顿距离和欧氏距离
  20. [ue4] 着色器绑定(Shader Binding)

热门文章

  1. C++ 测试CFile读写文本
  2. Python 文件查找
  3. 【Axure交互教程】利用全局变量实现跨页面传值
  4. (Arduino)ESP8266通过局域网通信控制LED
  5. 手机LBS位置应用服务盘点
  6. 【react】react18的学习(三)--hooks组件
  7. 《X3D: Expanding Architectures for Efficient Video Recognition》论文详解
  8. [学习记录]浅谈Android硬件加速
  9. 状态报告:Ceylon TypeScript Loader GSoC项目
  10. 西门子PCS7系统NTP网络时钟同步(NTP时钟发生器)介绍