用Python实现运筹学——Day 6: 单纯形法求解过程

news2024/11/17 19:22:34

一、学习内容

1. 单纯形法的详细步骤

单纯形法是通过迭代过程来优化线性规划问题的解决方案。该算法从可行解空间的一个顶点出发,逐步沿着可行解空间的边界移动到另一个顶点,直到找到最优解。单纯形法的求解过程分为以下几个步骤:

  1. 初始化

    • 选择一个可行的基础解作为初始解(称为基础可行解),即所有约束条件中的等式均满足。通常将所有非决策变量设为 0 来获得初始解。
  2. 迭代步骤

    • 在每一步迭代中,确定目标函数的改进方向,并沿该方向前进,寻找一个新的解。
    • 对于每个变量,检查其对应的目标函数的系数是否可以进一步改进。如果有,选择一个方向增加或减少该变量的值。
  3. 终止条件

    • 当所有变量的改进方向无法再继续优化时,算法停止,当前的解即为最优解。

2. 单纯形法与基解的关系

单纯形法在每次迭代时,都会在一个顶点上停留,称为基解。在迭代过程中,算法通过替换和调节基变量,逐步找到可行解空间中使目标函数最优的基解。


二、实战案例:运输问题

2.1 问题描述

考虑一个简单的运输问题:某公司从两处工厂(工厂 1 和工厂 2)向两个市场(市场 A 和市场 B)运送货物。各工厂的产能以及各市场的需求如下表所示:

工厂/市场市场 A (需求 80)市场 B (需求 60)总产能
工厂 1 (产能 100)运费 2 元运费 3 元100
工厂 2 (产能 80)运费 5 元运费 1 元80

公司希望通过合理安排运输,使得运费最小化。

2.2 线性规划模型
  1. 决策变量

    • x_{11}:工厂 1 向市场 A 运输的货物量。
    • x_{12}:工厂 1 向市场 B 运输的货物量。
    • x_{21}​:工厂 2 向市场 A 运输的货物量。
    • x_{22}:工厂 2 向市场 B 运输的货物量。
  2. 目标函数: 最小化总运费:

    Z = 2x_{11} + 3x_{12} + 5x_{21} + 1x_{22}
  3. 约束条件

  • 需求约束(市场 A 和市场 B 的需求):

        x_{11} + x_{21} = 80 \quad (市场 A 的需求)

        x_{12} + x_{22} = 60 \quad (市场 B 的需求)

  • 供应约束(工厂 1 和工厂 2 的产能):

         x_{11} + x_{12} \leq 100 \quad (工厂 1 的产能)

        x_{21} + x_{22} \leq 80 \quad (工厂 2 的产能)

  • 非负性约束:

        x_{11}, x_{12}, x_{21}, x_{22} \geq 0


三、Python 实现:使用 scipy.optimize.linprog 单纯形法求解

我们将使用 scipy 库的 linprog 函数,采用单纯形法来求解这个运输问题。

import numpy as np
from scipy.optimize import linprog

# 目标函数系数 (最小化问题)
c = [2, 3, 5, 1]  # 各运输路线的运费

# 约束条件矩阵 A 和 b (左边系数和右边常数)
A = [
    [1, 0, 1, 0],   # 市场 A 的需求约束
    [0, 1, 0, 1],   # 市场 B 的需求约束
    [1, 1, 0, 0],   # 工厂 1 的产能约束
    [0, 0, 1, 1]    # 工厂 2 的产能约束
]

b = [80, 60, 100, 80]  # 各市场需求和工厂产能

# 变量的边界(非负性约束)
x_bounds = [(0, None), (0, None), (0, None), (0, None)]  # x11, x12, x21, x22 均为非负数

# 使用单纯形法求解线性规划问题
result = linprog(c, A_eq=A[:2], b_eq=b[:2], A_ub=A[2:], b_ub=b[2:], bounds=x_bounds, method='simplex')

# 输出结果
if result.success:
    print("优化成功!")
    print(f"工厂 1 向市场 A 运输的货物量:{result.x[0]:.2f}")
    print(f"工厂 1 向市场 B 运输的货物量:{result.x[1]:.2f}")
    print(f"工厂 2 向市场 A 运输的货物量:{result.x[2]:.2f}")
    print(f"工厂 2 向市场 B 运输的货物量:{result.x[3]:.2f}")
    print(f"最小总运费:{result.fun:.2f} 元")
