关于离散模型优化的一份介绍

离散模型优化是运筹学和计算机科学领域中的一个重要分支,它主要研究如何在有限的、通常是计数的决策变量空间中寻找最优解。这类问题通常出现在资源分配、生产计划、物流管理、网络设计等实际应用场景中。在这篇文章中就将介绍离散模型优化中关于线性规划等部分内容。

一、优化建模简介

优化建模是数学规划的一个重要组成部分,它涉及将现实世界的问题转化为数学形式,以便使用数学方法和算法来求解最优解决方案。优化建模的核心在于定义一个目标函数(即想要最小化或最大化的量),并根据实际情况设置一系列约束条件。

关于优化建模,其涉及以下概念:

目标函数:优化问题的核心是定义一个目标函数,表示所追求的目标,比如成本最小化、利润最大化等。

决策变量:指需要确定其值的未知数,它们直接影响目标函数的值。

约束条件:为了确保解决方案的实际可行性,需要对决策变量施加限制。这些限制可以是等式也可以是不等式。

可行解:满足所有约束条件的决策变量的取值称为可行解。

最优解:在所有可行解中,使目标函数达到最优值的解称为最优解。

然后,关于一类优化问题,我们会首先对于它给出一个基本模型,其大概为:

\;\;\;\;Opt \;\;\;f_j(X)\;\;\;\;\;\;j\in J \\ s.t. \\ \;\;\;\;g_i(X)\begin{Bmatrix}\geq \\ = \\ \leq \end{Bmatrix}b_i \;\;\;\;i\in I

其中,“Opt”(Optimize)的意思是优化(最大化或最小化),下标“j”表示优化函数的一个或多个函数,这些函数是属于有限集合J,并以整数下标来区分。向量X的各个分量称为该模型的决策变量,而函数f_i (x)就是目标函数。“s.t.”(subject to)的意思是决策变量必须满足某些边界条件。

对于这个模型,我们可以举出如下例子:

假设我们是一家制造公司,正在尝试优化我们的产品产量 XX 以最大化利润 f(X)。然而,我们的生产和销售受到一些限制,比如原材料供应量 b1​ 和市场需求量 b2​。我们可以将这个问题表述成以下的优化问题:

Maximize \;\;\;\;f(X)=pX-cX \\ s.t. \\ g_1(X)=X\leq b1 \\ g_2(X)=X\geq b2

其中,

p 是产品的售价;

c 是单位产品的成本;

X 是我们要生产的数量;

b1 是可用的原材料总量;

b2 是市场的需求量。

二、优化问题的分类

关于一个优化问题是否具有约束条件,我们可以将之分为有约束的无约束的。具体说:

无约束优化问题:这类问题没有对决策变量的任何限制,目标是在整个定义域内找到使目标函数达到最优值的点。常见的无约束优化问题包括一些简单的最小化或最大化问题,如寻找多项式的极值点。

有约束优化问题:这类问题中,决策变量必须满足一组或多组约束条件。这些约束条件可以是等式约束或不等式约束,它们限制了可行解的空间。有约束优化问题更为普遍,因为大多数实际问题都会涉及到资源、成本、物理限制等方面的约束。

其中,线性规划就是十分经典的一种有约束的优化问题。对于一个优化问题,如果它有唯一的的目标函数,且当一个决策变量出现在目标函数和任何约束函数中它都只以一次幂的形式出现,目标函数和任何约束函数不包含决策变量的乘积项,并且其中的决策变量的系数都是常数,那么这个优化问题就是线性规划问题。反之则是非线性规划问题

另外,如果目标函数多于一个则被称为多目标目标规划。像在刚才的问题中,p与c这样的系数大概率是不能知道精确值的,或是有时仅仅只是代表了实际值的平均值,但这个平均值又会与实际值有较大偏差。此时,如果这些系数与时间有关,那么它对应的问题就会被称呼为动态规划(DP);如果系数本质上是随机的,那么就被称呼为随机规划;如果一个或多个决策变量被限制为只能取整数,那么这样的问题称呼为整数规划(IP);如果只是部分被限制,则称呼为混合整数规划

2.1 无约束优化问题

关于无约束优化问题下面给出一个例子:

首先我们考虑一个简单的二次函数:

f(x)=x^2+4x+5

我们想要求得其最小值所对应的x,则需要先求得其导数,并将倒数设为零:

{f}'(x)=2x+4=0

并求得x=-2,为了确认 x=−2x=−2 是否为最小值点,我们可以检查二阶导数:

