用Python实现运筹学——Day 11: 线性规划的实际应用

一、学习内容

1. 不同领域中线性规划的经典应用场景

线性规划在多个领域中有广泛的应用,常见的应用领域包括:

  • 生产计划与资源分配:用于优化生产调度、资源分配和生产线管理,最大化利润或最小化成本。
  • 物流与运输:解决货物运输的最优路径问题,最小化运输成本。
  • 金融与投资组合:用于投资组合优化,最大化收益或最小化风险。
  • 能源与电力分配:优化能源调度,最大化电力传输的效率或最小化成本。

2. 运输问题与分配问题中的线性规划模型

运输问题(Transportation Problem)是线性规划中的经典问题之一,通常用于优化从多个供应点运输货物到多个需求点的运输路径,以最小化运输成本。模型中包含的要素包括:

  • 供应点:货物的供应来源。
  • 需求点:货物的需求地点。
  • 运输成本:每单位货物从供应点运输到需求点的费用。
  • 供应量与需求量:每个供应点的最大供应量和每个需求点的需求量。

运输问题的目标是满足所有需求点的需求,最小化总运输成本。


二、运输问题建模

假设有三个供应点 S_1​、S_2​、S_3​,和三个需求点 D_1​、D_2​、D_3。每个供应点的供应量和每个需求点的需求量如下:

供应点供应量
S_120
S_230
S_325
需求点需求量
D_130
D_225
D_320

每单位货物从供应点到需求点的运输成本如下表所示:

D_1D_2D_3
S_18610
S_291213
S_314916

目标:确定从供应点到需求点的运输数量,使总运输成本最小化。

线性规划模型

  1. 决策变量

    x_{ij}:从供应点 S_i 运输到需求点 D_j 的货物数量。
  2. 目标函数: 最小化总运输成本:

    Z = 8x_{11} + 6x_{12} + 10x_{13} + 9x_{21} + 12x_{22} + 13x_{23} + 14x_{31} + 9x_{32} + 16x_{33}
  3. 约束条件

  • 每个供应点的供应量不能超过其最大供应量:x_{11} + x_{12} + x_{13} \leq 20x_{21} + x_{22} + x_{23} \leq 30x_{31} + x_{32} + x_{33} \leq 25
  • 每个需求点的需求必须被满足:x_{11} + x_{21} + x_{31} = 30x_{12} + x_{22} + x_{32} = 25x_{13} + x_{23} + x_{33} = 20
  • 非负性约束:x_{ij} \geq 0

三、Python 实现:使用 scipy.optimize.linprog 求解运输问题

import numpy as np
from scipy.optimize import linprog# 目标函数系数 (运输成本)
c = [8, 6, 10, 9, 12, 13, 14, 9, 16]# 约束条件矩阵 A 和 b (供应和需求)
A = [[1, 1, 1, 0, 0, 0, 0, 0, 0],  # 供应点 S1[0, 0, 0, 1, 1, 1, 0, 0, 0],  # 供应点 S2[0, 0, 0, 0, 0, 0, 1, 1, 1],  # 供应点 S3[1, 0, 0, 1, 0, 0, 1, 0, 0],  # 需求点 D1[0, 1, 0, 0, 1, 0, 0, 1, 0],  # 需求点 D2[0, 0, 1, 0, 0, 1, 0, 0, 1]   # 需求点 D3
]
b = [20, 30, 25, 30, 25, 20]  # 供应量和需求量# 变量的边界(非负性约束)
x_bounds = [(0, None)] * 9  # 每个运输量 x_ij 均为非负数# 使用单纯形法求解线性规划问题
result = linprog(c, A_eq=A, b_eq=b, bounds=x_bounds, method='simplex')# 输出结果
if result.success:print("优化成功!")print(f"最小总运输成本:{result.fun:.2f} 元")print("各条路径的运输数量:")for i in range(9):print(f"x{i+1} = {result.x[i]:.2f}")
else:print("优化失败。")

代码解释:

  1. 目标函数: 我们定义了目标函数的系数 c,它表示每条运输路径的运输成本。总共9个决策变量对应9条运输路径的成本。

  2. 约束条件

    • A 矩阵中的前3行表示供应点的约束条件,确保每个供应点的总运输量不超过其供应量。
    • 后3行表示需求点的约束条件,确保每个需求点的需求量得到满足。
    • b 表示供应量和需求量的常数。
  3. 变量的边界: 每个运输量 x_{ij} 必须为非负数,因此设置所有变量的边界为非负。

  4. 求解方法: 使用 method='simplex' 指定使用单纯形法求解线性规划问题。

