微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Gekko-python 中获取决策变量的值

如何解决如何在 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 举报,一经查实,本站将立刻删除。