f''(x)=2

那么有f''(x)>0,所以x=-2是最小值点,将之带回原式可以得到:

f(-1)=1

2.2 动态规划

关于动态规划,其实我在之前的文章中有专门讲到,那么我们在这里可以比较下算法设计中的dp与数学建模的中的dp的异同点:

相同处:二者都是将原问题进行分解,并将子问题的答案进行存储以避免不必要的资源浪费。

不同处:

在应用场景上,算法中的dp用于主要应用于序列决策问题,如背包问题、最长公共子序列(LCS)、编辑距离等,并且通常处理的是离散的状态和动作空间,而数学建模中的dp主要用于解决连续或离散的优化问题,如资源分配、生产计划、库存控制等。此外它可以可以处理连续的状态和动作空间;

在状态与动作上,前者中状态往往是离散的,可以用整数或枚举类型表示,而后者中状态则可以是连续的,也可以是离散的,通常用实数或向量表示。至于动作则与状态类似;

在价值函数上,前者中通常表示为一个数组或表,存储每个子问题的最优解,而后者中可以是连续的函数,通常用数学公式表示。

2.3 整数规划

下面举一个整数规划的例子:

假设一家工厂生产两种产品 A 和 B。每种产品的生产需要消耗一定的原材料和工时,工厂希望在满足市场需求的同时最大化利润。具体数据如下:

产品 A:每单位产品需要 2 单位原材料和 1 单位工时。每单位产品的利润为 30 元。

产品 B:每单位产品需要 1 单位原材料和 2 单位工时。每单位产品的利润为 20 元。

资源限制:工厂每天最多可以提供 10 单位原材料。工厂每天最多可以提供 12 单位工时。

市场需求:每天最多可以销售 5 单位产品 A。每天最多可以销售 6 单位产品 B。

此时,我们需要建立一个整数规划模型来最大化总利润。

那么,我们可以总结出以下模型:

2.4 多目标规划

然后是一个多目标规划的例子:

假设一家公司生产两种产品 A 和 B。公司希望同时最大化利润和最小化生产成本。具体数据如下:

产品 A:每单位产品需要 2 单位原材料和 1 单位工时。每单位产品的利润为 30 元。每单位产品的生产成本为 10 元。

产品 B:每单位产品需要 1 单位原材料和 2 单位工时。每单位产品的利润为 20 元。每单位产品的生产成本为 15 元。

资源限制:公司每天最多可以提供 10 单位原材料。公司每天最多可以提供 12 单位工时。

我们需要建立一个多目标规划模型来同时最大化利润和最小化生产成本。

可以总结出模型如下:

2.5 随机规划

这里可以给出一个简单的随机规划的题目来参考下:

假设一家工厂生产一种产品,需要决定每天的生产量。生产过程中存在不确定的需求量,工厂希望通过制定生产计划来最小化总成本,同时满足需求。

三、线性规划

3.1 几何解法

所谓几何解法就是将建模所得的几个线性函数画于同一图中,然后它们所包围起来的图形就是可行域,图形的顶点是极点,然后我们可以在这些极点中找到最优解,在如下代码所画出的图中,所标红的极点就是最优解。代码与图像如下:

import numpy as np
import matplotlib.pyplot as plt# 定义约束条件的边界
def constraint1(x1):return 10 - 2 * x1def constraint2(x1):return (12 - x1) / 2# 定义目标函数的等值线
def objective_line(x1, k):return (k - 30 * x1) / 20# 绘制约束条件
x1 = np.linspace(0, 10, 400)
plt.plot(x1, constraint1(x1), label='2x1 + x2 = 10')
plt.plot(x1, constraint2(x1), label='x1 + 2x2 = 12')# 绘制非负约束
plt.axvline(x=0, color='black', linewidth=0.5)
plt.axhline(y=0, color='black', linewidth=0.5)# 绘制可行解区域
feasible_region = np.array([[0, 0],[5, 0],[4, 4],[0, 6]
])
plt.fill(feasible_region[:, 0], feasible_region[:, 1], alpha=0.3, label='Feasible Region')# 绘制目标函数的等值线
k_values = [0, 60, 120, 180, 200]
for k in k_values:plt.plot(x1, objective_line(x1, k), linestyle='--', label=f'30x1 + 20x2 = {k}')# 标记最优解
optimal_x1 = 4
optimal_x2 = 4
plt.plot(optimal_x1, optimal_x2, 'ro', label=f'Optimal Solution ({optimal_x1}, {optimal_x2})')# 设置图例和标签
plt.xlabel('x1 (Product A)')
plt.ylabel('x2 (Product B)')
plt.legend()
plt.title('Geometric Solution of Linear Programming Problem')
plt.grid(True)
plt.show()# 输出最优解和最优利润
optimal_profit = 30 * optimal_x1 + 20 * optimal_x2
print(f"Optimal Solution: x1 = {optimal_x1}, x2 = {optimal_x2}")
print(f"Optimal Profit: {optimal_profit}")

 

