python - 如何在包含指数的集成正态分布中迭代 Gurobi 决策变量
问题描述
我的问题:迭代 Gurobi“Var”决策变量会创建TypeError: '<' not supported between 'Var' and 'int' and issue with exponentation (ie **/ pow())
Gurobi 优化的关键信息:
- 目标函数:对三个项目求和最大化(价格*期望值)
- 期望值通过两个定义的公式计算:
- 1) PDF = 概率密度函数
- 2) EV = 期望值,它是 PDF 在特定积分上的积分
- 决策变量“upperBound”应该最大化这个积分的上界,下界是0
模型下方:
from gurobipy import *
import pandas as pd, numpy as np, scipy.integrate as integrate
import math
mu = pd.DataFrame(np.array([10, 15]), index = ["product1", "product2"])
sigma = pd.DataFrame(np.array([1, 1.5]), index = mu.index.values)
price = pd.Series(np.array([10, 10]), index = mu.index.values)
m = Model("maxUpperBound")
ub = m.addVars(mu.index.values, vtype=GRB.INTEGER, name="upperBound")
def PDF (y, mu, sigma):
return y * (1.0 / (sigma * (2.0 * math.pi)**(1/2)) * math.exp(-1.0 * (y - mu)**2 / (2.0 * (sigma**2))))
def EV(ub, mu, sigma):
lb = 0
value, error = integrate.quad(PDF, lb, ub, args=(mu, sigma))
return value
m.setObjective(
quicksum(
price.loc[i] * EV(ub[i], mu.loc[i], sigma.loc[i])
for i in mu.index.values
),
GRB.MAXIMIZE)
m.addConstr(
(quicksum(ub[i]
for i in mu.index.values)
<= 100),
"Limit100"
)
m.optimize()
for v in m.getVars():
print(v.varName, v.x)
解决方案
Gurobi 无法针对 PDF 函数进行优化,因为这不是由线性、(凸或非凸)二次或二阶约束/目标组成的混合整数问题。
而是通过预先计算每个 product_ub 组合的期望值来解决这个问题。ub 可以取 0 到 100 之间的值(见约束)。此后在目标函数中使用期望值。
推荐阅读
- javascript - 如何找到所有可见元素中最重要的元素?(离用户最近)
- python - 优化解决回文的时间/空间复杂度
- android - Android Espresso:如何在 TextInputLayout 中嵌入的 editText 中键入文本
- git - Git rebase 不在合并基础上应用提交
- c - 在函数调用中获取 Malloc() 损坏的顶部大小
- python - 使用python将文本数据解析为JSON格式
- python - 最新版本的 Django 教程说明似乎错误
- bootstrap-4 - 使用 Bootstrap 4 构建带有导航栏和侧边栏的页面的基本问题
- wpf - 如何将数据绑定错误发送到 Visual Studio 的输出窗口?
- python - 通过 Streamlit 向 PostgreSQL 表中插入数据