首页 > 解决方案 > 如何在包含指数的集成正态分布中迭代 Gurobi 决策变量

问题描述

我的问题:迭代 Gurobi“Var”决策变量会创建TypeError: '<' not supported between 'Var' and 'int' and issue with exponentation (ie **/ pow())

Gurobi 优化的关键信息:

模型下方:

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)

标签: pythonvargurobinumerical-integration

解决方案


Gurobi 无法针对 PDF 函数进行优化,因为这不是由线性、(凸或非凸)二次或二阶约束/目标组成的混合整数问题。

而是通过预先计算每个 product_ub 组合的期望值来解决这个问题。ub 可以取 0 到 100 之间的值(见约束)。此后在目标函数中使用期望值。


推荐阅读