如何解决如何在 Gekko-python 中获取决策变量的值
我正在使用 Gekko 来解决工作分配的优化模型,因此决策变量 (Xijt)(i=workers,j=jobs,t=time period) 之一是二元的,无论工人是否被选为工作( x=1) 或不 (x=0)。我得到了解决方案(目标函数的值)。但是,对于使用时的变量值 - Print(str (x)) - 我得到了 x 的所有值,如附图所示,但我只想得到 xijt =1 的选定工人。 第二个变量 (Yijt) 的相同问题继续 number 表示工人 i 在时间 t 执行作业 j 的小时数。使用时 - Print(str (Y)) - 我获得了 Y 的所有值,但我只想获得 xijt =1 的选定工人的 Y 值。关于解决这个问题的任何想法。 单击此处获取 output screenshot 并为 code
model = GEKKO()
model.options.soLVER = 1
x = {}
for i in I:
for j in J:
for t in T:
x[i,j,t] = model.Var(lb=0.00,ub=1.00001,integer=True,name="x %s %s %s" % (i,t))
y = {}
for i in I:
for j in J:
for t in T:
y[i,t] = model.Var(integer=False,name="y %s %s %s" % (i,t))
# model.update()
for l in L:
for i in I:
for j in J:
for t in T:
model.Equation(x[i,t] * (q[i][l] - s[j][l]) >= 0)
for j in J:
for i in I:
for t in T:
model.Equation(x[i,t] * (lc[j][t] * y[i,t] * (sum(q[i][l] / s[j][l] for l in L) / len(L))) <= uc[j][t])
model.Equation(x[i,t] * (lz[j][t] * y[i,t] * (sum(q[i][l] / s[j][l] for l in L) / len(L))) <= uz[j][t])
for j in J:
for t in T:
model.Equation(sum(x[i,t] for i in I) == 1)
for i in I:
for t in T:
model.Equation(sum(x[i,t] for j in J) == 1)
for i in I:
for t in T:
model.Equation(sum(y[i,t] for j in J) <= 8)
objt = sum(sum(sum((x[i,t] * v[j] * lc[j][t] * y[i,t] * (sum(q[i][l] / s[j][l] for l in L) / len(L))) - (
x[i,t] * lz[j][t] * y[i,t] * (sum(q[i][l] / s[j][l] for l in L) / len(L))) for j in J) for i in I) for t in
T)
model.Obj(-objt)
model.solve(disp=True,debug=False)
print(str (x))
print(str (y))
解决方法
使用 .value[0]
变量的 x
属性。如果 y
大于阈值(例如 x
),则有条件地检索 0.9
值:
for i in I:
for j in J:
for t in T:
if x[i,j,t].value[0]>=0.9:
print(y[i,t])
与 Python m.sum()
函数相比,使用 Gekko sum()
有更好的解决方案性能。这不应该改变结果,但可能会更快。
如果您想以这种方式定义变量,也可以使用数组函数:
x = m.Array(m.Var,(I,J,T),integer=True,lb=0,ub=1.00001)
y = m.Array(m.Var,integer=False)
它不命名变量,但这在 Gekko 中不是必需的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。