在多个集合中定义时,如何在AMPL中初始化参数?

时间:2019-06-20 16:55:48

标签: optimization ampl

假设我有

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 ; 

1 个答案:

答案 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;