首页 > 编程语言 >运筹学习题Python精解——线性规划

运筹学习题Python精解——线性规划

时间:2024-06-06 21:21:53浏览次数:18  
标签:geq 12 车间 Python leq 产品 np 习题 精解

题1

某企业有三个车间生产同一种产品。每件产品由四个零件 1 和三个零件 2 组成。两个零件需耗用两种原材料 A 和 B。已知这两种原材料的供应量分别为 300kg 和 500kg。由于三个车间拥有的设备及工艺条件不同,每个工班原材料耗用量和零件产量也不同。见下表(三个车间每班用料和生产情况),问三个车间就各开多少个班,才能使该产品的配套数达到最大?

车间 A 材料 B 材料 零件1 零件2
一车间 8 6 7 5
二车间 5 9 6 9
三车间 3 8 8 4

问题描述:

我们有三个车间,每个车间的每班原材料耗用量和零件产量不同。我们的目标是确定每个车间开多少个班,以使得产品的配套数(即最终的产品数)最大。每个产品由4个零件1和3个零件2组成。我们有两个原材料A和B,供应量分别为300kg和500kg。

步骤:

  • 定义变量:
    • \(x_1\) 表示一车间的班数
    • \(x_2\)​ 表示二车间的班数
    • \(x_3\)​ 表示三车间的班数
  • 目标函数: 我们要最大化产品的配套数。每个产品需要4个零件1和3个零件2。假设最终产品的配套数为P,那么我们可以定义一个辅助变量来表示该目标:

    \[P = \max \left( \frac{7x_1 + 6x_2 + 8x_3}{4}, \frac{5x_1 + 9x_2 + 4x_3}{3} \right) \]

  • 约束条件:
    • 原材料A的供应量不能超过300kg: \(8x_1 + 5x_2 + 3x_3 \leq 300\)
    • 原材料B的供应量不能超过500kg: \(6x_1 + 9x_2 + 8x_3 \leq 500\)
    • 零件1和零件2必须满足产品配套需求: \(4P \leq 7x_1 + 6x_2 + 8x_3 \quad​ 3P \leq 5x_1 + 9x_2 + 4x_3\)
    • 非负约束: \(x_1 \geq 0, \quad x_2 \geq 0, \quad x_3 \geq 0\)
  • 求解方法: 使用线性规划求解工具,如Python的SciPy库或其他优化工具,求解这个线性规划问题。

\[\begin{align} \text{max} \quad & P \\ \text{subject to} \quad & 7x_1 + 6x_2 + 8x_3 - 4P \geq 0 \\ & 5x_1 + 9x_2 + 4x_3 - 3P \geq 0 \\ & 8x_1 + 5x_2 + 3x_3 \leq 300 \\ & 6x_1 + 9x_2 + 8x_3 \leq 500 \\ & x, x_2, x_3, P \geq 0 \end{align} \]

Python求解

我们使用Python的SciPy库来求解这个线性规划问题。

import pulp

# 创建一个线性规划问题
lp = pulp.LpProblem("Maximize_P", pulp.LpMaximize)

# 定义变量,x1, x2, x3为非负连续变量,P为非负整数变量
x1 = pulp.LpVariable('x1', lowBound=0, cat='Continuous')
x2 = pulp.LpVariable('x2', lowBound=0, cat='Continuous')
x3 = pulp.LpVariable('x3', lowBound=0, cat='Continuous')
P = pulp.LpVariable('P', lowBound=0, cat='Integer')

# 添加目标函数
lp += P

# 添加约束条件
lp += 7*x1 + 6*x2 + 8*x3 - 4*P >= 0
lp += 5*x1 + 9*x2 + 4*x3 - 3*P >= 0
lp += 8*x1 + 5*x2 + 3*x3 <= 300
lp += 6*x1 + 9*x2 + 8*x3 <= 500

# 求解问题
status = lp.solve()

# 输出结果
if status == pulp.LpStatusOptimal:
    print("Optimal integer value of P:", pulp.value(P))
    print("x1:", pulp.value(x1))
    print("x2:", pulp.value(x2))
    print("x3:", pulp.value(x3))
else:
    print("Failed to find an optimal solution.")

运行上述代码将会得到各车间的最优班次安排和最大产品配套数。

Optimal integer value of P: 116.0
x1: 12.571429
x2: 16.190476
x3: 34.857143

题2

问题分析

某染化料厂要用 C、P、H 三种原料混合配制出 A、B、D 三种不同规格的产品。原料 C、P、H 每天的最大供应量分别为 100kg、100kg、60kg,每千克单价分别为 65 元、25 元、35 元。产品 A 要求原料 C 含量不少于 50%,含原料 P 不超过 25%;产品 B 含 C 不得少于 25%,P 不超过 50%;产品 D 的原料配比没有限制。产品 A、B、D 每千克的单价分别为 50 元、35 元、25 元。问应如何安排生产,使得利润为最大?

