Инициализировать двумерный массив из литералов

#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, который позволяет указывать двумерный параметр в простом макете таблицы с заголовками строк и столбцов, в соответствии с вашим шагом обработки данных, но я не знаю ни одного, который делает это.