Доступ к значению параметра по его имени
Чтобы получить доступ к значению параметра по его имени, нужно заменить отдельные определения параметров одним параметром, индексированным по набору имен. Например, можно заменить:
param cost; param profit; param limit;
на
set paramNames = {"cost","profit","limit"};
и объявить значение всех параметров в рамках одного параметра индексированного по наименованию простых параметров.
param paramVal{paramNames};
После этого, можно записать:
let paramVal["cost"]:= 1; и т.д. для param Val["profit"] и param Val ["limit"]
Сортировка значений параметров Reals
Следующий пример позволяет выполнить сортировку по возрастанию введенных значений параметра:
param A{1..10} >= 0; data; param A:= 1 8.33333 2 0.314286 3 1.75 4 8.33333 5 1.8 6 0.352941 7 0.565217 8 3.57143 9 2.75 10 0.47619; model; set S ordered by Reals; let S:= setof{i in 1..10}A[i] + Uniform(-1e-15,1e-15); # Прибавление малого Uniform позволяет обработать одинаковые значения. let {i in 1..10} A[i]:= round(member(i,S),14); # round (…,14) отсекает ранее прибавленное значение -1e-15,1e-15. display A;
Сортировка значений параметров Integer
reset; param a{1..4}; data; param a:= 1 10 2 15 3 24 4 12 ; model; set S ordered by Integers; let S := setof {i in 1..4} a[i]; let {i in 1..4} a[i] := member(i,S);
Генерация двоичной матрицы на основании случайных данных
Код генерирует случайную матрицу A = {X, Y}, которая имеет двоичные данные (0 и 1). Алгоритм заполнения данных следующий: не должно быть двух последовательных строк в одном столбце, имеющих значение 1. Первая строка диапазона каждого столбца зависит от номера столбца и вычисляется по формуле №Столбца*2-1 (столбец 1: строки 1 и 2, Столбец2: строки 3 и 4, Столбец3: строки 5 и 6 и т. д.).
param n = 5; param A {1..2*n+1,1..n} default 0; for {j in 1..n} { if Uniform01() < 0.5 then let A[2*j-1,j] := 1; else let A[2*j,j] := 1;} display {i in 1..2*n,j in 1..n} A[i,j]; #You can see the result by using the command