线性规划模型复习总结

news/2024/9/12 15:19:56/文章来源:https://www.cnblogs.com/haohai9309/p/18302788

线性规划(Linear Programming, LP)是一种数学优化方法,用于在给定约束条件下最大化或最小化目标函数。线性规划广泛应用于经济、工程、管理等领域,通过建立数学模型,帮助决策者找到最优解决方案。

一、线性规划数学模型

1.1 模型三要素

  • 目标函数(Objective Function)
    目标函数是线性规划中需要优化的函数,通常表示为线性形式。目标函数可以是需最大化的利润或最小化的成本。例如,在一个生产问题中,目标函数可以是某种商品的总利润,需要通过调整生产量来最大化这个值。目标函数的一般形式为:

\[Z = c_1 x_1 + c_2 x_2 + \cdots + c_n x_n \]

其中:\(Z\)是目标值;\(c_1, c_2, \ldots, c_n\)是目标函数的系数;\(x_1, x_2, \ldots, x_n\) 是决策变量。

  • 约束条件(Constraints)
    约束条件是限制决策变量取值范围的线性不等式或等式。这些条件通常反映了资源的有限性、技术限制等。例如,在生产问题中,约束条件可能包括生产时间、原材料、资金等的限制。约束条件的一般形式为:

\[\begin{align*} a_{11} x_1 + a_{12} x_2 + \cdots + a_{1n} x_n &\leq b_1 \\ a_{21} x_1 + a_{22} x_2 + \cdots + a_{2n} x_n &\leq b_2 \\ \vdots \quad \quad &\ddots \\ a_{m1} x_1 + a_{m2} x_2 + \cdots + a_{mn} x_n &\leq b_m \\ \end{align*} \]

其中:\(a_{ij}\)是约束条件的系数;\(b_i\)是约束条件的右端常数;\(m\)是约束条件的数量。

  • 非负性约束(Non-negativity Constraints)
    在大多数实际问题中,决策变量通常需要非负,即每个变量必须大于或等于零。这反映了实际情况中物理量(如生产量、时间等)不能为负值。非负性约束的一般形式为:$$x_1 \geq 0, x_2 \geq 0, \ldots, x_n \geq 0$$

1.2 建模过程

问题描述:某公司生产两种产品A和B,每生产一单位A可获利3元,每生产一单位B可获利5元。生产A需要2小时工作时间和1单位原材料,生产B需要1小时工作时间和2单位原材料。现公司有100小时工作时间和80单位原材料。问公司应如何安排生产才能使利润最大化?

  • 决策变量

    • \(x_1\)为产品A的生产数量,
    • \(x_2\)为产品B的生产数量。
  • 目标函数
    需要最大化利润,目标函数为:

\[\text{Maximize } Z = 3x_1 + 5x_2 \]

  • 约束条件

    • \(2x_1 + x_2 \leq 100\)(工作时间约束)
    • \(x_1 + 2x_2 \leq 80\) (原材料约束)
  • 可行性约束

    • \(x_1 \geq 0, x_2 \geq 0\)

通过上述步骤,建立了一个完整的线性规划数学模型。该模型可以通过图解法、单纯形法或其他优化算法求解,从而找到最优生产方案。线性规划不仅为决策者提供了一种系统化的决策工具,而且在资源优化配置方面具有重要意义。

1.3 图解法

\[\begin{align*} \max \quad & z = 2x_1 + 2x_2 \\ \text{s.t.} \quad & 5x_1 + 2x_2 \leq 15 \\ & 6x_1 + 2x_2 \leq 24 \\ & x_1 + x_2 \leq 5 \\ & x_1, x_2 \geq 0 \end{align*}\]

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import linprog# 定义绘图的范围
x1 = np.linspace(0, 10, 400)# 定义约束条件
y1 = 15 / 5
y2 = (24 - 6 * x1) / 2
y3 = 5 - x1# 绘制可行域
plt.figure(figsize=(10, 8))
plt.plot(x1, y2, label=r'$6x_1 + 2x_2 \leq 24$')
plt.plot(x1, y3, label=r'$x_1 + x_2 \leq 5$')
plt.axhline(y=y1, color='r', linestyle='-', label=r'$5x_2 \leq 15$')
plt.xlim((0, 10))
plt.ylim((0, 10))
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')# 填充可行域
plt.fill_between(x1, 0, np.minimum(np.minimum(y1, y2), y3), where=(x1<=10), color='grey', alpha=0.5)# 标记可行域
plt.legend()# 求解线性规划问题
c = [-2, -1]  # 因为linprog求解的是最小化问题,所以目标函数取反
A = [[6, 2], [1, 1], [0, 5]]
b = [24, 5, 15]# 使用linprog求解
res = linprog(c, A_ub=A, b_ub=b, bounds=(0, None), method='highs')if res.success:# 绘制目标函数的最优解点plt.plot(res.x[0], res.x[1], 'ro', label='Optimal Solution')plt.legend()plt.show()print(f"Optimal value: {res.fun * -1:.2f}")  # 最大化目标函数的最优值print(f"Optimal solution: x1 = {res.x[0]:.2f}, x2 = {res.x[1]:.2f}")
else:print("No solution found")

