用Python实现运筹学——Day 7: 线性规划的对偶理论

一、学习内容

1. 对偶问题的概念与对偶定理

线性规划的对偶理论是一种非常重要的理论,能揭示线性规划问题中的原问题和对偶问题之间的关系。给定一个线性规划的原问题,可以通过构造一个相关的对偶问题来帮助理解原问题的解,或者直接求解对偶问题来简化原问题的计算。

  • 原问题(Primal Problem):原始的线性规划问题通常是要最大化或最小化某个目标函数,同时满足若干约束条件。
  • 对偶问题(Dual Problem):对偶问题是一种与原问题相关的线性规划问题,其解与原问题有密切的关系。对偶问题的目标函数由原问题的约束条件构造,且对偶问题的约束条件由原问题的目标函数构造。

对偶定理指出:

  • 如果原问题有最优解,则对偶问题也有最优解,且原问题与对偶问题的最优解是相同的。

对偶问题的构造

  • 原问题是最大化时,对偶问题是最小化。
  • 原问题的约束条件中的不等式方向会在对偶问题中发生变化(≤ 变成 ≥)。
  • 原问题中的决策变量在对偶问题中变成了约束条件,对应的对偶变量称为“影子价格”或“拉格朗日乘子”。
2. 原问题与对偶问题的关系
  • 原问题与对偶问题是相互关联的。对偶问题中的约束条件是由原问题的目标函数和决策变量构成的。
  • 当原问题是一个资源分配问题时,对偶问题可以解释为资源的影子价格问题。
  • 强对偶性:如果原问题和对偶问题都有可行解,则它们的最优解相等。

二、实战案例:供应链优化问题

2.1 问题描述

假设一家工厂有两种资源:资源 1 和资源 2,分别有 20 和 40 单位的可用量。这家工厂可以生产两种产品:产品 A 和产品 B。每种产品的需求资源如下:

资源/产品产品 A 需求(单位)产品 B 需求(单位)
资源 112
资源 221

产品 A 每单位利润为 30 元,产品 B 每单位利润为 20 元。工厂希望最大化其总利润,生产多少单位的产品 A 和产品 B 才能使利润最大化?

2.2 原问题的线性规划模型

决策变量

  • x_1:生产产品 A 的数量。
  • x_2:生产产品 B 的数量。

目标函数: 最大化利润:

Z = 30x_1 + 20x_2

约束条件

  • 资源 1 的约束:x_1 + 2x_2 \leq 20
  • 资源 2 的约束:2x_1 + x_2 \leq 40
  • 非负性约束:x_1 \geq 0, \quad x_2 \geq 0
2.3 对偶问题的构造

为了构造对偶问题,我们引入对偶变量y_1y_2​,分别表示资源 1 和资源 2 的影子价格。对偶问题是最小化总影子价格,约束条件则来源于原问题的目标函数系数。

决策变量

  • y_1:资源 1 的影子价格。
  • y_2​:资源 2 的影子价格。

目标函数: 最小化资源的总成本:

W = 20y_1 + 40y_2

约束条件

  • 产品 A 的约束:y_1 + 2y_2 \geq 30
  • 产品 B 的约束:2y_1 + y_2 \geq 20
  • 非负性约束:y_1 \geq 0, \quad y_2 \geq 0

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

我们将使用 scipy 库的 linprog 函数来求解这个供应链优化问题的对偶问题。

import numpy as np
from scipy.optimize import linprog# 对偶问题的目标函数系数 (最小化)
c = [20, 40]  # 对应于影子价格 y1 和 y2 的系数# 约束条件系数矩阵
A = [[-1, -2],  # 约束 y1 + 2y2 >= 30(乘以 -1 变为 <=)[-2, -1]   # 约束 2y1 + y2 >= 20(乘以 -1 变为 <=)
]# 约束条件右侧常数项
b = [-30, -20]  # 将原来的 >= 变为 <= 后,常数项也需要变负# 变量的边界(非负性约束)
y_bounds = [(0, None), (0, None)]  # y1 和 y2 均为非负数# 使用单纯形法求解对偶问题
result = linprog(c, A_ub=A, b_ub=b, bounds=y_bounds, method='simplex')# 输出结果
if result.success:print("优化成功!")print(f"资源 1 的影子价格:{result.x[0]:.2f}")print(f"资源 2 的影子价格:{result.x[1]:.2f}")print(f"最小总影子价格:{result.fun:.2f} 元")
else:print("优化失败。")
3.1 代码解释
  1. 对偶问题的目标函数: 我们最小化资源 1 和资源 2 的总影子价格,即 W = 20y_1 + 40y_2

  2. 约束条件

    • 约束条件由产品 A 和产品 B 的原问题目标函数构造:
      • y_1 + 2y_2 \geq 30
      • 2y_1 + y_2 \geq 20
    • scipy.optimize.linprog 中,我们将这些不等式变为小于等于形式,即乘以 -1。
  3. 变量的边界y_1 和 y_2 都是非负数。

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

