用Python实现运筹学——Day 3: 线性规划模型构建

news2024/11/6 7:11:29

一、学习内容

线性规划模型构建的步骤与技巧

线性规划(Linear Programming, LP)模型构建是运筹学中的核心内容,通常用于求解资源的最优分配问题。要从实际问题中提取出一个线性规划模型,需要按照以下步骤进行:

  1. 问题描述与分析: 首先,明确问题的实际背景,并识别问题的关键要素,如目标、限制条件和可控变量。

  2. 定义决策变量: 决策变量是影响目标函数值的变量。要明确哪些量是可以调整的,并将其设为变量。

  3. 构建目标函数: 目标函数是需要最大化或最小化的量,通常是与经济效益、成本、效率等相关的指标。目标函数应该是一个关于决策变量的线性表达式。

  4. 构建约束条件: 实际问题中的限制条件通常来源于资源的有限性、生产能力、市场需求等。这些条件通常以不等式或等式的形式表示,并且是线性的。

  5. 确定变量的非负性或其他约束: 决策变量通常有一些范围限制,如生产数量不能为负数。


二、实战案例:生产计划中的线性规划

2.1 问题描述

一家工厂生产两种产品:产品 A和产品 B。每种产品的利润、生产时间以及材料需求如下表所示:

产品每单位利润(元)每单位所需生产时间(小时)每单位材料需求(单位)
A5043
B4032

公司每天最多可提供 240 小时的生产时间和 180 单位的原材料。公司希望最大化利润,决定每天生产多少单位的产品 A 和产品 B。

2.2 构建线性规划模型
  1. 定义决策变量

    • x_1​:每天生产的产品 A 的数量。
    • x_2:每天生产的产品 B 的数量。
  2. 构建目标函数: 目标是最大化利润。利润来自生产 A 和 B,每单位 A 的利润为 50 元,每单位 B 的利润为 40 元。因此,目标函数为:

    Z = 50x_1 + 40x_2

    其中, Z 表示总利润。

  3. 构建约束条件

  • 生产时间限制:每单位 A 需要 4 小时,每单位 B需要 3 小时。总生产时间不能超过 240 小时,因此:4x_1 + 3x_2 \leq 240
  • 材料限制:每单位 A需要 3 单位原材料,每单位 B 需要 2 单位原材料。总材料消耗不能超过 180 单位,因此:3x_1 + 2x_2 \leq 180
  • 非负性约束:生产数量不能为负数:x_1 \geq 0, \quad x_2 \geq 0
2.3 Python 实现

我们将使用 scipy.optimize.linprog 函数求解这个线性规划问题。

import numpy as np
from scipy.optimize import linprog

# 目标函数系数 (将最大化问题转为最小化,通过乘 -1)
c = [-50, -40]  # 每单位产品A和产品B的利润

# 约束条件系数矩阵 (左边部分)
A = [
    [4, 3],   # 生产时间约束
    [3, 2]    # 材料需求约束
]

# 约束条件右侧常数项
b = [240, 180]  # 最大生产时间和最大材料使用量

# 变量的边界(非负性约束)
x_bounds = [(0, None), (0, None)]  # x1 和 x2 均为非负数

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

# 输出结果
if result.success:
    print("优化成功!")
    print(f"每天生产产品 A 的数量:{result.x[0]:.2f}")
    print(f"每天生产产品 B 的数量:{result.x[1]:.2f}")
    print(f"最大每日利润:{-result.fun:.2f} 元")
else:
    print("优化失败。")
2.4 代码解释
  1. 目标函数

    • 我们需要最大化目标函数 Z = 50x_1 + 40x_2​。在 scipy.optimize.linprog 中只能处理最小化问题,因此我们将目标函数的系数乘以 -1,使得最大化问题转为最小化问题。
  2. 约束条件

    • A_ub 表示不等式约束的系数矩阵,其中每一行代表一个约束条件。
    • b_ub 表示不等式约束右边的常数值。
    • x_bounds 限制变量 x_1x_2 为非负。
  3. 求解方法

    • method='highs' 是一种稳定且高效的线性规划求解方法。
