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