辅助决策:制定和实施优化模型
辅助决策:制定和实施优化模型
( 资源)
根据一个 文章 发表在 Inc. 杂志上,平均成年人需要 每天 35,000 个决定 ,从那些极其简单和即时的决策到需要高度关注并产生巨大影响的决策。在 Localiza 这样规模的公司的背景下,决策的规模也很大。决策通常是关于在某种情况下应该如何投入使用的。 数量有限 货物并寻求获得最佳结果。在这种情况下,我们可以使用定量方法来帮助决策。深入研究这些方法的一个领域是 数学优化 (有时也称为数学编程)。
“数学优化研究使某些数学方程的值最大化或最小化的方法”
客观上,数学优化研究使某个数学方程的值最大化或最小化的方法,即通过其输入变量找到其最高(或最低)值。这些变量的取值可能会受到一些‘规则’的限制。
强劲的投资 技术和数据 在 Localiza 进行的这项工作使复杂的问题能够通过数学优化得到解决。例如,对于我们的业务来说,一个非常相关且困难的问题是定义每辆 0 公里的汽车在我们获得后应该发送给哪个机构。这一决定,当得到支持时 优化模型 , 可以保证 更好的财务回报 分发的汽车并提高了我们的结果。解决此类问题并付诸实践 **** 优化技术,了解一些支持该理论的概念很重要。在本文中,我们将使用一个比上述问题更简单、更经典的问题(饮食问题)来探索这些概念,力求更具指导性。
例子:饮食问题
饮食问题是 做决定 购买哪些食物以尽可能降低成本,同时尊重应摄入的营养素的建议。
(这是一个经典的优化问题,也是 1940 年代创建运筹学领域的动机之一)。
在这个问题的背景下,考虑以下情况:一个人需要购买并且对他们可以吃的食物有灵活的饮食,可以选择吃面包、牛奶、奶酪、土豆、鱼或酸奶。但是,有以下要求(这里我们不关注计量单位):
- 无最低摄取量:
- 300卡路里;
- 10 种碳水化合物;
- 8 种脂肪; - 吃不超过10种蛋白质;
- 饮食应包含至少 1/2 的鱼。
Tabela 1. Dados do problema
面对这种情况,有必要 做决定 购买哪些食物以及获得多少食物,从而产生 尽可能低的成本 并尊重饮食。最后,我们在这里提出了我们的问题 .
成功解决优化问题的基本步骤是 很好地阐述问题到底是什么 需要解决这个问题,明确最终目标和游戏规则。
决策变量
一旦优化问题被制定和理解,重要的是定义哪个变量可以最好地代表最终决策,即可以对哪些元素采取一些行动。这些变量称为 决策变量 他们将被操纵以达到问题的最终目标。根据问题,这些变量可能属于整数、实数、非负数等的集合。
在此处处理的示例问题(饮食)中,我们可以将决策变量定义为将要购买的每种食物的数量。在数学上,我们将它们表示为 ** X** .
目的功能
使用前面的定义,重要的是能够确定如何作为决策变量的函数, 给定决策的质量 .这个测量是通过一个数学方程给出的,它应该很好地描述你的过程。另外,根据最终的目标,需要决定所求的是方程的最小值还是最大值。我们称之为最终表达式 目标函数。
在饮食方面,人们希望以尽可能低的成本购买食物已经是一个既定的事实。众所周知,每种食物的成本取决于数量。这样一来,我们的目标函数就可以很直观的写成最终的购买量,并表明我们想要最小化它,如下图所示。数学上的索引 ** 一世** 代表上表 1 中的每种食物,并且 ** C** 代表它的成本。
função objetivo
限制
在拥有目标函数和决策变量的定义后,在现实世界中的绝大多数问题中,我们只有有限的资源和必须遵守的规则/过程。对金钱、原材料、时间等的限制。这些限制定义了决策变量的搜索空间,即它们可以假设一定区间内的值。我们称这组限制 限制 .这些约束和目标函数的结合绘制了优化问题的搜索空间,例如,在 形象的 显示在本文的标题中。
饮食问题的限制基本上涉及必须摄入的营养素和/或食物的限制。为了尊重这一点,有必要以数学方式表示将要购买的一组食物中营养素的最大和最小总量。我们将在下面详细介绍每一项。
- 总金额 最低限度 卡路里:
此限制表示每种食物选择的量乘以其各自的卡路里量的总和必须大于或等于 300(最低量)。
calorias
- 总金额 最低限度 碳水化合物:
与前一个类似的想法,但对于碳水化合物营养素。
carboidrato
- 总金额 最低限度 脂肪:
gorduras
- 总金额 最大 蛋白质:
这里唯一的变化是,在这种情况下,我们设置了蛋白质总量的上限。
proteínas
- 数量 最低限度 鱼:
在这种情况下,它不再是一种营养物质,而是直接来自鱼的数量( ** x_5** ) 必须摄取。
peixe
还有一个最终约束,说明问题的决策变量属于哪个数值集。在饮食问题的情况下,变量必须等于或大于零(毕竟,没有负的食物量,对吧?:D)。
最后,用数学方式写出问题中的所有信息,我们可以说我们有一个 优化模型 (决策变量、目标函数和约束)。
modelo de otimização para o problema da dieta.
问题的数学公式是实际解决问题并帮助我们做出最终决定的基本步骤(通常也是最复杂的步骤)。有趣的是,一个 优化模型 可以根据它的一些特点进行分类。例如,在这里进行建模的情况下,它是一个单目标问题(因为只有一个目标函数)和线性问题(因为我们在变量之间只有线性数学运算)。
值得一提的是,优化问题的建模步骤无非是执行一个 现实世界抽象 以便它可以用数学语言表示。由于它是一种抽象,它可以通过多种方式完成,并且密切依赖于建模人员想要采用的策略,这些策略可以使解决方案更简单或更复杂。我想说建模是这个过程的艺术部分哈哈。
最后,我们需要解决我们的优化模型,以便它给我们一个答案。此时,进化 计算 在响应时间和质量方面一直至关重要。解决优化问题涉及使用可以是最多样化类型(精确、迭代、元启发式等)的计算优化算法。在这里,我们将使用已经在 python 中实现的库来准确解决问题。
优化模型的实现与求解
考虑一个精确的解决方案,即保证我们会找到可能的最佳值,并使用 python 语言,我们在数学优化领域拥有几个完善的库(PuLP、pyomo、SciPy 等)以稍微更直观和更高级的方式构建模型。在本文中,我们将介绍如何使用该库 皮莫 .
导入 pandas、pyomo 库并将问题数据整理成一个 数据框 :
将熊猫导入为 pd
从 pyomo.environ 导入 * 营养素= ['卡路里','蛋白质','脂肪','碳水化合物','成本'] pao = [90, 4, 1, 15, 2]
莱特 = [120, 8, 5, 11.7, 3.5]
奶酪 = [106, 7, 9, 0.4, 8]
马铃薯 = [97, 1.3, 0.1, 22.6, 1.5]
鱼 = [130, 8, 7, 0, 11]
酸奶 = [180, 9.2, 1, 17, 1] qtd_nutrient = [300, 10, 8, 10, ''] food_info = pd.DataFrame({'' : 营养素,
“面包”:面包,
“牛奶”:牛奶,
“奶酪”:奶酪,
“土豆”:土豆,
‘鱼’:鱼,
“酸奶”:酸奶,
'REF VALUE': 数量_营养素})
随着问题数据已经实例化,我们实际上可以开始使用 pyomo 库为我们提供的一些资源。基本步骤是创建一个将存储所有模型信息的对象。接下来,可以声明问题集和决策变量。在变量的情况下,定义它们的域也很重要。在饮食问题的情况下,域将是非负实数。
#实例化优化问题
模型 = ConcreteModel('饮食') #创建食物集
model.food = 设置(初始化=infos_food.columns[1:-1]) #创建营养池
model.nutrients = Set(初始化=food_info.iloc[:-1,0]) #声明模型决策变量
model.x = Var(model.food, domain=NonNegativeReals)
然后我们继续构建目标函数和问题的约束。
# 目标函数
def 目标函数(模型):
返回总和(food_info.loc[food_info.shape[0]-1,i]\
*model.x[i] for i in model.food) model.fobj = 目标(规则=objective_function) # 底值限制
def restrictoes_mention(模型,营养):
返回总和(food_info.loc[food_info.iloc[:,0]\
== 营养,i] .iloc [0] * modelo.x [i] \
对于我在 model.food 中)\
>= infos_alimentos.loc[infos_alimentos.iloc[:,0]==nutri,'VALOR REF'].iloc[0] model.restrictions_min = Constraint(['Calories', 'Fat', 'Carbohydrates'], rule=minimum_restrictions) # 有上限的限制
defrrestrictions_maximum(模型,营养):
返回总和(food_info.loc[food_info.iloc[:,0]\
== 营养,i] .iloc [0] * modelo.x [i] \
对于我在 model.food 中)\
<= infos_alimentos.loc[infos_alimentos.iloc[:,0]==nutri,'VALOR REF'].iloc[0] model.constraints_max = Constraint(['Proteins'], rule=constraints_maximums) model.constraint_fish = 约束(规则=model.x['Fish'] >= 0.5)
在这一点上,我们已经完全实现了优化模型,它只需要通过计算来解决它。为此,大多数优化库使用我们所说的 ** 求解器** .一 求解器 是解决数学问题的软件。这里我们选择 求解器 加拿大广播公司。另一个免费选项是 GLPK。而且还有 求解器 Gurobi 和 CPLEX 等广告。
(如果您没有安装 CBC,请重现下面代码的第一行)
#!apt-get install -y -qq coinor-cbc solver = SolverFactory('cbc', executable='/usr/bin/cbc') #seleciona o solver results = solver.solve(model) #用求解器求解模型
当一个 求解器 通知它已经运行完毕,基本上有两个 地位 报告:
- 最佳 :何时找到问题的最优解;
- 不可行 :不可能找到尊重所有约束的决策变量的值。
了解这一点很重要 地位 在将结果用于任何目的之前。
print(f'终止条件:{results.solver.termination_condition}') print('最终总成本:',value(model.fobj)) model.x.pprint()#打印决策变量的最终值
resultados finais.
如上图所示,对于我们建模的饮食问题,最好的决定是购买 1.87 个土豆、0.05 个牛奶、0.45 个奶酪和 0.5 个鱼。此次购买将 巨大的总成本 12.08 并将提供饮食所需的所有营养需求。为简单起见,我们不关心测量单位,这证明了食物部分的合理性。但是,也可以将决策变量限制为正整数的问题进行表述。
实际上,当解决一个 线性优化问题 确切地说,可以肯定的是,根据所使用的数据,没有比报告的更好的答案了。换句话说, 整体很棒 总能找到。
这个演示的想法是通过一个教学示例来展示数学优化的强大功能以及它如何支持复杂的决策制定。 Localiza 在日常决策中越来越多地采用分析方法,而优化是这一旅程的另一个盟友。
使用的一些参考资料:
[
SAS 帮助中心
文档.sas.com
文档.sas.com
](https://documentation.sas.com/doc/en/pgmsascdc/v_030/ormpug/ormpug_lpsolver_examples01.htm)
[
皮莫
Pyomo 的主页,一种可扩展的基于 Python 的开源优化建模语言,用于线性编程……
www.pyomo.org
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明