Как я могу инициализировать параметр в AMPL, когда он определен на нескольких наборах? - PullRequest
0 голосов
/ 20 июня 2019

Предположим, у меня есть

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 Ответ

1 голос
/ 21 июня 2019

Вы можете объявить параметр так, как вы предлагали:

param X{E,M,A};

Теперь, если вы хотите указать значение по умолчанию (которое, как я полагаю, то, что вы спрашиваете), вы можете сделать это обычным способом.way:

param X{E,M,A} default 0;

Затем укажите некоторые нестандартные значения в файле .dat, например:

param: X :=
    1 1 1 2   5
    2 3 2 1   6;

Обратите внимание, что AMPL не заполняет значения по умолчанию в параметрепока вы не позвоните solve.Из книги AMPL , стр.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;
...