线性规划优化:基础

原文:towardsdatascience.com/linear-programming-optimization-foundations-2f12770f66ca

线性规划是一种强大的优化技术,它被用于许多领域的决策改进。这是关于线性规划的多部分系列的第一部分,将涵盖与线性规划相关的重要主题。这篇文章将是简单的,旨在在探讨更高级的线性规划主题之前介绍基础知识。

在这篇文章中,我们将:

  1. 讨论构成线性规划问题的要素

  2. 了解线性规划的工作原理及其为何强大

  3. 在 Python 中运行线性规划示例

我个人认为,例子是学习技术主题的有效途径。因此,我们将贯穿整篇文章使用一个简单的例子。我将在下一节介绍这个例子。

在我们深入探讨之前,如果你对优化的基本概念和术语不是很熟悉,我写了一篇关于优化的入门文章,我鼓励你在继续之前阅读(这篇文章中有许多通用的优化术语,我没有定义)。

优化直观基础

设置我们的例子

我们将遵循一个愚蠢的例子,为本文中我们将涵盖的概念提供背景。我们将想象我们是非常简单的人,我们只吃两样东西——苹果🍏和巧克力棒🍫。我们想要平衡我们的健康和口味享受。这就是我们例子的背景,在接下来的章节中,我将介绍线性规划的概念,并将其应用于这个例子。到那时,我们将进行完整的优化,帮助我们决定应该吃多少苹果和多少巧克力棒!

什么是线性规划?

线性规划是一种优化技术,它通过线性方程或不等式的约束条件最小化或最大化线性目标函数(这里有大量的术语,不用担心,我们很快就会在直观的例子中解释)。"线性规划"这个名字比我们现在通常认为的编程(即计算机编程)要早,线性规划是在二战时期开发和使用的。它被广泛用于管理操作程序——例如,将物资从工厂运送到前线。所以,“规划”指的是计划或调度,而不是计算机。这是一个历史背景,这样你就不会总是想知道“规划”部分何时出现!

虽然它最初是为了解决操作/后勤问题而开发的,但有许多巧妙的方法可以使线性规划适用于广泛的多种问题类型!

一个线性规划问题由以下 3 部分组成:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4e3a195fb4778e23671ac88eecce82fb.png

由作者提供

让我们为我们的苹果和巧克力棒示例设置这三个部分。

类型:我们希望最大化从食物中获得的享受——因此这是一个最大化问题。

目标函数:幸运的是,我们非常了解自己,可以量化我们对苹果和巧克力棒的喜爱程度——我们甚至更有运气,因为我们的喜爱程度是一个适合线性规划问题的线性函数 😅!

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3e34c1e9d10d0eb31e7dcbd1130a6fed.png

作者图片

这个函数可以用来计算我们吃多少苹果和巧克力棒可以获得多少享受。我们吃一个苹果获得 1 单位的享受,吃一个巧克力棒获得 3 单位的享受。

约束条件:虽然我们的饮食种类非常有限,但我们对我们健康有一点担忧。我们决定限制我们的(1)卡路里和(2)糖分摄入。由于我们想要控制两个变量,我们需要两个约束条件。我们需要设置线性函数来计算给定苹果和巧克力棒数量的卡路里和克糖。一旦我们设置了公式,我们将它们设置为不等式,基于我们想要限制的消费。我们决定我们不想吃超过 850 卡路里,也不想吃超过 100 克糖。

这里是我们的约束条件:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9d13b7c38381d645b95ec67be1828e3a.png

苹果含有 95 卡路里和 15 克糖,巧克力棒含有 215 卡路里和 20 克糖 - 作者图片

好的,我们现在已经完全设置好了线性规划问题!以下是总结:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1c7e0a38f634eea01f3d1ebe228d050b.png

作者图片

我们非常幸运,我们所有的食物消费偏好和约束都是线性的。关于基本线性规划允许的约束类型和目标函数有很多规则。违反规则的内容如下:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9f344225ae5fd6bbe27ee6b0f52e5cea.png

作者图片

线性规划可以扩展以允许许多这些违规行为——但允许上述元素会失去保证解决方案将是全局最优的。对于今天的示例,我们将保持在线性规划范围内!未来的文章将探讨我们如何使用修改后的线性规划框架,称为混合整数线性规划,来违反一些这些规则。

工作原理

我认为通过创建图形表示来理解线性规划的工作原理是最容易的。由于我们只有两个决策变量,我们可以制作出漂亮的二维图表(我们只吃两种食物是多么方便)。我们首先通过图表来表示我们的约束条件:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a79c176ac3adedaa3ee791ef7ee99080.png

约束条件以视觉形式表示 – 作者图片

橙色和蓝色线条是我们的线性约束。我们只接受小于或等于这两条线的解。阴影区域是我们的可行解空间。线性规划问题的任务是找到解空间中最大化我们的目标函数(我们的食物享受)的位置。这可能会显得有些令人畏惧——我们的解空间是无限的(因为我们可以吃苹果和巧克力棒的分数部分)!不过不用担心,因为我们的所有函数都是线性的,我们可以使用一个技巧将我们的无限解空间减少到一个有限集合!

让我们稍微思考一下我们的解空间。它是被蓝色和橙色线条所包围的灰色区域。在寻找最优解时,我们寻找极端值——最低或最高。因此,最优解将在边界或灰色区域是有意义的,因为那是最极端的。现在,我们可以得出结论,我们的最优解将在我们的可行空间边界上。但这仍然是一个无限的空间。我们需要一个额外的技巧来得到一个有限解空间。让我们在我们的蓝色线条上随机选择一个点:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/eb38d11a155916ba33cfcb7d42f4f56e.png

作者图片

我们如何使这个点更加极端,同时保持在可行区域的边缘?我们可以将它滑动到可行区域左边的边缘,或者我们可以将它滑动到橙色线条与蓝色线条相交的右边。在那之后,橙色线条定义了可行区域而不是蓝色线条。这些点是这部分解空间的最极端点。如果我们对解空间的每个边缘或逻辑进行推理,我们会发现所有的交点都是边缘的最极端点。通过这个算法,我们通过只查看空间的角点来将我们的无限解空间减少到有限空间。如果我们的目标函数和约束条件是线性的,最优解将始终是角点之一!我们只需要查看所有角点的目标值,并选择具有最高或最低值的点!

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5592ef9e18ac940f5225c7547f2d1943.png

作者图片

下面是线性规划算法在角点处寻找最优解的图形表示:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4a23b97c18d4c2d040e277aa89756909.png

作者图片

如我们之前讨论的,对于一个线性规划问题,目标函数和约束条件必须是线性的。现在,我们对线性规划问题的工作原理有了更好的理解,即检查约束条件的角点,我们处于一个很好的位置来理解线性违反如何导致问题。当引入非线性函数时,极点可以出现在角点之间,因为线不是单调递增或递减的。这取消了线性规划通过检查角点来使潜在解列表有限的“技巧”。

在下面的示例中,我们的卡路里约束是二次的(当然这在实际中没有任何意义——但为了示例,我们就这么假设吧!)最优解现在是抛物线的最大值,它不在角上。所以,如果我们尝试在这个约束集上使用角点方法,我们会得到一个次优解!总的来说,约束和目标函数需要是线性的,因为线性规划依赖于角点是极点,这意味着最优解总是在角上。正如我们下面看到的,当这一点不成立时,“技巧”并不能保证得到最优解。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3f7d34c75b6b3b911f36446308fbe4ea.png

非线性约束下最优解不仅限于角点 - 图片由作者提供

现在,我将花几分钟时间讨论两种 LP 算法会运行但不会返回最优解的情况。第一种情况是,满足所有约束条件的解空间为空。例如,如果我决定我想吃负数的糖,那么在卡路里约束以下和 X、Y 轴上的 0 以上将没有空间。下面是一个示例图表。这将导致一个“不可行”的结果。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2a2debb31c2bec5f5a0953ea6513b98a.png

无可行区域 - 图片由作者提供

第二种情况是,解空间没有被约束完全包围。想象一下,如果我们想吃至少 850 卡路里和 100 克糖,而不是少于 850 卡路里和 100 克糖(这意味着我们改变了约束条件为≥),那么我们的解空间将是无界的。我们可以总是吃更多的巧克力棒和苹果,获得更多的享受。当然,这没有意义!我们会得到一个“无界”的结果——这意味着无法达到有意义的最优解。在排除了这两个注意事项之后,让我们用 Python 解决 LP 问题。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/084acf9b4f0124c0b38f51a14ef53417.png

无界线性规划问题示例 - 图片由作者提供

在 Python 中运行示例

现在我们将探讨如何使用名为 pulp 的包在 Python 中解决这个线性规划问题。在我们深入这些细节之前,我已经写了两篇关于线性规划的文章。一篇关于模拟的文章,间接展示了线性规划如何帮助虚构的房地产开发商优化利润。另一篇文章介绍了名为“地球搬运工距离”的分布比较度量,它在计算中使用了线性规划。下面是链接,您可以查看更多线性规划的应用示例!

模拟数据,真实学习:情景分析

使用地球迁移距离比较分布

好的,让我们继续编写我们一直在讨论的示例代码!代码编写并不太难。

在导入 pulp 包后,我们实例化一个 pulp.LpProblem 对象——在这里我们定义我们是在解决最大化问题还是最小化问题。

importpulp# Create the LP problemlp_problem=pulp.LpProblem("Apples and Candy Bars",pulp.LpMaximize)

在我们的问题实例化后,让我们使用 pulp.LpVariable 函数创建我们的决策变量,即苹果和巧克力棒。注意:可以将 lowBound 参数设置为 0,为决策变量添加非负约束。

# Define the decision variablesapples=pulp.LpVariable('apples',lowBound=0)candy_bars=pulp.LpVariable('candy_bars',lowBound=0)

现在,我们使用‘+=’运算符将我们的目标函数和约束条件添加到问题实例中。Pulp 没有参数来指示你是否直接添加目标函数或约束条件。相反,它将没有等式/不等式的函数解释为目标函数,而有等式/不等式的函数解释为约束条件。这有点令人困惑,但当你查看下面的代码片段时,希望你会明白。

# Add the objective function - level of enjoyment from specific diet# notice, no equality or inequality at the end of the functionlp_problem+=1*apples+3*candy_bars# Add calorie constraintlp_problem+=95*apples+215*candy_bars<=850# Add sugar constraintlp_problem+=15*apples+20*candy_bars<=100

好的,现在一切都已经设置好了!我们只需要在我们的 lp_problem 对象上调用 solve()方法并打印结果!

# Solve the problemlp_problem.solve()# Print the resultsprint(f"Status:{pulp.LpStatus[lp_problem.status]}")print(f"apples ={pulp.value(apples)}")print(f"candy bars ={pulp.value(candy_bars)}")print(f"Objective value ={pulp.value(lp_problem.objective)}")

这里是打印出的结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a138630694f94ccf5e39edf706a88391.png

作者图片

“最优”状态意味着已经找到了最优解——如果没有找到可行解或者它是无界的,那么“状态”属性将向我们指示这一点。我们可以看到,最优解是吃 3.95 块巧克力棒和 0 个苹果,总共获得 11.86 的享受。这正是我们手动解决问题时找到的结果!

这里是代码的单一片段:

importpulp# Create the LP problemlp_problem=pulp.LpProblem("Apples and Candy Bars",pulp.LpMaximize)# Define the decision variablesapples=pulp.LpVariable('apples',lowBound=0)candy_bars=pulp.LpVariable('candy_bars',lowBound=0)# Add the objective function - level of enjoyment from specific dietlp_problem+=1*apples+3*candy_bars# Add calorie constraintlp_problem+=95*apples+215*candy_bars<=850# Add sugar constraintlp_problem+=15*apples+20*candy_bars<=100# Solve the problemlp_problem.solve()# Print the resultsprint(f"Status:{pulp.LpStatus[lp_problem.status]}")print(f"apples ={pulp.value(apples)}")print(f"candy bars ={pulp.value(candy_bars)}")print(f"Maximum enjoyment ={pulp.value(lp_problem.objective)}")

