大家好,本文将围绕python数学建模基础教程展开说明,如何用python数学建模是一个很多人都想弄明白的事情,想搞清楚python数学建模资料需要先了解以下几个事情。
第 4 章 线性规划和整数规划模型
4.1 线性规划(Linear Programming,LP)
4.1.1 线性规划模型
线性规划模型的一般形式
,
或简写为
其向量表示形式为
其矩阵表示形式为
其中, 为目标函数的系数向量,又称为价值向量;
为决策向量;
为约束方程组的系数矩阵;
为
的列向量,又称约束方程组的系数向量;
为约束方程组的常数向量。
4.1.2 模型求解及应用
可以使用 Python 的 cvxpy 库,用于求解凸优化问题python用turtle画固定樱花树。http://www.vcxpy.org/
例 4.2 求解线性规划模型
# 程序文件 ex4_2.py
import cvxpy as cp
from numpy import array
c = array([70, 50, 60]) # 定义目标向量
a = array([[2, 4, 3],[3, 1, 5], [7, 3, 5]]) # 定义约束矩阵
b = array([150, 160, 200]) # 定义约束条件的右边向量
x = cp.Variable(3, pos=True) # 定义 3 个决策变量
obj = cp.Maximize(c@x) # 构造目标函数
cons = [a@x<=b] # 构造约束条件
prob = cp.Problem(obj, cons)
prob.solve(solver='GLPK_MI') # 求解问题
print('最优解为:', x.value)
print('最优值为:', prob.value)
例 4.3 某部分今后 5 年考虑以下投资项目,已知:
项目A,从第一年到第四年每年年初需投资,并于次年末收回本利 115%。
项目B,从第三年初需投资,到第五年末能回收本利125%,最大投资额不超过4万元。
项目C,第二年初需投资,到第五年末能收回本利140%,最大投资额不超过3万元。
项目D,五年内每年初购买,于当年末归还,利息收益6%。
部门现有资金10万元,试问如何确定这些项目每年投资额,使第五年末本利总额最大?
建立线性规划模型
# 程序文件 ex4_3.py
import cvxpy as cp
x = cp.Variable((5, 4), pos=True)
obj = cp.Maximize(1.15*x[3, 0]+1.40*x[1, 2]+1.25*x[2, 1]+1.06*x[4, 3])
cons = [x[0, 0]+x[0, 3] == 100000,
x[1, 0]+x[1, 2]+x[1, 3] == 1.06*x[0, 3],
x[2, 0]+x[2, 1]+x[2, 3] == 1.15*x[0, 0]+1.06*x[1, 3],
x[3, 0]+x[3, 3] == 1.15*x[1, 0]+1.06*x[2, 3],
x[4, 3] == 1.15*x[2, 0]+1.06*x[3, 3],
x[2, 1]<=40000,x[1,2]<=30000]
prob = cp.Problem(obj, cons)
prob.solve(solver='GLPK_MI')
print('最优解为:', x.value)
print('最优值为:', prob.value)
例 4.4 捷运公司在下一年度的 1~4 月拟租用仓库堆放物资。已知各月所需仓库面积如表 4.2 所示,仓库租借费用随合同同期而定,期限越长,折扣越大。合同每月初均可办理,规定租用面积和期限。每次办理可签一份合同,也可签若干份租用面积和期限不同的合同,试确定该公司签订租借合同的最优决策,使所付租借费用最小。
月份 | 1 | 2 | 3 | 4 |
所需仓库面积 / 100 |
15 | 10 | 20 | 12 |
合同租借期限 / 月 | 1 | 2 | 3 | 4 |
合同期内的租费 / 元 | 2800 | 4500 | 6000 | 7300 |
建立线性规划模型
# 程序文件 ex4_4.py
import cvxpy as cp
x = cp.Variable((4, 4), pos=True)
obj = cp.Minimize(2800*sum(x[:,0])+4500*sum(x[:3,1])+6000*sum(x[:2,2])+7300*x[0,3])
cons = [sum(x[1,:])>=15,
sum(x[0,1:])+sum(x[2,:3])>=10,
sum(x[0,2:])+sum(x[1,1:3])+sum(x[2,:2])>=20,
x[0,3]+x[1,2]+x[2,1]+x[3,0]>=12]
prob = cp.Problem(obj, cons)
prob.solve(solver='GLPK_MI')
print('最优解为:\n',x.value)
print('最优值为:',prob.value)
例 4.5 计算 6 个产地 8 个销地的最小费用运输问题,单位商品运价如表 4.3 所示
产量 | |||||||||
6 | 4 | 6 | 7 | 4 | 2 | 5 | 9 | 60 | |
4 | 9 | 5 | 3 | 8 | 5 |