数学建模

设:

  • \(x_A\) 为生产产品 A 的重量 (kg)
  • \(x_B\) 为生产产品 B 的重量 (kg)
  • \(x_D\)​ 为生产产品 D 的重量 (kg)

我们需要最大化利润:

\[\text{利润} = 50x_A + 35x_B + 25x_D - 65(C_A + C_B + C_D) - 25(P_A + P_B + P_D) - 35(H_A + H_B + H_D) \]

其中 \(C_A\), \(P_A\) \(H_A\)​ 分别表示生产产品 A 所需的原料 C, P, H 的数量,同理,\(C_B\)​, \(P_B\)​, \(H_B\)​,\(C_D\)​, \(P_D\)​, \(H_D\)​ 分别表示生产产品 B 和 D 所需的原料 C, P, H 的数量。

根据题意,有如下约束条件:

  • 原料限制:

    \[\begin{aligned} C_A + C_B + C_D &\leq 100 \\ P_A + P_B + P_D &\leq 100 \\ H_A + H_B + H_D &\leq 60 \end{aligned} \]

  • 产品 A 的原料配比:

    \[\begin{aligned} C_A &\geq 0.5x_A \\ P_A &\leq 0.25x_A \end{aligned} \]

  • 产品 B 的原料配比:

    \[\begin{aligned} C_B &\geq 0.25x_B \\ P_B &\leq 0.5x_B \end{aligned} \]

  • 产品 D 的原料配比没有限制。

Python 求解程序

我们可以使用 scipy.optimize 库中的 linprog 函数来求解这个线性规划问题。


import numpy as np
from scipy.optimize import linprog

# 定义目标函数的系数(注意这里是求最大化,linprog默认求最小化,因此取负)
c = np.array([-50, -35, -25])

# 定义不等式约束的系数矩阵和常数项向量
A = np.array([
    [65, 25, 35],   # 原料C的成本
    [0, 0, 0],      # 原料P的成本
    [0, 0, 0]       # 原料H的成本
])

b = np.array([
    100,   # C最大供应量
    100,   # P最大供应量
    60     # H最大供应量
])

# 定义等式约束的系数矩阵和常数项向量
A_eq = np.array([
    [0.5, 0, 0],   # 产品A的C含量
    [0, 0.25, 0]   # 产品B的C含量
])

b_eq = np.array([
    0.5,   # 产品A的C含量要求
    0.25   # 产品B的C含量要求
])

# 定义变量的非负约束
bounds = [(0, None), (0, None), (0, None)]

