Инициализировать двумерный массив из литералов - PullRequest
0 голосов
/ 25 марта 2019

У меня есть этот файл данных:

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 Ответ

1 голос
/ 27 марта 2019

Модель:

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

...