我正在尝试向JuMP 0.2.0(古罗比作为求解器)模型添加约束,该模型读取original paper(第12页),如下所示:
c_t = argmax(N_kt)for in 1 ... K
此约束旨在读取逐列的矩阵,找到该列中具有最大值的单元格的 index ,并将该索引分配给单元格c_t。
尽管Julia在Base程序包中具有argmax
函数,但是该函数在JuMP中不起作用。尝试执行
for t in 1:T
@constraint(model, c_t == argmax(N_Kt[:,t])
end
抛出错误DenseAxisArray does not support this operation.
,将N_Kt
更改为非密集的JuMP数组可消除该错误,但抛出错误MethodError: no method matching isless(::VariableRef, ::VariableRef)
。
在JuMP中,argmax
是否具有等效功能,而我设法错过了这一功能,或者可以选择一种巧妙的方法来重新构造此约束?我很喜欢列表推导,即
for t in t_l
for i in 1:num_features
@constraint(model, [i for k in 1:6 if N_kt[i,t] >= N_kt[k,t]] == c_t[t])
end
end
但是朱莉娅在尝试这种表达时会引发各种错误。最终的方法“将c_t设置为等于其对应值大于或等于该范围内所有其他值的索引”似乎很有希望,但是同样,即使上面的代码段也会产生错误。是否有更好的方法将条件语句添加到我缺少的约束声明中?
感谢您在这里可以提供的任何帮助!