如何在包含幂运算的集成正态分布中迭代Gurobi决策变量

我的问题:遍历Gurobi“ Var”决策变量会创建 TypeError:“ Var”和“ int”的实例之间不支持“ 和指数的问题(即** / 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,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)
qianyining19900907 回答:如何在包含幂运算的集成正态分布中迭代Gurobi决策变量

您的代码有点难以阅读,但以下几行可能会导致错误:

ub = m.addVars(mu.index.values,vtype=GRB.INTEGER,name="upperBound")
...
for ub in ub[i]:

ub是一个元组,ub[i]将引用一个Var对象。您不能迭代单个Var。

我猜你想写这样的东西:

for ub_i in ub:

编辑

问题已在Gurobi forum中解决:

tldr:目标函数太复杂了,Gurobi无法以这种形式处理它。

,

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

相反,通过计算每个product_ub组合的预期值来解决此问题。 ub可以采用0到100之间的值(请参见约束)。此后在目标函数中使用期望值。

本文链接:https://www.f2er.com/2776988.html

大家都在问