2.5 运行结果分析

运行代码后,系统会输出每天生产产品 A 和 B 的最优数量,以及最大化的利润。运行结果(示例)

优化成功!
每天生产产品 A 的数量:30.00
每天生产产品 B 的数量:40.00
最大每日利润:3700.00 元

分析结果

  • 最优生产方案是每天生产 30 单位的产品 A和 40 单位的产品 B。
  • 此时的最大利润为 3700 元。
  • 这个结果满足生产时间和材料的限制,既没有超出资源限制,也能实现利润最大化。

三、总结

通过这个案例,我们展示了如何从实际问题中提取线性规划模型。构建模型时,需要明确决策变量、目标函数以及约束条件。该模型求解问题清晰,并且可以通过 Python 实现自动化求解,能够有效地帮助决策者优化资源配置并实现目标(如最大化利润或最小化成本)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb——Vue组件库Element(1/6):快速入门(什么是Element,安装,引入ElementUI组件库,复制组件代码,启动项目 )

目录 什么是Element 快速入门 安装 引入ElementUI组件库 访问官网,复制组件代码 启动项目 小结 了解完前端的工程化之后,接下来了解一门新的前端技术:Vue 的组件库 Element。 学习完 Element 之后,即使作为一名 Java 后…

VMware 如何上网

需求 在PC window中下载了VMware,并且加载的是Ubuntu系统。PC电脑连接的是手机热点。 可以看出WLAN连接的名称是:Wi-Fi 6 AX201 16MHz 如何让Ubuntu系统也能够上网。并且更新库,能够sudo apt-get install xxx相关库。 目前虚拟机中的Ubun…

PMP--二模--解题--121-130

文章目录 9.资源管理!团建不是万能的121、 [单选] 项目团队中一些经验丰富的成员抱怨项目经理。这些高级项目团队成员觉得项目经理在事无巨细地管理他们,阻碍他们完成工作。当项目经理意识到这些问题时,应该怎么做? 14.敏捷--组织…

深度学习之开发环境(CUDA、Conda、Pytorch)准备(4)

