AMPL: синтаксис для множеств? - PullRequest
1 голос
/ 10 июня 2019

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

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

set PROD := bands coils plate ;

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

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

Может ли кто-нибудь объяснить это различие в синтаксисе?

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

Спасибо.

1 Ответ

1 голос
/ 11 июня 2019

Синтаксис в главе 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];

Явные определения setes 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;
...