В случае, когда заданы значения для разряженного параметра:
param: NODE: thing:= 1 10 2 11 5 12;
и требуется на его основании создать параметр со сквозной индексацией, где для пропущенных строк значение = 0, тогда необходимо записать:
param: NODE: newthing:= 1 10 2 11 3 0 4 0 5 12;
Это можно сделать программно следующим способом:
param maxNODE = max {i in NODE} i; param newthing {i in 1..maxNODE} = if i in NODE then thing[i] else 0;
Также для решения данной задачи можно использовать значения default:
param N integer > 0; param thing{1..N} default 0; data; param N:= 5 ; param thing:= 1 10 2 11 5 12 ;
Нужно помнить, что в случае использования default команда «display» не будет отображать значения по умолчанию, пока не будет решена модель или совершено другое действие, которое приведет к использованию этих значений.
Преобразование разреженных матриц
Следующий пример позволяет: 1) заменить разреженные матрицы (для которых в строке или в столбце располагается 1 значение) на значения параметра. 2) Связать 2 матрицы по строка/столбец на основании их значений:
reset; param M = 8; param N = 6; param excelTable {0..M,1..N}; param varTable {0..N,1..N}; data;
param excelTable: 0 1 2 3 4 5 6 :=
0 0 0 0 0 0 0 1 1 0 0 0 0 0 2 -1 0 0 0 0 0 3 0 1 0 0 0 0 4 0 -1 0 0 0 0 5 0 0 1 0 0 0 6 0 0 0 1 0 0 7 0 0 0 0 1 0 8 0 0 0 0 0 1 ; |
param varTable: 0 1 2 3 4 5 6 :=
0 0 0 1 0 0 0 1 0 0 1 1 0 0 2 0 1 1 1 0 0 3 1 1 1 1 0 0 4 1 1 1 1 1 0 5 1 -1 1 1 1 0 6 1 -1 1 1 1 1 ; |
model; param firstExcel{j in 1..N} = min{i in 0..M: excelTable[i,j] != 0} i; param firstVar{j in 1..N} = min {i in 0..N: varTable[i,j] != 0} i; param FS {0..N}; let {j in 1..N} FS[firstVar[j]] := firstExcel[j]; display firstExcel, firstVar, FS;