# 求解线性规划问题
res = linprog(c, A_ub=A, b_ub=b, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs')

# 输出结果
print(f"最大利润: {-res.fun}")
print(f"产品A的生产量: {res.x[0]}")
print(f"产品B的生产量: {res.x[1]}")
print(f"产品D的生产量: {res.x[2]}")
最大利润: 92.14285714285714
产品A的生产量: 1.0
产品B的生产量: 1.0
产品D的生产量: 0.2857142857142857

题2

问题分析

纽约市在平时的一天里警察巡逻的需求如下:

时段 时间 巡逻警察数(最低限)
1 凌晨 12 点 - 凌晨 4 点 6
2 凌晨 4 点 - 早上 8 点 4
3 早上 8 点 - 正午 12 点 14
4 正午 12 点 - 下午 4 点 8
5 下午 4 点 - 晚上 8 点 12
6 晚上 8 点 - 凌晨 12 点 16

每个警察的班次为连续工作8小时,我们需要确定这6个班次各安排多少巡警可以使得满足人员需求的条件下使用的警力最少。

数学建模

设每个时段起始时的巡逻警数量分别为 \(x_1, x_2, x_3, x_4, x_5, x_6\),其中:

  • \(x_1\) 表示午夜12点到早上8点的巡逻警数量
  • \(x_2\) 表示凌晨4点到中午12点的巡逻警数量
  • \(x_3\) 表示早上8点到下午4点的巡逻警数量
  • \(x_4\) 表示中午12点到晚上8点的巡逻警数量
  • \(x_5\) 表示下午4点到凌晨12点的巡逻警数量
  • \(x_6\) 表示晚上8点到凌晨4点的巡逻警数量

根据需求,我们得到以下约束条件:

\(x_1 + x_6 \geq 6\)
\(x_1 + x_2 \geq 4\)
\(x_2 + x_3 \geq 14\)
\(x_3 + x_4 \geq 8\)
\(x_4 + x_5 \geq 12\)
\(x_5 + x_6 \geq 16\)

目标是最小化巡逻警总数,即最小化 \(x_1 + x_2 + x_3 + x_4 + x_5 + x_6\)

Python 求解程序

我们可以使用 scipy.optimize 库中的 linprog 函数来求解这个线性规划问题。

import numpy as np
from scipy.optimize import linprog

# 系数矩阵
A = np.array([
    [-1,  0,  0,  0,  0, -1],
    [-1, -1,  0,  0,  0,  0],
    [ 0, -1, -1,  0,  0,  0],
    [ 0,  0, -1, -1,  0,  0],
    [ 0,  0,  0, -1, -1,  0],
    [ 0,  0,  0,  0, -1, -1]
])

# 需求矩阵
b = np.array([-6, -4, -14, -8, -12, -16])

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

# 求解线性规划问题
res = linprog(c, A_ub=A, b_ub=b, bounds=(0, None), method='highs')

# 输出结果
print(f"最小巡逻警数: {res.fun}")
print(f"各时段巡逻警数: {res.x}")
最小巡逻警数: 32.0
各时段巡逻警数: [ 2.  2. 12.  0. 12.  4.]

标签:geq,12,车间,Python,leq,产品,np,习题,精解
From: https://www.cnblogs.com/haohai9309/p/18235684

相关文章

  • Python-GEE遥感云大数据分析、管理与可视化
    随着航空、航天、近地空间遥感平台的持续发展,遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升,呈现出大数据特征。这为相关研究带来了新机遇,但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域、多尺度海量遥感数据处理需求。为解......
  • python爬虫学习路径
    python爬虫学习路径阶段一:Python基础(预计1-2周)里程碑1:掌握Python基础语法数据类型(字符串、列表、字典等)控制流(条件语句、循环语句)函数定义与使用模块导入与使用文件读写操作学习资源:廖雪峰Python教程Python官方文档CodecademyPython课程练习......
  • 【2024最新】Python 学习路线分享
    学习资料已打包,需要的小伙伴可以戳这里学习资料整理了一份Python学习路线。内容依然是从入门到进阶,既有教程,也有经典书籍推荐,还有实战开源项目。Python的发展方向还是挺多的,比如服务端开发,爬虫,数据分析,机器学习等,本文推荐的内容全部是服务端开发,Web开发方向。主......
  • python: 如何将方法对象和类实例对象序列化
    文章目录1.Json序列化2.Pickle序列化1.Json序列化在python中对于一般数据的序列化保存经常使用的就是json序列化json序列化可序列的对象:一般数据类型列表,字典,字符串,数字,布尔值,None等json可以序列化的对象类型: 基本数据类型: None 布尔值:True,False 数......
  • python的datetime使用时区转换的注意事项
    由于做美股的开始,经常用到需要将utc时间转换成美东时间,或者美东时间转换为utc时间。美东时间涉及到一个夏令时,一个冬令时,不同的阶段与utc时间的时区相差不同的时间段 以前我一直用pytz的三方模块给datetime赋值时区信息,然后生成的对象用astimezone的方法,转换到对应的时区信息......
  • python --数据分析-numpy-pandas-series对象和dataframe对象
    Python作为当下最为流行的编程语言之一,可以独立完成数据分析的各种任务功能强大,在数据分析领域里有海量开源库,并持续更新是当下热点——机器学习/深度学习领域最热门的编程语言除数据分析领域外,在爬虫,Web开发等领域均有应用常用Python数据分析开源库介绍NumPyNumP......
  • 探索 CSV 模块:Python 中 CSV 数据持久化的最佳实践
    ......
  • Python-datetime
    importdatetimeprint("獲取當前時間和日期:",datetime.datetime.now())UtcNow=datetime.datetime.utcnow()print("獲取當前時間和日期的世界標準時間:",UtcNow)print("獲取日期:",UtcNow.date())print("獲取年:",UtcNow.year)print("獲取月:",Ut......
  • Python-GEE遥感云大数据分析、管理与可视化及多领域案例教程
    原文链接:Python-GEE遥感云大数据分析、管理与可视化及多领域案例教程https://mp.weixin.qq.com/s?__biz=MzUzNTczMDMxMg==&mid=2247606139&idx=3&sn=2b98c8d5c99878ce78c8fade559bdae5&chksm=fa821e9ccdf5978a7e63a1d514f2a643158a595fa75ac751c5ca477692bbc84e993245b342df&to......
  • 【Python Cookbook】S01E22 替换文本 re.sub(),re.subn() 以及 回调函数
    目录问题解决方案讨论问题如果我们想要对字符串中的文本做替换,该如何办?解决方案针对简单的文本模式,我们直接使用字符串内置方法str.replace()函数即可。text="Ileaveamessageforyou."print(text.replace('leave','left'))结果:Ileftamessagefor......