繁体   English   中英

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

[英]How to get the value of the decision variables in Gekko-python

我正在使用 Gekko 来解决工作分配的优化模型,因此决策变量之一 (Xijt)(i=workers, j=jobs, t=time period) 是二元的是否选择了工作人员(x=1 ) 与否 (x=0)。 我得到了解决方案(目标函数的值)。 但是,对于使用时的变量值 - Print(str (x)) - 我得到了 x 的所有值,如附图所示,但我只想得到 xijt = 1 的选定工作人员。 第二个变量(Yijt)的相同问题继续数表示工人 i 在时间 t 执行工作 j 的小时数。 使用时 - Print(str (Y)) - 我得到了 Y 的所有值,但我想只为 xijt =1 的选定工作人员获取 Y 值。 请有关于解决这个问题的任何想法。 单击此处获取output 屏幕截图代码

    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, j, t))
y = {}

for i in I:
    for j in J:
        for t in T:
            y[i, j, t] = model.Var(integer=False, name="y %s %s %s" % (i, j, t))

# model.update()

for l in L:
    for i in I:
        for j in J:
            for t in T:
                model.Equation(x[i, j, t] * (q[i][l] - s[j][l]) >= 0)

for j in J:
    for i in I:
        for t in T:

            model.Equation(x[i, j, t] * (lc[j][t] * y[i, j, t] *  (sum(q[i][l] / s[j][l] for l in L) / len(L))) <= uc[j][t])
            model.Equation(x[i, j, t] * (lz[j][t] * y[i, j, 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, j, t] for i in I) == 1)

for i in I:
    for t in T:
        model.Equation(sum(x[i, j, t] for j in J) == 1)

for i in I:
    for t in T:
        model.Equation(sum(y[i, j, t] for j in J) <= 8)

objt = sum(sum(sum((x[i, j, t] * v[j] * lc[j][t]  * y[i, j, t] * (sum(q[i][l] / s[j][l] for l in L) / len(L))) - (
        x[i, j, t] * lz[j][t] * y[i, j, 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))

使用x变量的.value[0]属性。 如果x大于阈值,例如0.9 ,则有条件地检索y值:

for i in I:
    for j in J:
        for t in T:
            if x[i, j, t].value[0]>=0.9:
                print(y[i, j, t])

使用 Gekko m.sum()与 Python sum() function 相比,有更好的解决方案性能。 这不应该改变结果,但它可能会快得多。

如果您想以这种方式定义变量,也可以使用数组 function:

x = m.Array(m.Var,(I,J,T),integer=True,lb=0,ub=1.00001)
y = m.Array(m.Var,(I,J,T),integer=False)

它没有命名变量,但这在 Gekko 中不是必需的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM