数学建模算法与应用 线性规划(使用cvxpy包)

说明

  • 使用python中cvxpy库完成《数学建模算法与应用》中课后习题

  • 因为本人也是初学者,若代码有错误还请各位指出

cvxpy库的使用

  • 这里以简单例子来使用cvxpy库

maxz=4x1+3x2max\ z = 4x_1 + 3x_2 max z=4x1​+3x2​

s.t.={2x1+x2≤10x1+x2≤8x2≤7xi≥0s.t.= \begin{cases} 2x_1 + x_2 \leq 10\\ x_1 + x_2 \leq 8\\ x_2 \leq 7\\ x_i \geq 0 \end{cases} s.t.=⎩⎪⎪⎪⎨⎪⎪⎪⎧​2x1​+x2​≤10x1​+x2​≤8x2​≤7xi​≥0​

import cvxpy as cp
import numpy as np
# 决策变量
n = 2
# cvxpy使用cp.Variable(n,intger = True)中的intger参数来规定x变量为整数
x = cp.Variable(n, integer=True)
# 约束1
A1 = np.array([[2,1],[1,1],[0,1]])
b1 = np.array([10,8,7])
# 约束2
A2 = np.array([[1,0],[0,1]])
b2 = np.array([0,0])
# 目标函数
c = np.array([4, 3])
# 将最大化目标变为最小化
c = -c
# 定义问题,添加约束条件
prob = cp.Problem(cp.Minimize(c.T @ x),[A1 @ x <= b1, A2 @ x >= b2])
# 求解
ans = -round(prob.solve(solver = cp.ECOS_BB))
# 输出结果
print("目标函数最大值:", ans)
# 对x向量各元素取整数后再输出
value = []
for item in x.value:value.append(round(item))
print(value)

输出

目标函数最大值: 26
[2, 6]

习题

习题1.1

maxz=3x1−x2−x3max \ z = 3x_1-x_2-x_3 max z=3x1​−x2​−x3​

s.t.={x1−2x2+x3≤11−4x1+x2+2x3≥3−2x1+x3=1xi≥0s.t.= \begin{cases} x_1 - 2x_2 + x_3\leq 11\\ -4x_1 + x_2 + 2x_3 \geq 3\\ -2x_1 + x_3 = 1\\ x_i \geq 0 \end{cases} s.t.=⎩⎪⎪⎪⎨⎪⎪⎪⎧​x1​−2x2​+x3​≤11−4x1​+x2​+2x3​≥3−2x1​+x3​=1xi​≥0​

import cvxpy as cp
import numpy as np
# 决策变量
n = 3
x = cp.Variable(n, integer=False)# 约束1
A1 = np.array([1, -2, 1])
b1 = np.array([11])# 约束2
A2 = np.array([-2, 0, 1])
b2 = np.array([1])# 约束3
A3 = np.array([[-4, 1, 2],[1, 0, 0],[0, 1, 0],[0, 0, 1]])
b3 = [3, 0, 0, 0]# 目标函数
c = np.array([3, -1, -1])
c = -c
# 定义问题,添加约束条件
prob = cp.Problem(cp.Minimize(c.T @ x),[A1 @ x <= b1, A2 @ x == b2, A3 @ x >= b3])# 求解
ans = -round(prob.solve(solver=cp.ECOS_BB))# 输出结果
print("目标函数最大值:", ans)
# 对x向量各元素取整数后再输出
print(x.value)

输出

目标函数最大值: 2
[4. 1. 9.]

习题1.2

minz=∣x1∣+2∣x2∣+3∣x3∣+4∣x4∣min \ z = |x_1| + 2|x_2| + 3|x_3| + 4|x_4| min z=∣x1​∣+2∣x2​∣+3∣x3​∣+4∣x4​∣

s.t.={x1−x2−x3+x4=0x1−x2+x3−3x4=1x1−x2−2x3+3x4=−0.5s.t.= \begin{cases} x_1 - x_2 - x_3 + x_4 = 0\\ x_1 - x_2 + x_3 - 3x_4 = 1\\ x_1 - x_2 -2x_3 + 3x_4 = -0.5\\ \end{cases} s.t.=⎩⎪⎨⎪⎧​x1​−x2​−x3​+x4​=0x1​−x2​+x3​−3x4​=1x1​−x2​−2x3​+3x4​=−0.5​

  • 做变量变换ui=xi+∣xi∣2u_{i} = \frac{x_{i}+|x_i|}{2}ui​=2xi​+∣xi​∣​,vi=∣xi∣−xi2v_{i} = \frac{|x_i|-x_i}{2}vi​=2∣xi​∣−xi​​,将模型变换为线性规划模型

mincT(u+v)min \ c^T(u+v) min cT(u+v)

s.t.={A(u−v)≤bu,v≥0s.t.= \begin{cases} A(u-v) \leq b\\ u,v \geq 0 \end{cases} s.t.={A(u−v)≤bu,v≥0​

import cvxpy as cp
import numpy as np
# 决策变量
n = 4
u = cp.Variable(n, integer=False)
v = cp.Variable(n, integer=False)# 约束1
A1 = np.array([[1, -1, -1, 1],[1, -1, 1, -3],[1, -1, -2, 3]])
b1 = np.array([0, 1, -0.5])# 约束2
A2 = np.ones((4, 4))
for i in range(A2.shape[0]):for j in range(A2.shape[1]):if i == j:passelse:A2[i, j] = A2[i, j]*0b2 = np.array([0, 0, 0, 0])# 目标函数
c = np.arange(1, 5, 1)# 定义问题,添加约束条件
prob = cp.Problem(cp.Minimize(c.T @ (u+v)),[A1 @ (u-v) == b1, A2 @ u >= b2, A2 @ v >= b2])# 求解
ans = prob.solve(solver=cp.ECOS_BB)# 输出结果
print("目标函数最小值:", ans)
# 对x向量各元素取整数后再输出
print(u.value - v.value)print(A2)

输出

目标函数最小值: 1.25
[ 2.50000000e-01 -2.97320702e-11  2.28691875e-11 -2.50000000e-01]

习题1.3

   某厂生产三种产品Ⅰ、Ⅱ、Ⅲ。每种产品要经过AAA、BBB两道工序加工。设该厂有两种规格的设备能完成AAA工序,它们以A1,A2A_1,A_2A1​,A2​表示;有三种规格的设备能完成B工序,它们以B1B_1B1​、B2B_2B2​、B3B_3B3​表示。产品Ⅰ可在AAA、BBB任何一种规格设备上加工。产品Ⅱ可在任何规格的AAA设备上加工,但完成BBB工序时,只能在B1B_{1}B1​设备上加工;产品Ⅲ只能在A2A_2A2​和B2B_2B2​设备上加工。已知在各种机床设备的单件工时、原材料费、产品销售单价、各种设备有效台时以及满负荷操作时机床设备的费用如表所示,求最优的生产计划,使该厂利润最大。

算法设计

   对产品Ⅰ来说,设以A1,A2A_1,A_2A1​,A2​完成AAA工序的产品分别为x1x_1x1​、x2x_2x2​件,转入BBB工序时,以B1B_1B1​、B2B_2B2​、B3B_3B3​完成BBB工序的产品分别为x3x_3x3​、x4x_4x4​、x5x_5x5​件;对产品Ⅱ来说,设以以A1,A2A_1,A_2A1​,A2​完成AAA工序的产品分别为x6x_6x6​、x7x_7x7​件,转入BBB工序时,以B1B_1B1​完成BBB工序的产品为x8x_8x8​件;对产品Ⅲ来说,设以A2A_2A2​完成AAA工序的产品为x9x_9x9​,则以B2B_2B2​完成BBB工序的产品也为x9x_9x9​件。

maxz=(1.25−0.25)(x1+x2)+(2−0.35)x8+(2.8−0.5)x9−300600(5x1+10x6)−32110000(7x2+9x7+12x9)−2504000(6x3+8x8)−7837000(4x4+11x9)−200400×7x5\begin{aligned} max \ z &= (1.25-0.25)(x_1 + x_2) + (2 - 0.35) x_8 + (2.8 - 0.5 ) x_9\\ &-\frac{300}{600}(5x_1 + 10x_6)-\frac{321}{10000}(7x_2 + 9x_7 + 12x_9)\\ &-\frac{250}{4000}(6x_3 + 8x_8)-\frac{783}{7000}(4x_4 + 11x_9)-\frac{200}{400} \times 7x_5 \end{aligned} max z​=(1.25−0.25)(x1​+x2​)+(2−0.35)x8​+(2.8−0.5)x9​−600300​(5x1​+10x6​)−10000321​(7x2​+9x7​+12x9​)−4000250​(6x3​+8x8​)−7000783​(4x4​+11x9​)−400200​×7x5​​

s.t.={5x1+10x6≤60007x2+9x7+12x9≤100006x3+8x8≤40004x4+11x9≤70007x5≤4000x1+x2=x3+x4+x5x6+x7=x8xi≥0,i=1,2,...,9s.t.= \begin{cases} 5x_1 + 10x_6 \leq 6000\\ 7x_2 +9 x_7 + 12x_9 \leq 10000\\ 6x_3 + 8x_8 \leq 4000\\ 4x_4 + 11x_9 \leq 7000\\ 7x_5 \leq 4000\\ x_1 + x_2 = x_3 + x_4 + x_5\\ x_6 + x_7 = x_8\\ x_i \geq 0,i = 1,2,...,9 \end{cases} s.t.=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧​5x1​+10x6​≤60007x2​+9x7​+12x9​≤100006x3​+8x8​≤40004x4​+11x9​≤70007x5​≤4000x1​+x2​=x3​+x4​+x5​x6​+x7​=x8​xi​≥0,i=1,2,...,9​

# 决策变量
n = 9
x = cp.Variable(n, integer=True)# 约束1
A1 = np.array([[5,0,0,0,0,10,0,0,0],[0,7,0,0,0,0,9,0,12],[0,0,6,0,0,0,0,8,0],[0,0,0,4,0,0,0,0,11],[0,0,0,0,7,0,0,0,0]])
b1 = np.array([6000,10000,4000,7000,4000])# 约束2
A2 = np.ones((9, 9))
for i in range(A2.shape[0]):for j in range(A2.shape[1]):if i == j:passelse:A2[i, j] = A2[i, j]*0b2 = np.array([0,0,0,0,0,0,0,0,0])#约束3
A3=np.array([[1,1,-1,-1,-1,0,0,0,0],[0,0,0,0,0,1,1,-1,0]])
b3=np.array([0,0])# 定义问题,添加约束条件
prob = cp.Problem(cp.Maximize(x[0] + x[1] + 1.65 * x[7] + 2.3 * x[8] - 0.05 * (5 * x[0] + 10 * x[5])-0.0321 * (7 * x[1] + 9 * x[6] + 12 * x[8])-25/400 * (6 * x[2] + 8 * x[7])-783/7000 * (4 * x[3] + 11 * x[8])-0.35 * x[4]),[A1 @ x <= b1, A2 @ x >= b2, A3 @ x == b3])# 求解
ans = prob.solve(solver=cp.ECOS_BB)# 输出结果
print("目标函数最大值:", ans)
# 对x向量各元素取整数后再输出
print(x.value)

输出

目标函数最大值: 1146.4142000003724
[ 1.20000000e+03  2.30000000e+02  1.73068974e-09  8.59000000e+025.71000000e+02 -1.28932697e-09  5.00000000e+02  5.00000000e+023.24000000e+02]

习题1.4

   一架货机有三个货舱:前舱、中舱和后舱。三个货舱所能装载的货物的最大质量和体积有限制。为了飞机的平衡,三个货舱装载的货物质量必须与其最大的容许量成正比例。现有四类货物用该货机进行装运,货物的规格以及装运后获得的利润如表所示。

  • 每种货物可以无限细分;

  • 每种货物可以分布在一个或者多个货舱内;

  • 不同的货物可以放在同一个货舱内,并且可以保证不留空隙。

   如何装运,使货机飞行利润最大

算法设计

   用i=1,2,3,4i = 1,2,3,4i=1,2,3,4分别表示货物1、货物2、货物3、货物4;j=1,2,3j = 1,2,3j=1,2,3分别表示前舱、中舱和后舱。设xij(i=1,2,3,4;j=1,2,3)x_{ij}(i = 1,2,3,4;j = 1,2,3)xij​(i=1,2,3,4;j=1,2,3)表示第iii种货物装在第jjj个货舱内的质量,wj,vj(j=1,2,3)w_{j},v_{j}(j = 1,2,3)wj​,vj​(j=1,2,3)分别表示第jjj个舱的质量限制和体积限制,ai,bi,ci(i=1,2,3,4)a_{i},b_{i},c_{i}(i = 1,2,3,4)ai​,bi​,ci​(i=1,2,3,4)分别表示可以运输的第iii种货物的质量,单位质量所占的空间和单位货物的利润。

maxz=∑i=14ci∑j=13xijmax \ z = \sum^{4}_{i = 1}c_{i}\sum^{3}_{j = 1}x_{ij} max z=i=1∑4​ci​j=1∑3​xij​

s.t.={∑j=13xij≤ai,i=1,2,3,4∑i=14xij≤wi,j=1,2,3∑i=14bixij≤vi,i=1,2,3∑i=14xi110=∑i=14xi216=∑i=14xi38xij≥0,i=1,2,3,4;j=1,2,3s.t.= \begin{cases} \sum\limits^{3}_{j = 1} x_{ij}\leq a_{i},\ \ i = 1,2,3,4\\ \sum\limits^{4}_{i = 1} x_{ij}\leq w_{i},\ \ j = 1,2,3\\ \sum\limits^{4}_{i = 1} b_{i}x_{ij}\leq v_{i},\ \ i = 1,2,3\\ \frac{\sum\limits^{4}_{i = 1}x_{i1}}{10} = \frac{\sum\limits^{4}_{i = 1}x_{i2}}{16} = \frac{\sum\limits^{4}_{i = 1}x_{i3}}{8}\\ x_{ij} \geq 0,\ \ i = 1,2,3,4;j = 1,2,3 \end{cases} s.t.=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧​j=1∑3​xij​≤ai​,  i=1,2,3,4i=1∑4​xij​≤wi​,  j=1,2,3i=1∑4​bi​xij​≤vi​,  i=1,2,310i=1∑4​xi1​​=16i=1∑4​xi2​​=8i=1∑4​xi3​​xij​≥0,  i=1,2,3,4;j=1,2,3​

  • 此次在变量设定中使用了nonneg参数规定xijx_{ij}xij​非负,可以不用写最后一条约束

  • 涉及到变量求和的地方使用cvxpy包中内置sum函数,即cp.sum()

  • 更多内置函数参考cvxpy官方文档

# 决策变量
n = (4,3)
# nonneg参数,变量是否为非负
x = cp.Variable(n,nonneg = True)# 约束1
b1 = np.array([18,15,23,12])# 约束2
b2 = np.array([10,16,8])# 约束3
A3 = np.array([480,650,580,390])
b3 = np.array([6800,8700,5300])
# 定义问题,添加约束条件
c = np.array([3100,3800,3500,2850])
prob = cp.Problem(cp.Maximize(c @ cp.sum(x,axis = 1)),[cp.sum(x,axis = 1) <= b1,cp.sum(x,axis = 0) <= b2,A3 @ x <= b3,cp.sum(x[:,0])/10 == cp.sum(x[:,1])/16,cp.sum(x[:,1])/16 == cp.sum(x[:,2])/8])# 求解
ans = prob.solve(solver=cp.ECOS_BB)# 输出结果
print("目标函数最大值:", ans)
# 对x向量各元素取整数后再输出
print(np.sum(x.value,axis = 1))

输出

目标函数最大值: 121515.7894845719
[3.19620414e-08 1.50000000e+01 1.59473684e+01 3.05263157e+00]

习题1.5

   某部门在今后五年内考虑给下列项目投资,已知:

   项目A,从第一年到第四年每年年初需要投资,并于次年末回收本利115%;

   项目B,从第三年初需要投资,到第五年末能回收本利125%,但规定最大投资额不超过4万元;

   项目C,第二年初需要投资,到第五年末能回收本利140%,但规定最大投资额不超过3万元;

   项目D,五年内每年初可购买公债,于当年末归还,并加利息6%。

   该部门现有资金10万元,问它应如何确定给这些项目每年的投资额,使到第五年年末拥有的资金的本利总额最大。

算法设计

   用j=1,2,3,4j = 1,2,3,4j=1,2,3,4,分别表示项目AAA、BBB、CCC、DDD,用xij(i=1,2,3,4,5)x_{ij}(i = 1,2,3,4,5)xij​(i=1,2,3,4,5)分别表示第i年年初给项目AAA、BBB、CCC、DDD的投资额。

maxz=1.15x41+1.40x23+1.25x32+1.06x54max \ z = 1.15x_{41} + 1.40x_{23}+ 1.25x_{32}+1.06x_{54} max z=1.15x41​+1.40x23​+1.25x32​+1.06x54​

s.t.={x11+x14=100000x21+x23+x24=1.06x14x31+x32+x34=1.15x11+1.06x24x41+x44=1.15x21+1.06x34x54=1.15x31+1.06x44x32≤40000x23≤30000xij≥0,i=1,2,3,4,5;j=1,2,3,4s.t.= \begin{cases} x_{11} + x_{14} = 100000\\ x_{21} + x_{23} + x_{24} = 1.06x_{14}\\ x_{31} + x_{32} + x_{34} = 1.15x_{11} + 1.06x_{24}\\ x_{41} + x{44} = 1.15x_{21} + 1.06x_{34}\\ x_{54} = 1.15x_{31} + 1.06x_{44}\\ x_{32} \leq 40000\\ x_{23} \leq 30000\\ x_{ij} \geq 0,\ \ i = 1,2,3,4,5;j = 1,2,3,4 \end{cases} s.t.=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧​x11​+x14​=100000x21​+x23​+x24​=1.06x14​x31​+x32​+x34​=1.15x11​+1.06x24​x41​+x44=1.15x21​+1.06x34​x54​=1.15x31​+1.06x44​x32​≤40000x23​≤30000xij​≥0,  i=1,2,3,4,5;j=1,2,3,4​

  • 换了一个求解器,GLOP
# 决策变量
n = (5,4)
# nonneg参数,变量是否为非负
x = cp.Variable(n,nonneg = True)prob = cp.Problem(cp.Maximize(1.15 * x[3,0] + 1.40 * x[1,2] + 1.25 * x[2,1] + 1.06 * x[4,3]),[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])# 求解
ans = prob.solve(solver=cp.GLOP)# 输出结果
print("目标函数最大值:", ans)
# 对x向量各元素取整数后再输出
print(x.value)

输出

目标函数最大值: 143750.0
[[34782.60869565    -0.            -0.         65217.39130435][39130.43478261    -0.         30000.            -0.        ][   -0.         40000.            -0.            -0.        ][45000.            -0.            -0.            -0.        ][   -0.            -0.            -0.            -0.        ]]

习题1.6

   食品厂用三种原料生产两种糖果,糖果的成分要求和销售价如表所示。该厂根据订单至少需要生产600kg高级奶糖、800kg水果糖,为求最大利润,试建立线性规划模型求解。

算法设计

   用i=1,2i = 1,2i=1,2分别表示高级奶糖和水果糖,用j=1,2,3j = 1,2,3j=1,2,3分别表示原料AAA、BBB、CCC。设xij(i=1,2;j=1,2,3)x_{ij}(i = 1,2;j = 1,2,3)xij​(i=1,2;j=1,2,3)表示生产第iii种糖用的第jjj种原料的量,aia_{i}ai​表示第iii种糖果的需求量,bjb_{j}bj​表示第jjj种原料的可供量。
maxz=4x11+12x12+16x13−5x21+3x22+7x23max \ z = 4x_{11} + 12x_{12} + 16x_{13}-5x_{21} + 3x_{22} + 7x_{23} max z=4x11​+12x12​+16x13​−5x21​+3x22​+7x23​

s.t.={∑j=13xij≥ai,i=1,2∑i=12xij≤bj,j=1,2,3x11≥50%(x11+x12+x13)x12≥25%(x11+x12+x13)x13≤10%(x11+x12+x13)x21≤40%(x21+x22+x23)x22≤40%(x21+x22+x23)x23≥15(x21+x22+x23)xij≥0,i=1,2;j=1,2,3s.t.= \begin{cases} \sum\limits^{3}_{j = 1}x_{ij} \geq a_{i}, \ i = 1,2\\ \sum\limits^{2}_{i = 1}x_{ij} \leq b_{j}, \ j = 1,2,3\\ x_{11} \geq 50\%(x_{11} + x_{12} + x_{13})\\ x_{12} \geq 25\%(x_{11} + x_{12} + x_{13})\\ x_{13} \leq 10\%(x_{11} + x_{12} + x_{13})\\ x_{21} \leq 40\%(x_{21} + x_{22} + x_{23})\\ x_{22} \leq 40\%(x_{21} + x_{22} + x_{23})\\ x_{23} \geq 15(x_{21} + x_{22} + x_{23})\\ x_{ij} \geq 0,\ \ i = 1,2;j = 1,2,3 \end{cases} s.t.=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧​j=1∑3​xij​≥ai​, i=1,2i=1∑2​xij​≤bj​, j=1,2,3x11​≥50%(x11​+x12​+x13​)x12​≥25%(x11​+x12​+x13​)x13​≤10%(x11​+x12​+x13​)x21​≤40%(x21​+x22​+x23​)x22​≤40%(x21​+x22​+x23​)x23​≥15(x21​+x22​+x23​)xij​≥0,  i=1,2;j=1,2,3​

# 决策变量
n = (2,3)
# nonneg参数,变量是否为非负
x = cp.Variable(n,nonneg = True)
# 约束1
b1 = [600,800]# 约束2
b2 = [600,750,625]
# cp.sum()中axis = 1按行求和
# cp.sum()中axis = 0按列求和
prob = cp.Problem(cp.Maximize(np.array([4,12,16]) @ x[0,:] + np.array([-5,3,7]) @ x[1,:]),[cp.sum(x,axis = 1) >= b1,cp.sum(x,axis = 0) <= b2,x[0,0] >= 0.5 * cp.sum(x[0,:],axis = 0),x[0,1] >= 0.25 * cp.sum(x[0,:],axis = 0),x[0,2] <= 0.1 * cp.sum(x[0,:],axis = 0),x[1,0] <= 0.4 * cp.sum(x[1,:],axis = 0),x[1,1] <= 0.4 * cp.sum(x[1,:],axis = 0),x[1,2] >= 0.15 * cp.sum(x[1,:],axis = 0)])# 求解
ans = prob.solve(solver=cp.GLOP)# 输出结果
print("目标函数最大值:", ans)
# 对x向量各元素取整数后再输出
print(x.value)

输出

目标函数最大值: 14200.0
[[600. 575.  -0.][ -0. 175. 625.]]

习题1.7

   求解下列线性规划问题,其中矩阵A=(aij)100×150A = (a_{ij})_{100 \times 150}A=(aij​)100×150​中的元素aija_{ij}aij​为[0,10][0,10][0,10]上的随机整数。

maxvmax \ v max v

s.t.={∑i=1100aijxi≥v,j=1,2,...,150∑i=1100xi=100xi≥0,i=1,2,...,100s.t.= \begin{cases} \sum\limits^{100}_{i = 1}a_{ij}x_{i} \geq v, \ j = 1,2,...,150\\ \sum\limits^{100}_{i = 1}x_{i} = 100\\ x_{i} \geq 0,\ i = 1,2,...,100 \end{cases} s.t.=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​i=1∑100​aij​xi​≥v, j=1,2,...,150i=1∑100​xi​=100xi​≥0, i=1,2,...,100​

#生成随机数种子,使结果固定
np.random.seed(42)
a = np.random.randint(1, 11, size=(100,150))
# 决策变量
n = np.array([100,1])
# nonneg参数,变量是否为非负
x = cp.Variable(n[0],nonneg = True)
v = cp.Variable(n[1])# cp.sum()中axis = 1按行求和
# cp.sum()中axis = 0按列求和
prob = cp.Problem(cp.Maximize(v),[a.T @ x >= v,cp.sum(x) == 100])# 求解
ans = prob.solve(solver=cp.GLOP)# 输出结果
print("目标函数最大值:", ans)
# 对x向量各元素取整数后再输出
print(x.value)

输出

目标函数最大值: 538.2560346542277
[-0.         -0.          0.32868907  1.83981903  1.60824063  1.429344122.35357916 -0.          3.38452136 -0.          0.00595007  1.6272227-0.          0.56945258 -0.          2.54100266  1.43375965  0.863279972.11702508  2.40072583 -0.          2.52730273 -0.         -0.1.13784709 -0.          0.62438124 -0.          0.11470483  2.13261487-0.          2.78707508  2.7390843   1.22599971  1.36865498  4.551308193.26987533 -0.         -0.         -0.          4.26209229  1.43778780.20195965  0.63892766  0.13196033 -0.         -0.          1.318078780.75303873  3.36903244 -0.          0.81368899  0.2527292   1.944166551.58858316  0.21577316  1.7780698  -0.         -0.          1.771560090.22421819 -0.          0.94448177 -0.         -0.         -0.1.13899834  3.02491754  2.22561055  3.26464305 -0.          1.389167722.06832119 -0.          2.6891509  -0.          0.42024825  1.69604933-0.          0.03469465 -0.          2.85642199  2.70167707 -0.1.01923824  1.87565017  0.98045756 -0.          0.50588775  1.73655473-0.         -0.         -0.          0.06062595 -0.          1.469786141.08026003  1.13403002 -0.         -0.        ]

习题1.8

   设xn+1=max1≤i≤n{qixi}x_{n+1} = \mathop{max}\limits_{1 \leq i \leq n}\{q_{i}x_{i}\}xn+1​=1≤i≤nmax​{qi​xi​},则模型二可以线性化为

minxn+1min \ x_{n+1} min xn+1​

s.t.={qixi≤xn+1,i=1,2,...,n∑i=0n(ri−pi)xi≥kM∑i=0n(1+pi)xi=Mxi≥0,i=0,1,...,ns.t.= \begin{cases} q_{i}x_{i} \leq x_{n+1},\ i = 1,2,...,n\\ \sum\limits^{n}_{i = 0}(r_i - p_i)x_i \geq k_{M}\\ \sum\limits^{n}_{i = 0}(1 + p_i)x_i = M\\ x_{i} \geq 0,\ i = 0,1,...,n \end{cases} s.t.=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​qi​xi​≤xn+1​, i=1,2,...,ni=0∑n​(ri​−pi​)xi​≥kM​i=0∑n​(1+pi​)xi​=Mxi​≥0, i=0,1,...,n​

# 决策变量
n = 6
# nonneg参数,变量是否为非负
x = cp.Variable(n,nonneg = True)# 约束1
A1 = np.array([[0,0.025,0,0,0,-1],[0,0,0.015,0,0,-1],[0,0,0,0.055,0,-1],[0,0,0,0,0.026,-1],[-0.05,-0.27,-0.19,-0.185,-0.185,0]])# 约束2
A2 = np.array([1,1.01,1.02,1.045,1.065,0])
b2 = np.array([1])# 每轮结果
ANS = []
for k in np.arange(0.05,0.255,0.005):b1 = np.array([0,0,0,0,-k])prob = cp.Problem(cp.Minimize(x[5]),[A1 @ x <= b1,A2 @ x == b2])# 求解ans = prob.solve(solver=cp.GLOP)ANS.append([ans])if k >= 0.205 and k<= 0.210:print(x.value)

输出

[-0. 0.30887428  0.51479046  0.1403974   0.01524453  0.00772186]

绘制图形观察

import matplotlib as mpl
import matplotlib.pyplot as plt#中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False# notebook嵌入图片
%matplotlib inline
# 提高分辨率
%config InlineBackend.figure_format='retina'# 忽略警告
import warnings
warnings.filterwarnings('ignore')plt.figure(dpi = 600,figsize = (5,5))
plt.plot(np.arange(0.05,0.255,0.005),ANS)
plt.xlabel("Profit")
plt.ylabel("Risk")
plt.title("Profit and Risk chart")
plt.savefig("Profit and Risk chart")

结语

   最后这里提供给大家源代码文件

数学建模算法与应用 线性规划(cvxpy包)相关推荐

  1. 个人数学建模算法库之线性规划模型

    线性规划模型 模型描述 Matlab代码 基于求解器 基于问题 Python代码 Scipy库 Plup库 模型描述 m i n z = f T x ( 1 ) s . t . { A x ≤ b ( ...

  2. 司守奎《数学建模算法与应用》课后习题:线性规划

    系列目录 司守奎<数学建模算法与应用>课后习题:线性规划 模拟退火算法解决旅行商问题详解 遗传算法解决旅行商问题 MATLAB实现 基于模拟退火优化的投影寻踪评价法求解供货能力评价模型 目 ...

  3. 数学建模算法与应用学习day1——线性规划问题整数规划问题

    以下内容来自司守奎编写的数学建模算法与应用学习,主要是记录自己的学习历程,转载还请标明出处! 一.线性规划 知识点 1.1线性规划问题 1.1.2线性规划解的概念 f = [-2 ; -3 ; 5]; ...

  4. 数学建模算法学习笔记 已完结

    这是为了准备国赛突击学习的模型算法,我在原有的基础上加上自己的理解虽然不知道对不对,就是为了记录下自己学的模型他究竟是个什么东西,语言通俗,但是极不准确,只适合做一个大概的了解,建议大家详细的还是要看 ...

  5. 数学建模算法:支持向量机_从零开始的算法:支持向量机

    数学建模算法:支持向量机 从零开始的算法 (Algorithms From Scratch) A popular algorithm that is capable of performing lin ...

  6. matlab中x从0到5不含0,关于MATLAB的数学建模算法学习笔记

    关于MATLAB的数学建模算法学习笔记 目录 线性规划中应用: (3) 非线性规划: (3) 指派问题;投资问题:(0-1问题) (3) 1)应用fmincon命令语句 (3) 2)应用指令函数:bi ...

  7. python数学建模(二)线性规划2.实战(思路清晰\过程完整、详细)

    文章目录 (一)简单陈述本文章的内容 (二)线性规划例题(实战) 2.1 实战题目 2.2 符号规定和基本假设 2.3 模型的分析 2.4 模型的建立 2.5 模型一的求解和分析 2.5.1 (代码) ...

  8. LL1分析构造法_数学建模算法--最优赋权法(含代码)

    数学建模算法--最优赋权法(含代码) 作者:郑铿城 本次介绍数学建模和科研写作的方法--最优赋权法最优赋权法经常用于分析评价类问题,从该算法的名称就可以看到,该算法首先要体现"最优" ...

  9. python dendrogram_【聚类分析】《数学建模算法与应用》第十章 多元分析 第一节 聚类分析 python实现...

    第十章 多元分析 第一节 聚类分析 介绍 这里是司守奎教授的<数学建模算法与应用>全书案例代码python实现,欢迎加入此项目将其案例代码用python实现 GitHub项目地址:Math ...

最新文章

  1. Jenkins 2.16.3默认没有Launch agent via Java Web Start,如何配置使用
  2. python画图代码turtle-使用Python的turtle模块画图的方法
  3. DDD - 聚合与聚合根_如何理解 Respository与DAO
  4. java 阻塞 socket_java socket非阻塞I/O
  5. Elipse 、Idea配置 Java-Code-Formatter
  6. Linux学习总结(55)——Linux 运维常用脚本
  7. Linux常用最基础命令总结
  8. 基于javaweb的员工绩效考核系统
  9. YAML语法详细总结
  10. 基于BIND实现智能DNS解析
  11. 腾讯企业邮箱申请步骤
  12. 【微信JSSDK】PHP版微信录音文件下载
  13. Microsoft 解决方案框架版本 3.0 概述(MSF3.0)
  14. CSS中使盒子移动方法总结
  15. Java微信公众平台开发(一)--接入微信公众平台
  16. 普元 AppServer 6.5 将springboot应用部署到应用服务器,上传文件时报错:Caused by: org.springframework.web.multipart.Multipar
  17. 梦兴阁给我生活带来的改变
  18. 形态等位点对迭代次数的贡献
  19. 矩阵的初等变换的应用
  20. Docker compose - 最开始的version 字段是什么,为什么要写这个字段

热门文章

  1. 聚合微服务中的 Swagger API 文档
  2. HBASE MOB设计
  3. SSM毕设项目毕业生就业推荐平台s0m59(java+VUE+Mybatis+Maven+Mysql)
  4. mysql导入数据报错_MySQL导入数据库时报错,MySQL server has go away
  5. 计算机安装硬盘后无法启动不了,加装固态硬盘,装好后系统怎么不能启动了呢?该怎么办?...
  6. 网络安全小白成长日记
  7. access_stratum_release version
  8. nyoj 1275 导弹发射(河南省2016年省赛)
  9. Docker构建harbor+IDEA,一篇文章就够了
  10. Mac下iTerm2美化