else:
    print("优化失败。")
3.1 代码解释
  1. 目标函数: 我们需要最小化总运费 Z = 2x_{11} + 3x_{12} + 5x_{21} + 1x_{22}​,所以目标函数的系数为 [2, 3, 5, 1]

  2. 约束条件

    • A_eq 用于等式约束,即市场 A 和市场 B 的需求约束。
    • A_ub 用于不等式约束,即工厂 1 和工厂 2 的产能限制。
    • b_eqb_ub 分别表示需求和产能的上限。
  3. 变量的边界x_bounds 确保每条运输路线上的货物量为非负数。

  4. 求解方法: 使用 method='simplex' 指定单纯形法进行求解。

3.2 运行结果分析

运行程序后,我们将得到最优的运输分配方案,并计算出最小的总运费。

示例运行结果:

优化成功!
工厂 1 向市场 A 运输的货物量:0.00
工厂 1 向市场 B 运输的货物量:60.00
工厂 2 向市场 A 运输的货物量:80.00
工厂 2 向市场 B 运输的货物量:0.00
最小总运费:340.00 元

分析结果

  • 工厂 1 向市场 B 运输 60 单位货物。
  • 工厂 2 向市场 A 运输 80 单位货物。
  • 通过这种运输方案,总运费为 340 元,达到了最优。

四、总结

通过单纯形法,我们可以有效地解决运输问题,并优化资源的分配。单纯形法通过迭代过程逐步找到最优解,适用于多变量、多约束的线性规划问题。在这个案例中,单纯形法帮助我们最小化了运输成本,找到了一种最佳的运输分配方案。

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

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

相关文章

EE trade:黄金T+D是什么意思

黄金TD,全称“黄金延期交割”,是由上海黄金交易所推出的标准化合约,允许投资者以保证金的形式进行黄金交易,并可以选择当日交割或延期交割。它为国内投资者提供了一个全新的黄金投资渠道,但也存在一些风险,…

Linux进程切换以及调度算法

目录 Linux进程切换以及调度算法 Linux进程切换介绍 前置知识 进程切换过程分析 调度算法 补充知识 Linux进程切换以及调度算法 Linux进程切换介绍 前面提到,分时操作系统下,CPU会在多个进程中做高速切换以实现多个进程看似同时执行的&#xff0…

会员办理--足浴店系统开发代码———未来之窗行业应用跨平台架构

