В целом подход к хранению данных следует формировать на следующих принципах:
Если матрица данных представляет собой плотную матрицу (имеются данные для каждого k,i,j), тогда данные следует представлять с помощью двух/трех/n-мерной структуры.
param K; param I {1..K}; param J {1..K}; param array {k in 1..K, i in 1..I[k], j in 1..J[k]};
Однако, запись param t {k in 1..K, i in 1..I [k], j in 1..J [k]};
имеет смысл только в том случае, если матрица будет заполнена полностью от I[k] до J[k]. Если объявить param array…, а затем присвоить для него только несколько значений, тогда AMPL выделит место в памяти только для значений, которые были объявлены. Однако, позже при обращении к значениям параметра array мы получим сообщение об ошибке, если отсутствуют данные для всех значений param array….
Указанное сообщение не появится, при использовании разряженного способа объявления данных. Кроме этого, данный способ объявления данных позволяет минимизировать объем используемой (при хранении и обработке) памяти. Для этого необходимо использовать выражение within:
param K; param I {1..K}; param J {1..K}; set KIJ within {k in 1..K, i in 1..I[k], j in 1..J[k]}; param t {KIJ};
или
set IJ {k in 1..K} within {i in 1..I[k], j in 1..J[k]}; param array {k in 1..K, (i,j) in IJ[k]};
KIJ - это набор троек, который содержит элементы (k,i,j) для каждой позиции (i,j) в матрице k, для которых заданы данные.
IJ[k] - это набор пар, который содержит элемент (i,j) для каждой позиции в матрице k, для которых заданы данные.
В указанных случаях, память не выделяется до тех пор, пока не будут объявлены конкретные значения для array.
Далее можно сбросить любой из наборов IJ[k] до пустого набора. Пустой набор не заставляет AMPL возвращать память операционной системе. Однако это освобождает некоторое пространство в AMPL, которое далее может быть использовано для хранения новых элементов наборов и новых значений параметра array.
let IJ[2] := {};
Однако, если набор уже связан с некоторыми данными, тогда AMPL выдаст предупреждение:
display array; Error executing "display" command: error processing param array: invalid subscript t[2,6,4] discarded.