#ampl
#ampl
Вопрос:
У меня есть этот файл данных:
param: name car pro fat vit cal :=
1 'Fiddleheads' 3 1 0 3 80
2 'Fireweed Shoots' 3 0 0 4 150
3 'Prickly Pear Fruit' 2 1 1 3 190
;
и эта модель:
set I;
set J;
param name{I} symbolic;
param car{I} integer >= 0;
param pro{I} integer >= 0;
param fat{I} integer >= 0;
param vit{I} integer >= 0;
param cal{I} integer >= 0;
param nut{i in I, J} = (car[i], pro[i], fat[i], vit[i]);
Последняя строка недопустима:
mod, line 10 (offset 176):
syntax error
context: param nut{i in I, J} = >>> (car[i], <<< pro[i], fat[i], vit[i]);
но я не знаю, как получить эквивалентную работу. По сути, я хочу сформировать массив {3,4} на основе литерального выражения. Я перепробовал несколько разных синтаксисов как в файле данных, так и в файле модели и не смог добиться ни одного рабочего.
Ответ №1:
Модель:
set names;
set components;
param nut{names,components} default 0;
Данные:
set names :=
Fiddleheads
'Fireweed Shoots'
'Prickly Pear Fruit';
set components := car pro fat vit cal
;
param nut :=
[Fiddleheads,*]
car 3 pro 1 vit 3 cal 80
['Fireweed Shoots',*]
car 3 vit 4 cal 150
['Prickly Pear Fruit',*]
car 2 pro 1 fat 1 vit 3 cal 190
;
Варианты см. в главе 9 книги AMPL.
Опция «по умолчанию 0» позволяет избежать необходимости явно указывать нулевые значения, что может быть полезно для разреженных наборов данных.
Было бы полезно иметь формат ввода AMPL, который позволяет указывать двумерный параметр в простом макете таблицы с заголовками строк и столбцов, в соответствии с вашим шагом обработки данных, но я не знаю ни одного, который делает это.