function fun_会员查询_事务_新增(){var 未来之窗vos对话框_内容 ;var title"test";var 未来之窗vos对话框_id"hjksgfjkkhkj";CyberWin_Dialog.layer(未来之窗vos对话框_内容,{type:"frame",title:"新增会员",move:false,width:"…

828华为云征文|WordPress部署

目录 前言 一、环境准备 二、远程连接 三、WordPress简介 四、WordPress安装 1. 基础环境安装 ​编辑 2. WordPress下载与解压 3. 创建站点 4. 数据库配置 总结 前言 WordPress 是一个非常流行的开源内容管理系统(Content Management System, CMS&#xf…

FTP 服务器 linux安装

文章目录 前言一、了解二、安装启动匿名连接 三、创建用户1. 创建系统用户2. 连接3. 连接不上? 5004. 还是连接不上? 5005. 还还还是连不上?530 补充关于创建用户useradd 命令如何设置用户不能登录shell不用系统指定的家目录 vsftpd 配置chro…

Python | Leetcode Python题解之第443题压缩字符串

题目&#xff1a; 题解&#xff1a; class Solution:def compress(self, chars: List[str]) -> int:def reverse(left: int, right: int) -> None:while left < right:chars[left], chars[right] chars[right], chars[left]left 1right - 1n len(chars)write lef…

Android15音频进阶之新播放器HwAudioSource(八十六)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…

面试扩展知识点

1.C语言中分为下面几个存储区 栈(stack): 由编译器自动分配释放堆(heap): 一般由程序员分配释放&#xff0c;若程序员不释放&#xff0c;程序结束时可能由OS回收全局区(静态区): 全局变量和静态变量的存储是放在一块的&#xff0c;初始化的全局变量和静态变量在一块区域&#…

线性表二——栈stack

第一题 #include<bits/stdc.h> using namespace std; stack<char> s; int n; string ced;//如何匹配 出现的右括号转换成同类型的左括号&#xff0c;方便我们直接和栈顶元素 char cheak(char c){if(c)) return (;if(c]) return [;if(c}) return {;return \0;/…

MySQL 高级 - 第十五章 | MySQL 事务日志

目录 第十五章 MySQL 事务日志15.1 redo 日志15.1.1 为什么需要 redo 日志15.1.2 redo 日志的优点与特点15.1.3 redo 的组成15.1.4 redo 的整体流程15.1.5 redo log 的刷盘策略15.1.6 不同刷盘策略演示15.1.7 写入 redo log buffer 过程15.1.8 redo log file 15.2 undo 日志15.…

lombok详细教程(详解)

Lombok 极速上手 此笔记来自于b站白马 背景 ⚠️ 开始学习Lombok前至少需要保证完成 JavaSE 课程中的注解部分&#xff0c;本课程采用的版本为 Java17 我们发现&#xff0c;在以往编写项目时&#xff0c;尤其是在类进行类内部成员字段封装时&#xff0c;需要编写大量的 get…

看480p、720p、1080p、2k、4k、视频一般需要多大带宽呢?

看视频都喜欢看高清&#xff0c;那么一般来说看电影不卡顿需要多大带宽呢&#xff1f; 以4K为例&#xff0c;这里引用一位网友的回答&#xff1a;“视频分辨率4092*2160&#xff0c;每个像素用红蓝绿三个256色(8bit)的数据表示&#xff0c;视频帧数为60fps&#xff0c;那么一秒…

基于微信小程序爱心领养小程序设计与实现(源码+参考文档+定制开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

excel统计分析(5): 非线性回归分析

非线性回归模型分类 非线性回归分析和预测模型包括&#xff1a;指数、对数、幂函数、多项式等。 &#xff08;1&#xff09;指数回归模型 指数回归模型适用于因变量随自变量的增加而迅速增长或减少的情况。 Yβ0⋅e^(β1⋅X) 其中&#xff0c;e是自然对数的底数&#xff0c;…

锐捷 NBR 1300G路由器 越权CLI命令执行漏洞

漏洞描述 锐捷NBR 1300G路由器 越权CLI命令执行漏洞&#xff0c;guest账户可以越权获取管理员账号密码 漏洞复现 FOFA title"锐捷网络 --NBR路由器--登录界面" 请求包 POST /WEB_VMS/LEVEL15/ HTTP/1.1 Host: Connection: keep-alive Content-Length: 73 Autho…

[SAP ABAP] SELECTION-SCREEN

SELECTION-SCREEN用来调节系统生成的画面 REPORT z437_test_2024.TABLES: mara, zdbt_sch_437.SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. " Title1 PARAMETERS:p_1 DEFAULT A,p_2 TYPE char10. SELECTION-SCREEN END OF BLOCK b1.SELECTION-SCREEN …

深入理解同步和异步与reactor和proactor模式

在现代网络编程中&#xff0c;I/O 设计模式对于提高性能和资源利用率至关重要。本文将探讨两种主要的网络 I/O 设计模式&#xff1a;同步 I/O 和异步 I/O&#xff0c;以及它们的实现方式。 同步 I/O 同步 I/O 模式要求用户通过系统调用函数&#xff0c;如 read(), write(), c…

Win10系统使用mstsc远程电脑的时候发现隔一段时间就无法使用剪贴板_rdpclip---Windows运维工作笔记055

最近在使用温湿系统的远程桌面功能的时候发现,每当使用一段时间的时候,这个时候远程桌面功能的粘贴板就没办法使用了。 正常情况下,不管我一个电脑远程了多少台电脑,那么这些电脑之间都是可以使用粘贴板的,可以用来从一个电脑中截了图,然后粘贴到另一个电脑中。 但是现…

【C++笔试强训】如何成为算法糕手Day6

学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 第一题&#xff1a;大数加法 思路&#xff1a; 第二题&#xff1a;链表相加 思路&#xff1a; 第三题&#xff1a;大数乘法 思路&#xf…

第五十八周周报 FE-GNN

文章目录 week58 FE-GNN摘要Abstract一、大数据相关1. 完全分布式zookeeper2. 污水处理过程2.1 污水处理的基本方法2.2 污水处理基本工艺流程 二、文献阅读1. 题目2. Abstract3. 文献解读3.1 Introduce3.2 创新点 4. 网络框架4.1 特征子空间平坦化4.2 结构化主成分4.3 结论 5. …