Dataframe 在数据帧中保存跳转优化结果的紧凑方法

Dataframe 在数据帧中保存跳转优化结果的紧凑方法,dataframe,dictionary,optimization,julia,julia-jump,Dataframe,Dictionary,Optimization,Julia,Julia Jump,我想以一种有效的方式保存我完成的lp优化的所有变量和双变量。我目前的解决方案是可行的,但既不优雅,也不适合具有许多变量和约束的大型优化程序,因为我定义并推送!将每个变量分别放入数据帧中。是否有一种方法可以使用对偶的所有变量()和所有约束()迭代变量?在迭代过程中,我希望将结果推送到带有变量索引名的DataFrames中作为列,并将DataFrame保存在Dict()中。 一个概念性的例子是变量: Result_vars = Dict() for vari in all_variables(Mod

我想以一种有效的方式保存我完成的lp优化的所有变量和双变量。我目前的解决方案是可行的,但既不优雅,也不适合具有许多变量和约束的大型优化程序,因为我定义并推送!将每个变量分别放入数据帧中。是否有一种方法可以使用对偶的所有变量()和所有约束()迭代变量?在迭代过程中,我希望将结果推送到带有变量索引名的DataFrames中作为列,并将DataFrame保存在Dict()中。 一个概念性的例子是变量:

Result_vars = Dict()
for vari in all_variables(Model)
Resul_vars["vari"] = DataFrame(data=[indexval(vari),value(vari)],columns=[index(vari),"Value"]) 
end
跳转和数据帧中声明变量的外观示例:

@variable(Model, p[t=s_time,n=s_n,m=s_m], lower_bound=0,base_name="Expected production")
结果_vars[p]大致如下所示:

t,n,m,Value
1,1,1,50
2,1,1,60 
3,1,1,145

大概你可以这样做:

x = all_variables(model)
DataFrame(
    name = variable_name.(x),
    Value = value.(x),
)
for (F, S) in list_of_constraint_types(model)
    for con in all_constraints(model, F, S)
        @show dual(con)
    end
end
如果您想要一些更复杂的结构,您需要编写自定义代码

T, N, M, primal_solution = [], [], [], []
for t in s_time, n in s_n, m in s_m
    push!(T, t)
    push!(N, n)
    push!(M, m)
    push!(primal_solution, value(p[t, n, m]))
end
DataFrame(t = T, n = N, m = M, Value = primal_solution)
有关约束,请参见此处:。你想要的是:

x = all_variables(model)
DataFrame(
    name = variable_name.(x),
    Value = value.(x),
)
for (F, S) in list_of_constraint_types(model)
    for con in all_constraints(model, F, S)
        @show dual(con)
    end
end

多亏了奥斯卡,我建立了一个解决方案,可以帮助自动提取结果。 解决方案是围绕使用变量定义中的
base\u name
命名约定构建。可以将变量定义复制粘贴到
base\u name
中,后跟
。例如:

@variable(Model, p[t=s_time,n=s_n,m=s_m], lower_bound=0,base_name="p[t=s_time,n=s_n,m=s_m]:")
可以更改命名约定和语法,例如添加注释,也可以不定义
基本名称
。以下函数将
base\u name
划分为变量名、集合(如果需要)和索引:

function var_info(vars::VariableRef)
    split_conv = [":","]","[",","]
    x_str = name(vars)
    if occursin(":",x_str)
        x_str = replace(x_str, " " => "") #Deletes all spaces
        x_name,x_index = split(x_str,split_conv[1]) #splits raw variable name+ sets and index
        x_name = replace(x_name, split_conv[2] => "")
        x_name,s_set = split(x_name,split_conv[3])#splits raw variable name and sets
        x_set = split(s_set,split_conv[4])

        x_index = replace(x_index, split_conv[2] => "")
        x_index = replace(x_index, split_conv[3] => "")
        x_index = split(x_index,split_conv[4])
        return (x_name,x_set,x_index)
    else
        println("Var base_name not properly defined. Special Syntax required in form     var[s=set]:  ")
    end
    
end
接下来的函数为原始解决方案(“值”)创建列和索引值加上列

最后,最后一个函数创建Dict,该Dict以前面提到的样式保存数据帧中变量的所有结果:

function create_var_dict(model)
    Variable_dict=Dict(vars[1]
            =>DataFrame(Dict(vars[2][1][cols] 
                =>create_sol_matrix(vars,model)[cols,:] for cols in 1:size(vars[2][1])[1]))
                    for vars in unique([[String(var_info(x)[1]),[create_columns(x)]] for x in all_variables(model)]))
    return Variable_dict
end
将这些函数添加到脚本中后,只需调用
create\u var\u dict()
,即可检索优化后变量的所有解:

请注意:它们是嵌套函数。更改命名约定时,可能还需要更新其他函数。如果添加更多注释,则必须避免使用
[
]
。 这个解决方案显然远远不是最优的。我相信有一个更有效的解决方案可以回到MOI