3.2 运行结果

运行程序后,我们将得到资源 1 和资源 2 的影子价格,以及最小化的总影子价格。示例运行结果

优化成功!
资源 1 的影子价格:5.00
资源 2 的影子价格:10.00
最小总影子价格:350.00 元

3.3 分析结果

  • 资源 1 的影子价格是 5 元,资源 2 的影子价格是 10 元。
  • 最小化的总影子价格为 350 元。
  • 这个影子价格表明在资源分配中的每一单位资源的边际价值,即每增加 1 单位资源对目标函数的增益。

四、总结

通过对偶理论,我们可以用对偶问题来间接求解原问题。对偶问题在经济和资源分配问题中具有重要的解释作用,尤其是影子价格的概念能够帮助决策者理解资源的边际价值。在供应链优化问题中,通过对偶问题求解,我们可以找到如何分配资源以使总成本最小化。

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

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

相关文章

详细分析Java中的StopWatch基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 StopWatch 是 Spring Fra…

【TabBar嵌套Navigation案例-新特性页面-背景图片 Objective-C语言】

一、接下来,我们来做这个背景图片的这个功能啊 1.首先呢,我们command + R跑一下,现在都是有一堆颜色, 大体的这个框架啊,我们都已经搭好了, 接下来,我们把这几个颜色啊,CollectionView的背景图片,给它设置一下, 首先呢,这个设置啊,我们这么着来做,我们呢,肯定…

解决:使用layui.treeTable.updateNode,更新表格数据后,done里面的事件丢失问题

1. 背景 在给树形表格添加行点击事件&#xff0c;并且只更新当前行数据。 treeTable.updateNode("SpeProjListId", result.LAY_DATA_INDEX, result);更新数据后&#xff0c;点击事件失效。 1. 给字段绑定事件&#xff1a; class"link_a link_style" , {…

草莓病虫害数据集1000张分5类 草莓植株黑斑病、草莓灰霉菌病、正常草莓、草莓粉霉菌病、草莓橡胶病

草莓病虫害数据集 1000张 分5类 草莓植株黑斑病、草莓灰霉菌病、正常草莓、草莓粉霉菌病、草莓橡胶病 草莓病虫害数据集介绍 名称 草莓病虫害数据集 规模 图像数量&#xff1a;1000张高质量图像类别数量&#xff1a;5类 草莓植株黑斑病 (Black Spot Disease)草莓灰霉菌病 (…

【Python】Curdling:Python 包管理的高效工具

Curdling 是一个轻量级的 Python 包管理工具&#xff0c;旨在加速 Python 包的安装和管理流程。与传统的包管理工具&#xff08;如 pip&#xff09;相比&#xff0c;Curdling 更加注重性能优化和效率&#xff0c;特别是在处理大规模依赖项和项目构建时表现优异。它通过并行化的…

360° 镜头检测铝件内壁划痕与杂质:保障铝件内孔制造质量的精准方案

在铝件内孔制造的过程中&#xff0c;内壁的质量把控是至关重要的环节。制造过程中产生的碎屑残留以及划痕等问题&#xff0c;不仅会影响铝件的外观&#xff0c;更可能对其性能和使用寿命造成严重的损害。为了精准检测这些问题&#xff0c;我们提出了一套基于 360 镜头的检测方案…

3. 将GitHub上的开源项目导入(clone)到本地pycharm上——深度学习·科研实践·从0到1

目录 1. 在github上搜项目 (以OpenOcc为例&#xff09; 2. 转移到码云Gitee上 3. 下载整个项目到本地 4. 在pycharm中打开项目 1. 在github上搜项目 (以OpenOcc为例&#xff09; 把链接复制下来&#xff0c;转移到国内Gitee上&#xff0c;会更稳定 2. 转移到码云Gitee上 &…

深度学习-11

线性层及其它层介绍 归一化层 在深度学习中&#xff0c;归一化层&#xff08;Normalization Layers&#xff09;是神经网络中非常重要的一部分&#xff0c;它们有助于在训练过程中稳定网络&#xff0c;加速收敛&#xff0c;以及提高模型的泛化能力。以下是PyTorch框架中一些常…

6.1 微服务 服务发现 架构模式分类 应用实践

微服务 服务发现 架构模式分类 应用实践 目录概述需求&#xff1a; 设计思路实现思路分析1.类型-客户端发现2.类型-服务端服务发现3.工具-Eureka4.工具-Consul5.工具-zookper服务发现的挑战服务发现的最佳实践 参考资料和推荐阅读 Survive by day and develop by night. talk …

谷歌Gemini 1.5 AI模型升级:成本更低、性能更强、响应更快

AITOP100获悉&#xff0c;9月24日&#xff0c;谷歌谷歌Gemini 1.5 AI模型升级&#xff1a;成本更低、性能更强、响应更快对其旗下Gemini 1.5 AI模型进行了升级&#xff0c;推出了Gemini-1.5-Pro-002和Gemini-1.5-Flash-002两款新模型。这两款模型在成本、性能和响应速度方面均有…

在线PDF怎么转换成JPG图片?分享14种转换操作!

作为一名社畜&#xff0c;俺也经常要将PDF转换为图片格式&#xff01; 如何进行快速转换&#xff0c;包括电脑端、在线端和手机端&#xff0c;今天俺就测评了50款工具&#xff0c;给你得出了下面这些渠道&#xff0c;不少也是免费的&#xff0c;相信对你有帮助哦&#xff01; …

Spring - @Import注解

文章目录 基本用法源码分析ConfigurationClassPostProcessorConfigurationClass SourceClassgetImportsprocessImports处理 ImportSelectorImportSelector 接口DeferredImportSelector 处理 ImportBeanDefinitionRegistrarImportBeanDefinitionRegistrar 接口 处理Configuratio…

2-3树(2-3 Tree):原理、常见算法及其应用

目录 引言 2-3树的基本概念 常见算法 查找节点 插入节点 删除节点 2-3树的应用场景 1. 文件系统目录管理 应用原理 场景描述 2. 字典编码 应用原理 场景描述 总结 优势对比 自平衡特性 灵活的节点结构 高效的操作性能 简单的实现 广泛的应用场景 数据一致…

遥感图像分割

遥感图像分割是一种应用于遥感图像的计算机视觉技术&#xff0c;用于将图像划分为不同的区域&#xff0c;每个区域代表地表的不同特征&#xff0c;如水体、森林、城市区域等。这种分割帮助我们更好地理解和分析地球表面的变化&#xff0c;对于环境监测、城市规划、农业、灾害管…

AR技术在电商行业的应用及优势有哪些?

AR&#xff08;增强现实&#xff09;技术在电商行业的应用广泛且深入&#xff0c;为消费者带来了全新的购物体验&#xff0c;同时也为商家带来了诸多优势。以下是AR技术在电商行业的主要应用场景及其优势&#xff1a; 一、应用场景 1、虚拟商品展示与试用 家具AR摆放&#x…

济南站活动回顾|IvorySQL中的Oracle XML函数使用示例及技术实现原理

近日&#xff0c;由中国开源软件推进联盟PG分会 & 齐鲁软件园联合发起的“PostgreSQL技术峰会济南站”在齐鲁开源社举办。瀚高股份IvorySQL作为合作伙伴受邀参加此次活动。 瀚高股份IvorySQL技术工程师 向逍 带来「IvorySQL中的Oracle XML函数兼容」的议题分享。在演讲中&a…

前端vue-form表单的验证

form表单验证的完整步骤

二叉树的中序遍历(java)

概述 关于二叉树&#xff0c;我们都不陌生&#xff0c;许多基于递归的问题发起点都是一个二叉树的root节点。对于各种二叉树的问题&#xff0c;我们也是通过dfs进行求解。例如求二叉树的深度、最近公共祖先等 算法分析 关于二叉树的中序遍历&#xff0c;我们都知道应该先访…

【C++单调队列】1438. 绝对差不超过限制的最长连续子数组|1672

本文时间知识点 C队列、双向队列 LeetCode1438. 绝对差不超过限制的最长连续子数组 给你一个整数数组 nums &#xff0c;和一个表示限制的整数 limit&#xff0c;请你返回最长连续子数组的长度&#xff0c;该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。 如…

Flume实战--Flume中的选择器、自动容灾(故障转移)、负载均衡的详解与操作

本文详细介绍了Apache Flume的关键特性&#xff0c;包括选择器、拦截器、故障转移和负载均衡。选择器负责将数据分发到多个Channel&#xff0c;拦截器用于修改或丢弃Event。故障转移机制能够在Sink故障时自动切换&#xff0c;而负载均衡则在多个Sink间分配负载。文章还提供了自…