3.2 代数解法

在线性规划的代数解法中,其核心思路就是一种枚举的思路,即将所求的决策变量分别为0,然后求值比较得出最优解。

举个例子,有如下的一个模型:

Max \;\;\;25x_1+30x_2 \\s.t.\\ 20x_1+30x_2\leq 690\\ 5x_1+4x2\leq 120\\ x_1,x_2\geq 0 

那么,我们可以通过代数解法总结出如下的表来:

极点目标函数值
A(0,0)0
B(24,0)600
C(12,15)750
D(0,23)690

观察这个表不难得出最优解为C(12,15) 

4.3 单纯形法

单纯形法不同于前两种,它是通过迭代求取最优解,其融合了最优性检验和可行性检验。其具体步骤如下:

1.标准化问题:将所有不等式约束转换为等式约束,通过引入松弛变量或剩余变量。确保所有变量都是非负的。

2.构建初始单纯形表:将目标函数和约束条件写成标准形式。构建初始单纯形表,其中每一行代表一个约束条件,最后一行代表目标函数。

3.选择进入基的变量:选择目标函数中系数最大的非基变量作为进入基的变量(对于最大化问题)。如果所有非基变量的系数都非正,则当前解已经是最优解。

4.选择离开基的变量:计算每个基变量与进入基变量的比例,选择最小的非负比例对应的基变量作为离开基的变量。这一步确保新解仍然可行。

5.更新单纯形表:通过行操作将进入基的变量变为基变量,同时保持其他基变量不变。更新单纯形表中的所有元素。

6.重复迭代:重复步骤3到5,直到找不到可以改进目标函数的变量为止。

下面我们通过一个具体例子来理解:

假如我们有一个线性规划的模型如下:

Maximimize \;\;\;\;3x_1+2x_2\\ s.t.\\ 2x_1+x_2\leq 10\\ x_1+2x_2\leq 12\\ x_1,x_2\geq 0

那么,我们引入一个松弛变量后变为如下:

2x_1+x_2+s_1=10\\ x_1+2x_2+s_2=12\\ -s_1-s_2+z=0

可以得到单纯形表为:

x1x2s1s2右端项
211010
120112
-3-2000

然后选择 x1作为进入基的变量,因为它的系数最大为-3。 

接着计算最小比例可得:10/2=5    12/1=1,选择s1作为离开基的变量,然后原先的式子变形为:

x_1+\frac{1}{2}x_2+\frac{1}{2}s_1=5\\ \frac{3}{2}x_2-\frac{1}{2}s_1+s_2=7\\ \frac{1}{2}x_2+\frac{3}{2}s_1=1

此时又可以总结出单纯形表,重复上述步骤,最后得到一个这样的单纯形表:

x1x2s1s2右端项
012/3-1/38/3
01-1/32/314/3
001.51/338/3

此时,所有非基变量的系数都非正,因此当前解是最优解,即为:

x_1=\frac{8}{3}\;\;\; x_2=\frac{14}{3}\;\;\;\ z=\frac{38}{3} 

然后我们可以对于这个问题写出如下的代码:

from pulp import *# 创建一个问题实例
prob = LpProblem("LinearProgramming", LpMaximize)# 定义决策变量
x1 = LpVariable("x1", lowBound=0)
x2 = LpVariable("x2", lowBound=0)# 定义目标函数
prob += 3*x1 + 2*x2# 添加约束条件
prob += 2*x1 + x2 <= 10
prob += x1 + 2*x2 <= 12# 求解问题
status = prob.solve()# 输出结果
print(f"Status: {LpStatus[status]}")
print(f"x1 = {value(x1)}")
print(f"x2 = {value(x2)}")
print(f"Objective Value: {value(prob.objective)}")

其输出为:

At line 2 NAME          MODEL
At line 3 ROWS
At line 7 COLUMNS
At line 14 RHS
At line 17 BOUNDS
At line 18 ENDATA
Problem MODEL has 2 rows, 2 columns and 4 elements
Coin0008I MODEL read with 0 errors
Option for timeMode changed from cpu to elapsed
Presolve 2 (0) rows, 2 (0) columns and 4 (0) elements
0  Obj -0 Dual inf 4.9999998 (2)
0  Obj -0 Dual inf 4.9999998 (2)
2  Obj 17.333333
Optimal - objective value 17.333333
Optimal objective 17.33333333 - 2 iterations time 0.002
Option for printingOptions changed from normal to all
Total time (CPU seconds):       0.00   (Wallclock seconds):       0.00Status: Optimal
x1 = 2.6666667
x2 = 4.6666667
Objective Value: 17.333333500000002
4.4 敏感性分析

敏感性分析用于研究当模型的参数(如目标函数系数、约束条件的右侧常数等)发生变化时,最优解的变化情况。敏感性分析有助于了解模型的稳健性和决策的可靠性。其主要内容有:目标函数系数的变化、约束条件右侧常数的变化、新增变量或约束的影响。

四、数值搜索方法

4.1 二分搜索法

二分法我们应该是十分熟悉的,它在算法设计等方面有广泛运用,所以在此,仅给出一份代码:

def binary_search_iterative(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] < target:low = mid + 1else:high = mid - 1return -1# 示例使用
sorted_list = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
target_value = 11
index = binary_search_iterative(sorted_list, target_value)
print(f"元素 {target_value} 在列表中的位置为 {index}")
4.2 黄金分割搜索方法

黄金分割法是采用黄金数进行搜索,即是将搜索的区间按0.618的比例去进行分割。大概过程与二分搜索方法类似,所以在此不赘述了。

此上

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

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

相关文章

hadoop_yarn详解

YARN秒懂 YARN定义基础架构ResourceManagerNodeManagerApplicationMasterContainer 工作流程资源调度器FIFO SchedulerCapacity SchedulerFair Scheduler 常用命令 YARN定义 YARN&#xff08;Yet Another Resource Negotiator&#xff09;是Hadoop的一个框架&#xff0c;它负责…

【MYSQL】数据库日志 (了解即可)

一、错误日志 可以通过 tail查看文件的日志的&#xff0c;如果发生错误&#xff0c;就会在日志里出现问题。 二、二进制日志&#xff08;binlog&#xff09; BINLOG记录了insert delete update 以及 alter create drop 等语句。作用是灾难时的数据恢复&#xff0c;还有就是主…

接口测试整体框架

接口测试 1. 接口 接口&#xff0c;也叫api&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;&#xff0c;接口&#xff08;Interface&#xff09;是指不同软件组件或系统之间进行交互的点。接口定义了组件之间如何通信&#xff0c;包括…

递归搜索与回溯算法

递归搜索与回溯算法 名词解释 递归 在解决⼀个规模为n的问题时&#xff0c;如果满⾜以下条件&#xff0c;我们可以使⽤递归来解决&#xff1a; a. 问题可以被划分为规模更⼩的⼦问题&#xff0c;并且这些⼦问题具有与原问题相同的解决⽅法。 b. 当我们知道规模更⼩的⼦问题&…

基于java+SpringBoot+Vue的中小型医院网站设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

图神经网络研究综述(GNN),非常详细收藏我这一篇就够了!

图神经网络由于其在处理非欧空间数据和复杂特征方面的优势&#xff0c;受到广泛关注并应用于推荐系统、知识图谱、交通道路分析等场景。 大规模图结构的不规则性、节点特征的复杂性以及训练样本的依赖性给图神经网络模型的计算效率、内存管理以及分布式系统中的通信开销带来巨…

36.安卓逆向-壳-脱壳实战

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。第一…

办公耗材管理新纪元:系统化解企业挑战,助力高效运营

在当今竞争激烈的商业环境中&#xff0c;无论是大型企业还是中小型企业&#xff0c;办公耗材管理都是关乎企业运营效率与成本控制的关键环节。有效的办公耗材管理不仅能显著降低运营成本&#xff0c;还能提升整体工作效率&#xff0c;确保业务的顺畅进行。然而&#xff0c;许多…

2、 家庭网络发展现状

