我目前正在研究一个优化问题,我想通过使用回调函数将每次 IPOPT 迭代的一些信息添加到文件中。我能够收集我需要的信息,但是当我尝试将它添加到文件时,它只会添加一些奇怪的迭代。这就是我正在做的(简化)
我有一个外部迭代循环 (k) 和一个内部(IPOPT 迭代)
thefile = "output.txt". # Create a new file
f = open(thefile, "w"). # The header to my new file
@printf(f,"%-10s %-10s %-10s\n ", "outer", "inner", "objval" )
k = 0
while k <= 100
iter = []
objValVector = []
function my_callback( alg_mod::Cint,
iter_count::Cint,
obj_value::Float64,
inf_pr::Float64,
inf_du::Float64,
mu::Float64,
d_norm::Float64,
regularization_size::Float64,
alpha_du::Float64,
alpha_pr::Float64,
ls_trials::Cint) # Using the call back function to get the obj.val
append!(objValvector, obj_value)
append!(iter, iter_count)
return true
end
MOI.set(model, Ipopt.CallbackFunction(), my_callback)
optimize!(model);
f = open(thefile, "a"); # Open the file in append "mode" to add to the existing file
for i in 1:length(iter)
@printf(f, "%-10s %-10s %-10s\n",
k, iter[i], objValvector[i])
end
Do something...
k += 1;
end
你打开同一个文件两次(这不应该发生)。 而且您没有
flush
缓冲区。
因此,您会看到对磁盘产生的影响和对磁盘产生的影响的混合。
close(f)
在第四行和代码末尾。或者只打开一次。根据您的其他代码和场景,您可能也想要flush(f)
。