Julia-在@variable和@constraint表达式中按名称访问Dict值

问题描述

我想知道是否可以通过这样的表达式来按名称访问Dict值:

@objective(
    premex,Min,sum((u["cap"] - PROdamOUNT[op,u,t]) * u["util_cost1"]
        for op in _ORDER_PRODUCTS,u in UNITS,t in TIME))

_ORDER_PRODUCTS:

Dict{String,Dict{String,Any}}("o18-p25" => Dict("order" => "o18","value" => 3000.0f0,"product" => "p25"),"o18-p36" => Dict("order" => "o18","value" => 63.0f0,"product" => "p36"),"o23-p39" => Dict("order" => "o23","value" => 204.75f0,"product" => "p39"),"o16-p32" => Dict("order" => "o16","value" => 336.0f0,"product" => "p32"),"o22-p37" => Dict("order" => "o22","value" => 50.0f0,"product" => "p37"),"o1-p5" => Dict("order" => "o1","value" => 60.0f0,"product" => "p5"),"o11-p28" => Dict("order" => "o11","value" =....

单位:

UNITS = Dict(["CINTAS" => Dict(["cap" => 1000,"mincap" => 50,"dcap" => 24830,"util_cost1" => 1000,"maxprodr" => 24830]),"BUHLER1" => Dict(["cap" => 1500,"mincap" => 60,"dcap" => 37245,"maxprodr" => 37245]),...

运行此命令时出现错误

错误:LoadError:MethodError:没有与getindex(:: Pair {String,Dict {String,Integer}},:: String)匹配的方法

当我将u [“ cap”]替换为数字时,它会起作用。

解决方法

亲自找到答案(...):

    @variable(premex,PRODAMOUNT[op in keys(_ORDER_PRODUCTS),u in keys(UNITS),t in TIME])

    @objective(
        premex,Min,sum((u["cap"] - PRODAMOUNT[key1,key2,t]) * u["util_cost1"]
            for (key1,op) in _ORDER_PRODUCTS,(key2,u) in UNITS,t in TIME
                ))

有3个因素需要照顾:

  1. 无法用字典对象索引变量,因此它必须是Int或String
  2. 这是遍历Dict的方法:_ORDER_PRODUCTS中的(key1,op)
  3. 这是仅获取用于索引变量的键的方法:键中的op(_ORDER_PRODUCTS)