结论

到现在为止,你应该已经很好地理解了什么是线性规划问题,线性规划问题如何找到最优值,以及如何在 Python 中设置和解决它们!在未来的文章中,我们将详细介绍 LP 算法如何检查边缘(称为单纯形法)以及如何将整数变量(而不是仅连续变量)扩展到 LP 问题中。

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

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

相关文章

数据标准管理实践指南(2.0)

扫描下载文档详情页: https://www.didaidea.com/wenku/16315.html

优化数据点值的自动化方案

在数据分析和优化领域中,如何高效地处理和优化大量数据点是一个常见的挑战。尤其是当涉及到多属性数据点时,问题变得更加复杂。今天我们将探讨如何利用Python中的SciPy库来解决一个实际问题:如何自动化调整数据点的"新值"以满足一系列约束条件,同时最小化旧值与新…

LibGDX中的多边形绘制优化

在游戏开发中,绘制多边形是常见的任务之一。特别是当我们需要处理复杂的形状或大量的点时,性能和错误处理就显得尤为重要。本文将通过一个具体的实例,讨论如何在LibGDX中优化多边形的绘制,并避免常见的IndexOutOfBoundsException错误。 问题背景 当使用LibGDX的ShapeRend…

Hive与Doris整合:MPP引擎加速大数据分析

Hive与Doris整合&#xff1a;MPP引擎加速大数据分析关键词&#xff1a;Hive, Doris, MPP, 大数据分析, 数据整合, 向量化执行, 实时查询加速摘要&#xff1a;本文深入探讨Apache Hive与Apache Doris的整合技术&#xff0c;解析如何通过MPP&#xff08;大规模并行处理&#xff0…

这是一份简洁的PHP开发速成手册

好的&#xff0c;这是一份简洁的PHP开发速成手册&#xff0c;涵盖核心概念和常用操作&#xff1a;PHP开发速成手册1. 环境搭建推荐工具包&#xff1a; XAMPP (包含Apache服务器、MySQL数据库、PHP)。代码编辑器&#xff1a; VS Code (推荐安装PHP相关扩展) 或 PhpStorm。2. 基础…

解决Gradle中NPM命令失效问题

在使用IntelliJ IDEA进行项目开发时,尤其是在处理前端资产(assets)构建的任务中,我们可能会遇到一些奇异的问题。今天我们来讨论一个常见但不易解决的错误:在Gradle脚本中调用npm命令时失败,报错信息为“Cannot run program ‘npm’… No such file or directory”。 问…

Agentic AI提示工程可解释性增强:重要方法与实际应用

Agentic AI提示工程可解释性增强&#xff1a;重要方法与实际应用 一、引入与连接&#xff1a;当AI Agent学会"说清楚" 凌晨2点&#xff0c;急诊室的李医生盯着电脑屏幕上的诊断报告&#xff0c;眉头紧皱。 “患者高烧39℃、咳嗽伴呼吸困难&#xff0c;AI Agent建议诊…

Flutter购物车界面优化实战

在开发移动应用时,用户界面(UI)的美观和功能性是成功的关键之一。今天我们来探讨一个实际案例,关于如何优化一个购物车界面的布局问题,特别是当遇到内容溢出问题时的解决方案。 问题描述 在Flutter开发中,RenderFlex溢出错误是常见的UI布局问题之一。当我们设计一个购物…

键盘码探秘:C#中无限循环键盘监听的实现与优化

在日常的编程学习中,了解键盘按键的ASCII码或键码是非常有用的技能。这不仅能够帮助我们更好地处理用户输入,还能让我们在开发用户界面时更具创造性。今天我们来探讨一下如何使用C#编写一个能够持续监听键盘输入的程序,并解决一些常见的编程问题。 基本概念介绍 在C#中,键…

Shiny App与PostgreSQL的无缝对接:动态查询的实现

