在 MathProg 中查找 table 字符串(即 strings/symbols 的字典)?

Lookup table for strings (i.e., dictionary of strings/symbols) in MathProg?

MathProg 中有没有办法让字符串与整数相关联,我可以用它来输出答案的标签?

例如,以下代码不起作用,但希望传达我正在尝试做的事情:

# attempt via set results in error, "mylabels cannot be subscripted":
set mylabels := "label1" "label2" "label3";
printf "first label: %s\n", mylabels[1];

# attempt via param results in error, "mylabels requires numeric data":
param mylabels := 
  1 "label1"
  2 "label2"
  3 "label3";
printf "first label: %s\n", mylabels[1];

我还找到了一个 discussion on the lack of ordered sets in MathProg,建议的 hack 听起来可能对我有帮助,但没有用:

# attempt via ordered-set hack results in error, "no value for mylabels_ref[1]":
set mylabels := "label1" "label2" "label3";
param mylabels_ref{i in 1..card(mylabels)}, symbolic, in mylabels;
printf "first label: %s\n", mylabels_ref[1];

这显然不是什么大问题,因为我可以在 MathProg 之外进行查找(即手动或使用其他一些脚本语言);但我主要只是好奇语法是否支持我想要做的事情。

迟到的答案,但这可能会对想要类似查询的人有所帮助。

真正有效的(无需过多修改)是您的两种方法的混合。您将需要一个包含标签的集合(因为参数只能包含数值),并且您还需要一个用于查找的参数。

set mylabels;
param mylabels2{i in mylabels};

for {i in mylabels}{
    for{{0}: mylabels2[i] = 1}
        printf "\n first label: %s\n\n", i;
}

data;
set mylabels := label1 label2 label3;
param mylabels2 := 
  label1 1
  label2 2 
  label3 3;
end;

在第一个 for 循环中,我们简单地遍历所有标签。第二个 for 循环是进行查找的条件。只有当标签索引的参数等于给定值时才执行打印语句。