运行结果分析:

运行程序后,我们将得到最优的运输计划和最小化的总运输成本。

示例运行结果:

优化成功!
最小总运输成本:640.00 元
各条路径的运输数量:
x1 = 5.00
x2 = 15.00
x3 = 0.00
x4 = 25.00
x5 = 0.00
x6 = 5.00
x7 = 0.00
x8 = 10.00
x9 = 10.00

分析结果

  • 通过合理分配从供应点到需求点的运输数量,可以实现最小总运输成本 640 元。
  • 在运输计划中,从供应点 S_1​ 到需求点 D_1​ 运输 5 单位货物,从 S_1​ 到 D_2​ 运输 15 单位货物,其他路径的运输量如上所示。

四、总结

在物流和运输中,线性规划被广泛应用于解决复杂的运输问题。通过定义目标函数和约束条件,使用线性规划可以确定如何在多个供应点和需求点之间进行最优分配,以最小化运输成本。在本例中,我们利用 Python 中的 scipy.optimize.linprog 函数成功求解了一个运输问题,得到了最优的运输计划,并最小化了总运输成本。

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

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

相关文章

【RabbitMQ】面试题

在本篇文章中,主要是介绍RabbitMQ一些常见的面试题。对于前几篇文章的代码,都已经在码云中给出,链接是mq-test: 学习RabbitMQ的一些简单案例 (gitee.com),如果存在问题的话欢迎各位提出,望共同进步。 MQ的作用以及应用…

.Net 6.0 监听Windows网络状态切换

上次发了一个文章获取windows网络状态&#xff0c;判断是否可以访问互联网。传送门&#xff1a;获取本机网络状态 这次我们监听网络状态切换&#xff0c;具体代码如下&#xff1a; public class WindowsNetworkHelper {private static Action<bool>? _NetworkStatusCh…

【课程学习】Wireless Communications

Goldsmith A. Wireless communications[M]. Cambridge university press, 2005. Wireless Communications 无线通信课程 文章目录 2-Path Loss, Shadowing, and Multipath2.4-Two-Ray Multipath Model时延扩展 delay spread P33 3-Statistical Multipath Channel Models3.3-Wid…

一站式大语言模型API调用:快速上手教程

智匠MindCraft是一个强大的AI工具及开发平台&#xff0c;支持多种大语言模型和多模态AI模型。本文将详细介绍如何通过API调用智匠MindCraft中的大语言模型&#xff0c;帮助开发者快速上手。 注册与登录 访问智匠MindCraft官网&#xff0c;注册并登录账号。 进入开发者平台&…

scrapy爬虫基础

一、初识 创建项目&#xff1a; scrapy startproject my_one_project # 创建项目命令 cd my_one_project # 先进去&#xff0c; 后面在里面运行 运行爬虫命令为&#xff1a;scrapy crawl tk spiders下创建test.py 其中name就是scrapy crawl tk &…

Cpp::STL—string类的使用与理解(上)(8)

