数学建模算法与应用 整数规划(cvxpy包)

本文解析了一系列线性规划习题,包括非线性转线性规划、选址问题、资源分配等,通过建立数学模型并利用Python求解,提供详细的算法设计思路。

习题

习题2.1

   试将下述非线性的0-1规划问题转换成线性的0-1规划问题
m a x z = x 1 + x 1 x 2 − x 3 s . t . = { − 2 x 1 + 3 x 2 + x 3 ≤ 3 x j = 0 或 1 ,    j = 1 , 2 , 3 max z = x_1+x_1x_2-x_3\\ s.t.= \begin{cases} -2x_1 + 3x_2+x_3 \leq 3\\ x_j = 0 \text{或}1,\ \ j = 1,2,3 \end{cases} maxz=x1+x1x2x3s.t.={ 2x1+3x2+x33xj=01,  j=1,2,3

算法设计

  做变量替换 y = x 1 x 2 y = x_1x_2 y=x1x2,则有如下关系:
x 1 + x 2 − 1 ≤ y ≤ x 1 x 1 + x 2 − 1 ≤ y ≤ x 2 x_1+x_2-1 \leq y \leq x_1 \\ x_1 + x_2 -1 \leq y \leq x_2 x1+x21yx1x1+x21yx2
  从而得到如下的线性0-1规划
m a x z = x 1 + y − x 3 s . t . = { − 2 x 1 + 3 x 2 + x 3 ≤ 3 x 1 + x 2 − 1 ≤ y ≤ x 1 x 1 + x 2 − 1 ≤ y ≤ x 2 x j = 0 或 1 ,    j = 1 , 2 , 3 y = 0 或 1 max z = x_1 + y - x_3\\ s.t.= \begin{cases} -2x_1 + 3x_2 + x_3 \leq 3\\ x_1 + x_2 -1 \leq y \leq x_1\\ x_1 + x_2 -1 \leq y \leq x_2\\ x_j = 0 或 1, \ \ j = 1,2,3\\ y = 0或1 \end{cases} maxz=x1+yx3s.t.=2x1+3x2+x33x1+x21yx1x1+x21yx2xj=01,  j=1,2,3y=01

习题2.2

  某市为方便小学生上学,拟在新建的8个居民小区 A 1 , A 2 , . . . , A 8 A_1,A_2,...,A_8 A1,A2,...,A8增设若干所小学,经过论证知备选校址有 B 1 , B 2 , . . . , B 6 B_1,B_2,...,B_6 B1,B2,...,B6,它们能够覆盖的居民小区如下表所示。

B 1 B_1 B1 B 2 B_2 B2 B 3 B_3 B3 B 4 B_4 B4 B 5 B_5 B5 B 6 B_6 B6
A 1 , A 5 , A 7 A_1,A_5,A_7 A1,A5,A7 A 1 , A 2 , A 5 , A 8 A_1,A_2,A_5,A_8 A1,A2,A5,A8 A 1 , A 3 , A 5 A_1,A_3,A_5 A1,A3,A5 A 2 , A 4 , A 8 A_2,A_4,A_8 A2,A4,A8 A 3 , A 6 A_3,A_6 A3,A6 A 4 , A 6 , A 8 A_4,A_6,A_8 A4,A6,A8

  试建立一个数学模型,确定出最小个数的建校地址,使其能够覆盖所有的居民小区

算法设计

  令
x i = { 1 ,     在 备 选 校 址 B i 建 学 校 0 ,     在 备 选 校 址 B i 不 建 学 校 x_{i} = \begin{cases} 1,\ \ \ 在备选校址B_{i}建学校\\ 0,\ \ \ 在备选校址B_{i}不建学校\\ \end{cases} xi={ 1,   Bi0,   Bi
  小区 A 1 A_{1} A1可以被备选校址B_1、B_2、B_3处所建的学校覆盖,则有约束条件
x 1 + x 2 + x 3 ≥ 1 x_1 + x_2 + x_3 \geq 1 x1+x2+x31
  依次类推,建立如下0-1整数规划模型:
m i n ∑ i = 1 6 x i s . t . = { x 1 + x 2 + x 3 ≥ 1 x 2 + x 4 ≥ 1 x 3 + x 5 ≥ 1 x 4 + x 6 ≥ 1 x 5 + x 6 ≥ 1 x 1 ≥ 1 x 2 + x 4 + x 6 ≥ 1 x i = 0 或 1 ,     i = 1 , 2 , . . . , 8 min \sum^{6}_{i = 1}x_i\\ s.t. = \begin{cases} x_1 + x_2 + x_3 \geq 1 \\ x_2 + x_4 \geq 1 \\ x_3 + x_5 \geq 1 \\ x_4 + x_6 \geq 1 \\ x_5 + x_6 \geq 1 \\ x_1 \geq 1\\ x_2 + x_4 + x_6 \geq 1 \\ x_{i} = 0 或 1,\ \ \ i = 1,2,...,8 \end{cases} mini=16xis.t.=x1+x2+x31x2+x41x3+x51x4+x61x5+x61x11x2+x4+x61xi=01,   i=1,2,...,8

# 决策变量
n = 8
# nonneg参数,变量是否为非负
x = cp.Variable(n,nonneg = True)

# 约束1
A1 = np.array([[1,1,1,0,0,0,0,0],
              [0,1,0,1,0,0,0,0],
              [0,0,1,0,1,0,0,0],
              [0,0,0,1,0,1,0,0],
              [0,0,0,0,1,1,0,0],
              [1,0,0,0,0,0,0,0],
              [0,1,0,1,0,1,0,0]])
b1 = np.array([1,1,1,1,1,1,1])

# 约束2
A2 = np.ones((8, 8))
for i in range(A2.shape[0]):
    for j in range(A2.shape[1]):
        if i == j:
            pass
        else:
            A2[i, j] = A2[i, j]*0

b2 = np.array([0,0,0,0,0,0,0,0])
# 约束3
A3 = np.ones((8, 8))
for i in range(A3.shape[0]):
    for j in range(A3.shape[1]):
        if i == j:
            pass
        else:
            A3[i, j] = A3[i, j]*0
b3 = np.array([1,1,1,1,1,1,1,1])

# 目标函数
c = np.array([1,1,1,1,1,1,1,1])

# 定义问题,添加约束条件
prob = cp.Problem(cp.Minimize(c.T @ x),
                  [A1 @ x >= b1,
                  A2 @ x >= b2,
                  A3 @ x <= b3])

# 求解
ans = prob.solve(solver=cp.GLOP)
# 输出结果
print("目标函数最小值:", ans)
# 对x向量各元素取整数后再输出
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羽星_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值