二、建模示例

1.1 例1

某公司在计划期内要安排生产A、B两种产品(假设市场销路很好)。生产单位产品的利润以及所需的劳动力、设备台时以及原材料的消耗资料如下表所示。

产品 A B
劳动力(工时) 9 4 360
设备(台时) 4 5 200
原材料(千克) 3 10 300
单位产品利润 70 120
  • 决策变量

    • \(x_1\)为产品A的生产数量
    • \(x_2\)为产品B的生产数量
  • 目标函数
    最大化利润,目标函数为:

\[\text{Maximize } Z = 70x_1 + 120x_2 \]

  • 约束条件
    • 劳动力约束:\(9x_1 + 4x_2 \leq 360\)
    • 设备台时约束:\(4x_1 + 5x_2 \leq 200\)
    • 原材料约束:\(3x_1 + 10x_2 \leq 300\)
    • 非负性约束:\(x_1 \geq 0, x_2 \geq 0\)

将上述内容整合,线性规划的数学模型为:

\[ \text{Maximize } Z = 70x_1 + 120x_2 \] \[ \text{subject to} \] \[ 9x_1 + 4x_2 \leq 360 \] \[ 4x_1 + 5x_2 \leq 200 \] \[ 3x_1 + 10x_2 \leq 300 \] \[ x_1 \geq 0, x_2 \geq 0\]

这个数学模型可以通过图解法或使用线性规划求解器(如linprog)求解,从而找到最优的生产数量\(x_1\)\(x_2\)以使得公司利润最大化。

1.2 例2

每种蓅菜含有的营养素成份是不同的, 从医学上知道每人每周对每种营养成分的最低需求量。某医院营养室在制定下一周菜单时, 需要确定表中所列六种荒菜的供应量, 以便使费用最小而又能满足营养素等其它方面的要求。规定白菜的供应一周内不多于 20 kg , 其它蔬菜的供应在一周内不多于 40 kg , 每周共需供应 140 kg 蔬菜, 为了使费用最小又满足营养素等其它方面的要求,问在下一周内应当供应每种疏菜各多少 kg ?

序号 蔬菜 维生素A 维生素C 烟酸 每千克费用
1 青豆 0.45 10 415 8 0.30 5
2 胡萝卜 0.45 28 9065 3 0.35 5
3 菜花 1.05 59 2550 53 0.60 8
4 白菜 0.40 25 75 27 0.15 2
5 甜菜 0.50 22 15 5 0.25 6
6 土豆 0.50 75 235 8 0.80 3
要求蔬菜提供的营养 维生素A 维生素C 烟酸 备注
要求值 6.00 25 17500 245 5.00
  • 决策变量
    \(x_1, x_2, x_3, x_4, x_5, x_6\)分别为青豆、胡萝卜、菜花、白菜、甜菜、土豆的供应量(kg)。

  • 目标函数

\[\text{Minimize } Z = 5x_1 + 5x_2 + 8x_3 + 2x_4 + 6x_5 + 3x_6 \]

  • 约束条件
    满足营养需求,每种蔬菜的供应量上限,以及总供应量。
    • 铁的约束:

\[0.45x_1 + 0.45x_2 + 1.05x_3 + 0.40x_4 + 0.50x_5 + 0.50x_6 \geq 6.00 \]

  • 磷的约束:

\[10x_1 + 28x_2 + 59x_3 + 25x_4 + 22x_5 + 75x_6 \geq 25 \]

  • 维生素A的约束:

\[415x_1 + 9065x_2 + 2550x_3 + 75x_4 + 15x_5 + 235x_6 \geq 17500 \]

  • 维生素C的约束:

\[8x_1 + 3x_2 + 53x_3 + 27x_4 + 5x_5 + 8x_6 \geq 245 \]

  • 烟酸的约束:

\[0.30x_1 + 0.35x_2 + 0.60x_3 + 0.15x_4 + 0.25x_5 + 0.80x_6 \geq 5 \]

  • 蔬菜供应量上限:

\[x_4 \leq 20 \quad x_1, x_2, x_3, x_5, x_6 \leq 40 \]

  • 总供应量:

\[x_1 + x_2 + x_3 + x_4 + x_5 + x_6 = 140 \]

  • 非负性约束:

\[x_1, x_2, x_3, x_4, x_5, x_6 \geq 0 \]

  • 数学模型

\[\begin{align*} \text{Minimize } Z = & 5x_1 + 5x_2 + 8x_3 + 2x_4 + 6x_5 + 3x_6 \\ \text{subject to } & \\ & 0.45x_1 + 0.45x_2 + 1.05x_3 + 0.40x_4 + 0.50x_5 + 0.50x_6 \geq 6.00 \\ & 10x_1 + 28x_2 + 59x_3 + 25x_4 + 22x_5 + 75x_6 \geq 25 \\ & 415x_1 + 9065x_2 + 2550x_3 + 75x_4 + 15x_5 + 235x_6 \geq 17500 \\ & 8x_1 + 3x_2 + 53x_3 + 27x_4 + 5x_5 + 8x_6 \geq 245 \\ & 0.30x_1 + 0.35x_2 + 0.60x_3 + 0.15x_4 + 0.25x_5 + 0.80x_6 \geq 5 \\ & x_4 \leq 20 \\ & x_1, x_2, x_3, x_5, x_6 \leq 40 \\ & x_1 + x_2 + x_3 + x_4 + x_5 + x_6 = 140 \\ & x_1, x_2, x_3, x_4, x_5, x_6 \geq 0 \end{align*}\]