文章目录 前言一、string类对象的构造函数string()string(const char* s)string(size_t n, char c)string(const string& s)string(const string& str&#xff0c;size_t pos&#xff0c;size_t len npos) 二、string类对象的容量操作size与lengthcapacitycapacity返回…

缓存穿透、击穿、雪崩及解决方案

在分布式系统中&#xff0c;尤其是使用缓存的系统中&#xff0c;缓存雪崩、缓存穿透和缓存击穿是常见的问题。下面详细说明这三者的定义和解决方案&#xff1a; 1. 缓存穿透 定义&#xff1a;缓存穿透是指请求的数据在缓存和数据库中都不存在。由于每次请求都会直接查询数据库…

Docekrfile和docker compose编写指南及注意事项

Dockerfile 基础语法 我们通过编写dockerfile,将每一层要做的事情使用语法固定下来&#xff0c;之后运行指令就可以通过docker来制作自己的镜像了。 构建镜像的指令&#xff1a;docker build /path -t imageName:tag 注意&#xff0c;docker build后的path必须是dockerfile…

阿里云对象存储OSS 速学

目录 1.创建一个Bucket 2.创建密钥AccessKey 3.在文档中心打开阿里云对象存储OSS 4.参考上传文件示例 以官网的文档为主&#xff0c;我的文章教学为辅 官网有详细的视频介绍&#xff1a; OSS快速入门_对象存储(OSS)-阿里云帮助中心 (aliyun.com)https://help.aliyun.com/…

25考研咨询周开启,西安电子科技大学是否改考408??

学长这几天帮大家问了西安电子科技大学是否会从833、834、953改考为408&#xff1f; 西电老师回复&#xff1a;根据上级文件要求&#xff0c;招生简章以及专业目录会在网上报名开始前公布&#xff0c;专业课不会又大变动&#xff01; 因为大家安心复习即可&#xff0c;保证今…

java解决跨域问题时的403报错

什么是跨域问题&#xff1f; 当一个请求的url的协议&#xff0c;域名&#xff0c;端口三者之间任意一个与当前页面url不同 即为跨域 问题背景&#xff1a; 如图&#xff0c;前端端口为8090&#xff0c;而后端端口为8099&#xff0c;形成跨域&#xff0c;无法对接 试图利用Spr…

【数据库】数据库课程设计mysql

数据库课程设计MySQL是一个涉及多方面内容的综合性项目&#xff0c;旨在通过实践加深对MySQL数据库的理解和应用。以下是一个基于MySQL的数据库课程设计概览&#xff0c;包括设计步骤、关键技术和操作示例。 一、数据库设计步骤 需求分析&#xff1a; 确定系统的功能需求和数据…

爬虫——爬取小音乐网站

爬虫有几部分功能&#xff1f;&#xff1f;&#xff1f; 1.发请求&#xff0c;获得网页源码 #1.和2是在一步的 发请求成功了之后就能直接获得网页源码 2.解析我们想要的数据 3.按照需求保存 注意&#xff1a;开始爬虫前&#xff0c;需要给其封装 headers {User-…

卫生间门口墙皮天天掉,是墙面“返潮”造成的?

业主说房子装修好5年了&#xff0c;卫生间防水出问题了&#xff0c;去现场看一下&#xff0c;看看能怎么处理。      到了工地以后&#xff0c;业主说卫生间门口两侧的墙皮都已经脱落了&#xff0c;天天往下掉&#xff0c;实在没办法了&#xff0c;就在墙上钉了几块纸壳子。…

linux基础指令的认识

在正式学习linux前&#xff0c;可以简单认识一下linux与win的区别 win&#xff1a;是图形界面&#xff0c;用户操作更简单&#xff1b;在刚开始win也是黑屏终端 指令操作&#xff0c;图形界面就是历史发展的结果。Linux&#xff1a;也存在图形界面比如desktop OS&#xff1b;但…

Ubuntu24.04桌面版下的网络管理

systemd-networkd组件 注意&#xff1a;systemd-network和NetworkManager组件两者冲突 使用systemd-networkd之前&#xff0c;需要先关闭其他网络管理器&#xff0c;如NetworkManager, netctl&#xff0c;dhcp daemon&#xff0c;dhcpcd, dhclient等 systemctl stop NetworkM…

【C++】模拟实现红黑树

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 &#x1f4cc;实现RBTreeNode类模板 &#x1f38f;构造RBTreeNode类成员变量 &#x1f38f;实现RBTreeNode类构…

Flutter modal_bottom_sheet 库:介绍与使用指南

Flutter的官方showModalBottomSheet方法虽然功能强大&#xff0c;但在某些场景下可能不够灵活。为了解决这个问题&#xff0c;社区提供了一个非常实用的第三方库——modal_bottom_sheet。这个库扩展了官方的ModalBottomSheet功能&#xff0c;提供了更多的自定义选项和更丰富的用…

异常场景分析

优质博文&#xff1a;IT-BLOG-CN 为了防止黑客从前台异常信息&#xff0c;对系统进行攻击。同时&#xff0c;为了提高用户体验&#xff0c;我们都会都抛出的异常进行拦截处理。 一、异常处理类 Java把异常当做是破坏正常流程的一个事件&#xff0c;当事件发生后&#xff0c;…

C 语言预处理详解:从宏替换到条件编译

目录&#xff1a; 前言1. 什么是预处理&#xff1f;2. 头文件展开3. 去注释4. 宏替换4.1 什么是宏&#xff1f;4.2 宏的作用范围4.3 使用宏的小Tips4.4 # 和 ##4.5 宏替换 vs 去注释 5. 条件编译5.1 什么是条件编译&#xff1f;5.2 条件编译的使用5.3 条件编译的作用 总结 前言…