在开发Shiny应用时,常见的挑战之一是如何有效地从数据库中动态获取数据。尤其是当用户的输入需要动态地插入到SQL查询中时,问题就会变得复杂。本文将通过一个实例,展示如何在Shiny应用中实现与PostgreSQL数据库的无缝对接,并解决动态查询的问题。 背景 假设我们正在开发一…

前后端分离网上购物商城系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着电子商务的快速发展&#xff0c;网上购物商城系统已成为现代商业的重要组成部分。传统的前后端耦合架构在开发效率、维护成本和用户体验方面存在诸多局限性&#xff0c;难以满足日益增长的市场需求。前后端分离架构通过解耦前端展示与后端逻辑&#xff0c;显著提升了系…

深入探讨Blazor组件的布局与实践

在现代Web开发中,Blazor作为一种新的Web框架,结合了服务端渲染和WebAssembly的优势,提供了强大的前端开发体验。今天我们来讨论一个常见但重要的主题:Blazor组件的布局问题。特别是,当涉及到可路由和不可路由的组件时,我们应该如何决定它们的放置位置? 什么是Blazor组件…

SpringBoot+Vue 甘肃非物质文化网站平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

摘要 甘肃非物质文化遗产作为中华优秀传统文化的重要组成部分&#xff0c;承载着丰富的历史文化信息和民族智慧。随着信息技术的快速发展&#xff0c;传统的非遗保护方式已难以满足现代社会的需求&#xff0c;数字化保护与传承成为重要趋势。本项目旨在构建一个基于SpringBoot和…

【Java 开发日记】我们来说一下 synchronized 与 ReentrantLock

【Java 开发日记】我们来说一下 synchronized 与 ReentrantLock 的二、详细区别分析 1. 实现层面 synchronized&#xff1a; Java 关键字&#xff0c;由 JVM 底层实现&#xff08;通过 monitorenter/monitorexit 字节码指令&#xff09;。 锁信息记录在对象头的 Mark Word 中。…

Java Web 教师工作量管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 随着教育信息化的快速发展&#xff0c;高校教师工作量管理逐渐成为提升教学效率和管理水平的重要环节。传统的人工记录和统计方式效率低下&#xff0c;容易出错&#xff0c;且难以实现数据的实时更新和共享。教师工作量管理系统通过数字化手段&#xff0c;能够有效整合教学…

串口通信学习

串口道信抗干扰能力低——>RS232&#xff08;提升了电平大小增加抗干扰能力&#xff09;——>RS485&#xff08;差分线形式增加抗干扰能力&#xff09;

springboot集成Jasypt实现配置文件启动时自动解密-ENC

SpringBoot本身并没有自动加解密的功能&#xff0c;平时项目启动时&#xff0c;自动解密配置文件里ENC( )包含的数据&#xff0c;原因是使用了Jasypt&#xff08;Java Simplified Encryption&#xff09;。一、前置条件&#xff0c;maven引入依赖<!-- Spring Boot集成Jasypt…

webstrom提交git时总是会自动格式化,导致页面报错Expected no line breaks before closing bracket, but 1 line break found

开发的时候明明都是好的&#xff0c;最后提交的时候因为编辑器的自动格式化&#xff0c;导致页面一堆报错、Expected no line breaks before closing bracket, but 1 line break found 。气死了发现都是某一行的代码写的特别的长&#xff0c;他在提交时自动格式化&#xff0c;换…

SpringBoot+Vue 小徐影城管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着数字化时代的快速发展&#xff0c;影院管理系统的智能化需求日益增长。传统影院管理方式依赖人工操作&#xff0c;效率低下且易出错&#xff0c;难以满足现代影院的高效运营需求。小徐影城管理系统管理平台旨在通过信息化手段解决这一问题&#xff0c;实现影院的自动化…

滤波前后对比图

% 读取数据 pwr freadbkj(../rmli/rmli.ave, 5902, float32, b);% 原始干涉图数据 phase_complex freadbkj(20091226_20100515.diff, 5902, cpxfloat32, b); cc freadbkj(20091226_20100515.cc, 5902, float32, b);% ADF处理后的干涉图数据 adf_phase_complex freadbkj(200…