优化指数函数的积分
正在进行的亲爱的社区,
我试图进入Gurobi模型这一问题,但到目前为止,我没有得到一个合适的结果。我试图遵循这篇文章(https://support.gurobi.com/hc/en-us/community/posts/360077178491-Build-an-objective-function-with-Log-and-Exponential-inside-?input_string=Optimizing%20integral%20of%20exponential%20function)插入e函数。有什么方法实际模型在Gurobi还是Gurobi不适合呢?
最好的,
依琳娜
-
嗨,依琳娜,
如果你可以计算一个封闭形式\ \ int_ {0} ^ {t_i} r_i \ cdot e ^{- \伽马\ cdot x} dx \) \(\),那么你应该能够使用Gurobi为您的模型。
如果你\ (r_i \)是一个常量,你可以计算每\(我\),那么它应该认为
\[开始\{对齐*}
\ int_ {0} ^ {t_i} r_i \ cdot e ^{- \伽马\ cdot x} dx = \压裂{r_i-r_i \ cdot e ^{- \伽马t_i}} {r_i}
结束\{对齐*}\]
当然,上述的形式强烈取决于是否\(θ\γ,\μ,\ \)只是常量值或优化变量。然而,如果你能计算一个封闭的形式,可以使用addGenConstrExp指数函数方法模型。如果你不能计算一个封闭形式的积分每\(我),我认为最好是尝试一种不同的方法或不同的解算器可以处理集成。手机万博登录你应该能够找到一些领域的“动态优化”。
最好的问候,
Jaromił0 -
你好Jaromil,
非常感谢你的快速回复!
我试图模型这一问题,但目前最佳的结果是0,这不能是最优的。我做了什么错误呢?γ,μ是常数,但Θ和t我想优化。
从gurobipy导入模型、伽马线暴quicksum
c = 1
k = 2
一个= 0.005
b = 1/600
T = 8 * 60
e = 5
num_work = k + 1
num_bre = k
m =模型(“优化”)
m.params。非凸= 2
t = m。addVars (num_work磅= 0,乌兰巴托= T name = "工作")
u = m。addVars (num_bre磅= 0,乌兰巴托= T name = "打破")
r = m。addVars (num_work磅= 0,乌兰巴托= c, name =“工作效率”)
l = m。addVars (num_work name = "指数")
y = m。addVars (num_work name = " e-Funktion ")
w = m。addVars (num_bre name = " exponent2 ")
p = m。addVars (num_bre name = " e-Funktion2 ")
q = m。addVars (num_work name =“目标函数”)
z = m。addVars (num_bre、名称=“工作rate2”)
#为疲劳e-function约束
m.addConstr ((- b) * t [0] = = l [0])
m.addGenConstrExp (l [0], y [0])
m.addConstr ((- b) * t [1] = = l [1])
m.addGenConstrExp (l [1], y [1])
m.addConstr ((- b) * t [2] = = l [2])
m.addGenConstrExp (l [2], y [2])
对恢复e-function #约束
m.addConstr ((——) * u [0] = = w [0])
m.addGenConstrExp (w [0], p [0])
m.addConstr ((——) * u [1] = = w [1])
m.addGenConstrExp (w[1],[1]页)
# r约束
m。addConstr (1 = = r [0])
m。addConstr (r [0] * [0] = = y z [0])
m.addConstr ((c + (z [0] - c) * p [0]) = = r [1])
m。addConstr (r [1] * [1] = = y z [1])
m.addConstr (c + (z [1] - c) * p [1] = = r [2])
m。addConstr (quicksum (t[我]我的范围(num_work)) + quicksum (u(我)我的范围(num_bre))) < = t)
#目标函数
m。addConstr ((quicksum (((r[我]——[我]* y[我])/ b)我的范围(num_work)) = = quicksum (q[我]我的范围(num_work))))
m。setObjective (quicksum (q[我]我的范围(num_work)), GRB.MAXIMIZE)
m.optimize ()0 -
你的指数可以达到负值。然而,Gurobi默认值为变量下界\ (0 \)。
允许负下界为指数似乎奏效。
l = m。addVars (num_work磅=伽马线暴。无穷,name = "指数")
w = m。addVars (num_bre磅=伽马线暴。无穷,name = " exponent2 ")最好的问候,
Jaromił0 -
非常感谢!这个帮助很大!
0 -
我又一次面临着一个问题. .我现在试图用零件制定数字更一般的表情,但是它不工作。有另一种方法用指数函数在Gurobi吗?
m.addConstr ((- b) * t [0)= = l (0])
m.addGenConstrExp (l [0),y (0])
m.addConstr ((- b) * t [1)= = l (1])
m.addGenConstrExp (l [1),y (1])
m.addConstr ((- b) * t [2)= = l (2])
m.addGenConstrExp (l [2),y (2])
成
m.addConstr (((- b) * t[我]我的范围(num_work)) = = (l[我]我的范围(num_work)))
m。addGenConstrExp (l[我]我的范围(num_work)), (y[我]我的范围(num_work)))0
请登录留下你的评论。
评论
5个评论