假设我有
param m; #number of modes
param n; #number of individual
param a; #number of alternatives
param f; #number of household
set M, default{1..m}; #set of modes
set N, default{1..n}; #set of individuals
set A, default{1..a}; #set of alternatives
set F, default{1..f}; #set of family
set E, within F cross N
如何初始化参数X {E,M,A}?
假设
a:=2 , m:=3 , n:= 4 f:=2;
定义集合E:
set E:= 1 1 1 2 2 3 2 4 ;
答案 0 :(得分:1)
您可以按照建议的方式声明参数:
param X{E,M,A};
现在,如果您想提供一个默认值(我想这是您要的值),则可以按照通常的方式进行操作:
param X{E,M,A} default 0;
然后在.dat
文件中提供一些非默认值,例如:
param: X :=
1 1 1 2 5
2 3 2 1 6;
请注意,除非您调用solve
,否则AMPL不会将默认值填充到参数中。从AMPL book,第p。 120:
仅当首先需要使用参数值时(例如,使用
solve
命令处理使用该参数的目标或约束时,才对提供该参数默认值的表达式求值。)
因此,如果您在发出display X;
和model
命令之后但在发出data
命令之前键入solve
,则只会得到非{默认值,例如:
X :=
1 1 1 2 5
2 3 2 1 6
;
但是,如果您在致电display X;
后使用solve
,则会获得完整列表:
X [1,*,*,1] (tr)
: 1 2 :=
1 0 0
2 0 0
3 0 0
[1,*,*,2] (tr)
: 1 2 :=
1 5 0
2 0 0
3 0 0
[2,*,*,1] (tr)
: 3 4 :=
1 0 0
2 6 0
3 0 0
[2,*,*,2] (tr)
: 3 4 :=
1 0 0
2 0 0
3 0 0
;
为完整起见,以下是我用于此答案的.mod
和.dat
文件:
.mod:
param m; #number of modes
param n; #number of individual
param a; #number of alternatives
param f; #number of household
set M, default{1..m}; #set of modes
set N, default{1..n}; #set of individuals
set A, default{1..a}; #set of alternatives
set F, default{1..f}; #set of family
set E, within F cross N;
param X{E,M,A} default 0;
var myVar{E,M,A} >= 0;
minimize Obj: sum {(i,j) in E, mm in M, aa in A} X[i,j,mm,aa] * myVar[i,j,mm,aa];
.dat:
param a:=2;
param m:=3;
param n:= 4;
param f:=2;
set E:= 1 1 1 2 2 3 2 4 ;
param: X :=
1 1 1 2 5
2 3 2 1 6;