AMPL: Синтаксис для наборов?

Я занимаюсь языком высокого уровня для смешанных целочисленных линейных программ (MILP). Этот язык является языком моделирования для математического языка программирования (AMPL). .

Глава 4, стр. 65, на рис. 4-7 показан следующий синтаксис:

set PROD := bands coils plate ;

Однако в главе 5 на стр. 74 показан следующий синтаксис:

set PROD = {"bands", "coils", "plate"};

Кто-нибудь может объяснить эту разницу в синтаксисе?

Я помещаю последний в файл *.dat, и AMPL жалуется expected ; ( : or symbol, где {. Интересно, это просто ошибка в мануале?

Спасибо.


person user36800    schedule 10.06.2019    source источник


Ответы (1)


Синтаксис в главе 4 --

set PROD := bands coils plate;

-- используется в файлах данных, а синтаксис в главе 5 --

set PROD = {"bands", "coils", "plate"};

-- используется в файлах моделей. Немного странно (IMO), что синтаксис наборов отличается в файлах модели и данных, но это так. Другой пример этого различия см. в этом вопросе и ответе.

Полный рабочий пример кода, измененный из руководства AMPL

Добавлен оригинальный постер вопроса.

dietu.mod:

# dietu.mod
#----------
# set MINREQ;   # nutrients with minimum requirements
# set MAXREQ;   # nutrients with maximum requirements
set MINREQ = {"A", "B1", "B2", "C", "CAL"};
set MAXREQ = {"A", "NA", "CAL"};

set NUTR = MINREQ union MAXREQ;    # nutrients
set FOOD;                          # foods

param cost {FOOD} > 0;
param f_min {FOOD} >= 0;
param f_max {j in FOOD} >= f_min[j];

param n_min {MINREQ} >= 0;
param n_max {MAXREQ} >= 0;

param amt {NUTR,FOOD} >= 0;

var Buy {j in FOOD} >= f_min[j], <= f_max[j];

minimize Total_Cost:  sum {j in FOOD} cost[j] * Buy[j];

subject to Diet_Min {i in MINREQ}:
   sum {j in FOOD} amt[i,j] * Buy[j] >= n_min[i];

subject to Diet_Max {i in MAXREQ}:
   sum {j in FOOD} amt[i,j] * Buy[j] <= n_max[i];

Явные определения наборов MINREQ и MAXREQ и их членов взяты из файла *.dat ниже (где их определения закомментированы). Пользователи Matlab, обратите внимание на приведенное выше и помните, что вам нужны запятые между элементами в наборе.

dietu.dat:

# dietu.dat
#----------
data;

# set MINREQ := A B1 B2 C CAL ;
# set MAXREQ := A NA CAL ;
set FOOD := BEEF CHK FISH HAM MCH MTL SPG TUR ;

param:   cost  f_min  f_max :=
  BEEF   3.19    2     10 
  CHK    2.59    2     10 
  FISH   2.29    2     10 
  HAM    2.89    2     10 
  MCH    1.89    2     10 
  MTL    1.99    2     10 
  SPG    1.99    2     10 
  TUR    2.49    2     10  ;

param:   n_min  n_max :=
   A      700   20000
   C      700       .
   B1       0       .
   B2       0       .
   NA       .   50000
   CAL  16000   24000 ;

param amt (tr):   A    C   B1   B2    NA   CAL :=
          BEEF   60   20   10   15   938   295
          CHK     8    0   20   20  2180   770
          FISH    8   10   15   10   945   440
          HAM    40   40   35   10   278   430
          MCH    15   35   15   15  1182   315
          MTL    70   30   15   15   896   400
          SPG    25   50   25   15  1329   370
          TUR    60   20   15   10  1397   450 ;

Решите модель, используя следующее в приглашении AMPL:

reset data;
reset;
model dietu.mod;
data dietu.dat;
solve;
person LarrySnyder610    schedule 10.06.2019
comment
Спасибо за объяснение. И круто! ИЛИ SE !! Я не уверен, отправлять ли сюда всех моих коллег, так как это в бета-версии ?? В основном я обходился инструментальными языками SE, Stats, Math и компьютерными SE. И групповой форум тоже... слишком много вариантов. Откровенно говоря, основываясь на SE на языке вычислений, я обнаружил, что в Grouples и SE можно найти ответы на разные вопросы, и я еще не распознал закономерность, которая различает типы вопросов, на которые, вероятно, будут даны ответы в каждом из них. P.S. И да, странно, что используется несколько синтаксисов в зависимости от того, находится ли он в файле *.dat или *.mod. - person user36800; 11.06.2019
comment
Два метода определения set PROD сбивают с толку. В первом члены похожи на перечисляемые типы. Имена используются только для различения членов. Они могут быть любыми, если мы используем их постоянно. Они похожи на идентификаторы исходного кода (имена переменных). Во втором синтаксисе они являются истинными строками, к которым можно применять строковые функции, такие как регулярные выражения. Только в слабо типизированных языках, таких как Matlab, я видел, как два типа сливаются вместе, например, при использовании строк для поиска имен свойств объекта. Я думаю, что использование нескольких синтаксисов усложняет язык. - person user36800; 11.06.2019
comment
Например, в Главе 6 (Составные наборы и индексирование) на стр. 91 приведен пример кода с использованием кавычек вокруг строк. Контекст не задан. Основываясь на вашем ответе, кажется, что мы должны предположить, что это иллюстрирует код в файле модели. И мы предполагаем, что в файле данных есть какой-то другой синтаксис. Без лучшего знания AMPL это может создать опасность, когда имя члена набора будет перепутано с именем переменной (или, скорее, параметра). - person user36800; 11.06.2019
comment
@ user36800 Я согласен, что изменение синтаксиса сбивает с толку. Но я думаю, что оба метода обрабатывают элементы PROD как строки. Например, я использовал set PROD := bands coils plate; в файле dat, а затем сделал display {p in PROD} substr(p, 2, 4); в командной строке, что дало правильные результаты. - person LarrySnyder610; 11.06.2019
comment
@user36800 user36800 Что касается OR.SE - да, пожалуйста, не стесняйтесь отправлять коллег на or.stackexchange.com, даже если он находится в бета-версии. Бета — это забавное название, и сайты могут оставаться в бета-версии в течение многих лет, но при этом оставаться в курсе событий. OR.SE находится в закрытой бета-версии, что является скорее периодом разминки, но через пару недель она должна выйти в общедоступную бета-версию. Я согласен, слишком много вариантов, и это одна из причин, по которой мы создали OR.SE. - person LarrySnyder610; 11.06.2019
comment
Если это личное, может ли кто-нибудь получить к нему доступ и участвовать? Обычно я вхожу в систему, используя свою учетную запись Google. Я не уверен, какие ограничения на участие применяются к бета-версии SE. - person user36800; 11.06.2019
comment
@user36800 user36800 Да, участвовать может любой. Сначала по умолчанию это были люди, которые зарегистрировались в Зоне 51, но другие могут присоединиться по приглашению, и Я думаю, просто перейдя по URL-адресу и нажав «Войти». Если вы не можете войти по какой-либо причине, отправьте мне пинг, и я могу отправить вам приглашение. Затем вы можете пригласить других. - person LarrySnyder610; 11.06.2019
comment
Спасибо, Ларри Снайдер610. - person user36800; 11.06.2019
comment
Отмечая, что члены набора могут быть строками с пробелами в них; в .dat кавычки необязательны для членов набора из одного слова, но обязательны для тех, которые содержат пробелы. Досадно, что команда display будет показывать кавычки для последнего, но не для первого, что делает вывод непоследовательным. - person Geoffrey Brent; 13.06.2019
comment
@ Джеффри Бент: Большое спасибо за это разъяснение! Я озадачен решением поддерживать другой синтаксис. Это, вероятно, указано в руководстве по AMPL (приложение к книге AMPL), но, основываясь только на тексте упорядоченных наборов, я просто не могу расшифровать его спецификации. - person user36800; 13.06.2019
comment
@user36800 user36800 Да, это вызвало у меня много путаницы, когда я только начинал. Я думаю, что формат .dat предназначен для сведения к минимуму необходимости обработки входных данных (например, я могу просто C&P из электронной таблицы, добавить пару строк вверху и внизу и получить действительный .dat без необходимости редактировать каждую строку), но это чисто предположение. - person Geoffrey Brent; 14.06.2019
comment
@Geoffrey Brent: Это действительно имеет большой смысл. Дает мне положительную оценку разницы. Спасибо. - person user36800; 17.06.2019