上一篇我们讲了了解家庭网络历史(https://blog.csdn.net/xld_hung/article/details/143639618?spm1001.2014.3001.5502),感兴趣的同学可以看对应的文章&#xff0c;本章我们主要讲家庭网络发展现状。 关于家庭网络发展现状&#xff0c;我们会从国内大户型和小户型的网络说起&…

时序论文20|ICLR20 可解释时间序列预测N-BEATS

论文标题&#xff1a;N-BEATS N EURAL BASIS EXPANSION ANALYSIS FOR INTERPRETABLE TIME SERIES FORECASTING 论文链接&#xff1a;https://arxiv.org/pdf/1905.10437.pdf 前言 为什么时间序列可解释很重要&#xff1f;时间序列的可解释性是确保模型预测结果可靠、透明且易…

hadoop_capacity-scheduler.xml

hadoop3.2.3capacity-scheduler.xml配置实例 <configuration><property><!-- 可以处于等待和运行状态的应用程序的最大数量 --><name>yarn.scheduler.capacity.maximum-applications</name><value>10000</value></property>&l…

小白必看:知识库搭建的详细拆解步骤

在当今信息爆炸的时代&#xff0c;企业知识库成为了企业积累、管理和分享知识的重要工具。对于初学者来说&#xff0c;搭建一个企业知识库可能看起来是一项复杂的任务&#xff0c;但通过以下步骤&#xff0c;即使是小白也能轻松上手。本文将详细拆解搭建企业知识库的步骤&#…

042 异步编排

文章目录 什么是异步Future异步编排1串行关系执行thenRunthenApplythenAcceptthenCompose 2聚合ANDthenCombinethenAcceptBothrunAfterBoth 3OR聚合applyToEiteracceptEitherrunAfterEither 4异常处理exceptionallywhenCompletehandle 异步开启1RunAsync:没有使用自定义线程池&…

【算法设计与分析】采用特征方程求解递归方程

文章目录 K阶常系数线性齐次递归方程K阶常系数线性【非】齐次递归方程例题例1&#xff1a;齐次无重根例2&#xff1a;齐次有重根例3&#xff1a;非齐次&#xff0c;g(n)是n的多项式例4&#xff1a;非齐次&#xff0c;g(n)是n的指数形式&#xff0c;a不是重根 练习其它求解递归方…

SAP ABAP开发学习——function alv复选框设置

1.关于报表复选框的创建 首先该报表要调用功能函数 这里参照SLIS_LAYOUT_ALV定义字段 参照来源 具体字段的定义 双击 双击这两个查看需要的字段 box_fieldname就是复选框 需要在内表定义需要的名称&#xff0c;这里使用‘BOX 相关内容完成

5.7 与 8.0 对相同文件的 LOAD DATA 语句结果不同

5.7 与 8.0 对相同文件的 LOAD DATA 语句结果不同 问题描述 某客户现场支持&#xff0c;由MySQL 5.7.21升级MySQL 8.0.25后&#xff0c;通过LOAD DATA导入文件&#xff0c;当同一会话连续导入不同的编码&#xff08;UTF8/GB18030&#xff09;文件时会出现乱码。数据库版本未升…

河南梦想城供配电项目-综合监控平台[智能运维+集中监控]

河南梦想城供配电项目-综合监控平台软件 可分为主机系统&#xff08;针对单个站房的实时监测&#xff09;和集中云平台&#xff08;针对多个站房的集中管理&#xff09;&#xff0c;可实现电气设备隐患预警&#xff0c;站房环境风险可控&#xff0c;系统与电力平台以IEC61850标…

每日计划-1114

完成 14. 最长公共前缀 #include <string> #include <vector>class Solution { public:string longestCommonPrefix(std::vector<std::string>& strs) {if (!strs.size()) {return "";}int length strs[0].size();int count strs.size();fo…

《深度学习》AlexNet网络

文章目录 1.AlexNet的网络架构2.示例&#xff1a;手写数字识别2.1 数据读取 学习目标&#xff1a; 知道AlexNet网络结构能够利用AlexNet完成图像分类 2012年&#xff0c;AlexNet横空出世&#xff0c;该模型的名字源于论⽂第⼀作者的姓名AlexKrizhevsky 。AlexNet使⽤了8层卷积…

嵌入式软件开发环境的搭建

1.ARM指令模拟器环境搭建 keil软件 KEIL是公司的名称&#xff0c;有时候也指KEIL公司的所有软件开发工具。2005年&#xff0c;Keil被ARM公司收购&#xff0c;成为 ARM的子公司之一。 MDK&#xff08;Microcontroller Development Kit&#xff09; &#xff0c;也称MDK-ARM、…