这个模型可以通过线性规划求解器(如 linprog)来求解,从而找到最小费用的蔬菜供应方案。

参考资料

  1. 《运筹学》考研考点讲义
  2. 《运筹学》知识点全总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/744046.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx ./nginx -s reload 工作进程pid与实际不一致导致平滑重启报错

某次修改nginx配置后使用 ./nginx -s reload 重启nginx, 结果报错, 如图所示, 去kill工作进程的时候显示找不到该进程原因是位于nginx/logs下的 nginx.pid 中的pid和实际不一致造成的 nginx.pid 文件是 Nginx web 服务器在启动时创建的一个进程标识符 (PID) 文件。这个文件包含…

第七天学习笔记(经验测试,白盒测试)

经验测试法 错误推测法 基于经验的测试技术之错误推测法 错误推测法也叫错误猜测法,就是根据经验猜想,已有的缺陷,测试经验和失败数据等可能有什么问题并依此设计测试用例.异常分析法 基于经验的测试技术之异常分析法 系统异常分析法就是针对系统有可能存在的异常操作、软硬…

SQL Server sa账号被锁定

SQL Server的sa账号老是被锁(登录已锁定)问题:最近sa登录老是被锁定,去查看数据库->安全性->sa账号右键属性,在状态选项卡中找到sql server 身份验证 ,发现“登录已锁定”被勾选了;把这个勾选去掉,然后提示必须修改密码。“登录已锁定”的勾选去掉并修改密码后又能…

B+树要点梳理

B+树重要操作 中间节点中间节点的key,与其对应的指针的原则是,小于key的元素在其指针指向的节点中 中间节点的key可以看成是右斜着排放的,即小于等于key的节点由key对应的指针指定,最有一个指针指向大于最右侧key的节点分裂当中间节点数量满了时,进行分裂,新生成一个相邻…

AI学习 | 概念解释 + Scikit-learn 的简单情况

一些机器学习概念解释点击查看代码 * 机器学习:是AI的一个子集,不用人类显式编程,让计算机通过算法自行学习和改进 * 监督学习:有数据、有标签,告诉机器什么是什么,让机器来学习输入和输出的映射关系。比如:分类和回归(预测)* 非监督学习:有数据没有标签,让机器自己…

LeetCode 1530. Number of Good Leaf Nodes Pairs

原题链接在这里:https://leetcode.com/problems/number-of-good-leaf-nodes-pairs/description/ 题目: You are given the root of a binary tree and an integer distance. A pair of two different leaf nodes of a binary tree is said to be good if the length of the s…

Windows节点加入K8S集群(K8S搭建Linux和Window混合集群)

说明:K8S多数情况用于linux系统的集群,目前很少人实践linux 和 windows 的混合集群。linux 和 windows 的K8S混合集群,是以linux 为Master节点,Windows 为 Node节点的。本示例linux 采用centos7.6,windows 采用 windows server 2019(均为虚拟机)。 一、前提准备1.熟悉li…

[笔记]快速傅里叶变换(FFT)

模板题:P3803 【模板】多项式乘法(FFT) 快速傅里叶变换(Fast Fourier Transform,FFT)在算法竞赛中主要用于求卷积,或者说多项式乘法。如果我们枚举两数的各系数相乘,时间复杂度是\(O(n^2)\),而FFT可以将这一过程优化到\(O(n\log n)\)。 流程 整个FFT算法分\(3\)个过程:…

Improving News Recommendation via Bottlenecked Multi-task Pre-training论文阅读笔记

Improving News Recommendation via Bottlenecked Multi-task Pre-training论文阅读笔记 Abstract 现存的问题: ​ 现有的 PLM 大多是在大规模通用语料库上预先训练的,并没有专门用于捕捉新闻文章中的丰富信息。因此,它们生成的新闻嵌入信息可能不足以表示新闻内容或描述新闻…

uniapp 微信小程序阻止返回上一页

第一种:wx.enableAlertBeforeUnload在开发者工具中预览效果 微信小程序官网:点我onShow(() => {wx.enableAlertBeforeUnload({message: "返回上页时弹出对话框",success: function (res) {console.log("方法注册成功:", res);},fail: function (errM…

基于NXP i.MX 6ULL核心板的物联网模块开发案例(1)

目录 前 言 1 SDIO WIFI模块测试 1.1 STA模式测试 1.2 AP模式测试 1.3 SDIO WIFI驱动编译 前言 本文主要介绍基于创龙科技TLIMX6U-EVM评估板的物联网模块开发案例,适用开发环境: Windows开发环境:Windows 7 64bit、Windows 10 64bit 虚拟机:VMware15.1.0 Linux开发环境:Ub…