目录 1.CUDA 介绍 1.1 CUDA 的基本概念 1.2 CUDA 的工作原理 1.3 CUDA 的应用领域 2. 安装CUDA 2.1 查看GPU版本 2.2 升级驱动(可选) 2.3 查看CUDA版本驱动对应的支持的CUDA ToolKit工具包 2.4 下载Toolkit 2.5 安装(省略&#xff0…

数据结构讲解二叉树 【一】

🎁🎁创作不易,关注作者不迷路🎀🎀 C语言二叉树 【一】 前言一、数概念及结构1.数的概念1.2树的相关概念1.3树的表示 二、二叉树的概念及结构2.12.2二叉树的性质2.3二叉树的存储结构 三、二叉树的顺序结构实现3.1二叉树…

【有啥问啥】“弱激励学习(Weak Incentive Learning)”的原理与过程解析

“弱激励学习(Weak Incentive Learning)”的原理与过程解析 一、引言 在机器学习、人工智能以及更广泛的教育与培训领域,学习范式的多样性为提升智能体(AI模型、学生或企业员工)的能力提供了丰富的路径。弱激励学习作…

【最简单最直观的排序 —— 插入排序算法】

【最简单最直观的排序 —— 插入排序算法】 插入排序是一种简单直观的排序算法。其基本思想是把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。 插入排序的核心就是多趟选择插…

python模块之getopt

getopt.getopt(args, shortopts, longopts[]) 解析命令行选项及参数列表。 args:要解析的参数列表,但不包括当前执行的python脚本名称,一般等同于sys.argv[1:]。 shortopts:要识别的短选项字符串,如果后接:表示需要…

C++入门day4-面向对象编程(下)

前言:C入门day3-面向对象编程(中)-CSDN博客 初识:继承特性 继承的基础语法 class A{ public:int a; }; class B:public A { public:int b; }; B类通过继承A类后,内部会继承一个int变量 a:从下图我们可以…

Mesa三角形光栅化过程关键代码

1.先看下mesa三角形光栅化效果 2.这里是主要实现代码,Mesa的代码也是非常多,看了好多天。关键实现过程代码这个s_tritemp.h中 3.这里主要介绍渲染一个矩形的过程 a)在glut中两行代码: b) 中间过程代码忽略,进入static GLboolean run_render(…

生活英语口语柯桥学英语“再确认一下“ 说成 “double confirm“?这是错误的!

在追求英语表达的过程中,我们常常会遇到一些看似合理实则错误的表达习惯。今天,我们就来聊聊一个常见的误区——“再确认一下”被误译为“double confirm”。 “再次确认”不是double confirm 首先,我们需要明确,“double confi…

POI从3.14升级为5.2.0

最近word用的功能有点多&#xff0c;3.14功能太少&#xff0c;升级一下。 从5.0.X开始&#xff0c;poi-ooxml–schemas被重命名为poi-ooxml–full 最新版是5.3.0&#xff0c;但是word转pdf的工具最新到poi的5.2.0&#xff0c;所以用这个版本了 properties中变量 <poi.versio…

在docker中找不到文件

问题 这是我的Dockerfile&#xff1a; FROM mcr.microsoft.com/dotnet/sdk:8.0 as build WORKDIR /app EXPOSE 80COPY TotechsThunder.sln TotechsThunder.sln COPY mock/programminglanguages/programminglanguage.js mock/programminglanguages/programminglanguage.js COP…

大觅网之业务部署(Business deployment of Da Mi Network)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

ubuntu20.04.6 触摸屏一体机,外接视频流盒子开机输入登录密码触屏失灵问题解决方法

1. 首先直接运行xrandr命令&#xff0c;查看设备的相关信息&#xff1a; 运行之后会显示当前连接设备的屏幕信息&#xff0c;如下图&#xff0c;LVDS和VGA-0&#xff0c;而HDMI屏幕为disconnect&#xff0c;意为没有连接&#xff1a; 2. 设置开机主屏幕显示&#xff1a; xrand…

TypeScript 设计模式之【建造者模式】

文章目录 **建造者模式**&#xff1a;打造你的梦想之屋建造者的秘密建造者有什么利与害&#xff1f;如何使用建造者搭建各种房子代码实现案例建造者模式的主要优点建造者模式的主要缺点建造者模式的适用场景总结 建造者模式&#xff1a;打造你的梦想之屋 假设你想要一栋完美的…

LeetCode[简单] 876. 链表的中间结点

给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 思路 对任意正整数 n&#xff0c;中间结点的编号可以表示成 ⌊2n​⌋1。 解法一 /*** Definition for singly-linked list.* public class L…

数据分析:线性回归计算嵌套的组间差异

文章目录 介绍加载依赖包导入数据数据预处理数据概览线性回归画图森林图的特点:森林图的作用:总结系统信息介绍 在统计学中,嵌套的组间差异分析是一种评估不同组别间差异的方法,尤其适用于层级结构或分组数据。通过线性回归模型,我们可以计算出各个变量对于因变量的影响,…

priority_queue优先级队列(堆)详解。C++经验+1

什么是堆 首先我们先了解什么是堆&#xff1f;堆分为大根堆和小根堆。但其实大根堆会让人误以为是不是大的元素在下面呢&#xff1f;为了防止错误想法&#xff0c;大根堆也可以叫大顶堆。 大顶堆&#xff1a;顶上元素最大&#xff0c;上一层比下一层元素大。 小顶堆&#xff…

AI搜索软件哪个好,AI搜索引擎工具分享

随着AI技术的发展&#xff0c;AI搜索引擎工具正逐渐成为我们信息获取的重要方法。下面小编就来和大家分享一些好用的AI搜索引擎软件&#xff0c;感兴趣的同学可以逐个使用体验一下。因为每个AI搜索引擎工具不同&#xff0c;建议大家搜索的时候可以多个工具搜索&#xff0c;然后…