Циклы AMPL и пропущенные переменные - PullRequest
0 голосов
/ 06 октября 2018

Недавно начали использовать amp и столкнулись с проблемой итерации и индексации.

У меня есть следующий скрипт модели:

set NUTR;
set FOOD;

param Cost {FOOD} > 0; #Costs pr. gramm

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

param n_min {NUTR} >=0;
param n_max {i in NUTR} >= n_min[i];

param amount {NUTR,FOOD} >= 0; #amount nutrients pr. gramm

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

minimize Total_cost: sum{j in FOOD} Cost[j] * Purchase[j];
s.t. Intake {i in NUTR}: n_min[i] <= sum {j in FOOD} amount[i,j] *  
Purchase[j] <= n_max[i]; 

data;

set NUTR := PRT CRB FAT KCAL;
set FOOD := CD VL HM SLM TN MCR EGG BN PS FSL PEN RC ORG PT ON AVC CLF CBG ALM TMT OLV MLK ;

Модель отлично работает с набором данных, ноу меня вопрос: возможно ли создать цикл, дающий оптимальное решение, исключая один продукт из набора FOOD за раз?

1 Ответ

0 голосов
/ 07 октября 2018

Вы можете сделать это довольно легко в .run, зациклившись на FOOD, а затем используя оператор разности множеств, чтобы определить набор "все из FOOD, кроме этого одного элемента".Это должно дать вам общее представление:

model;
set FOOD;
data; 
set FOOD := CD VL HM SLM TN MCR EGG BN PS FSL PEN RC ORG PT ON AVC CLF CBG ALM TMT OLV MLK ;

for{f in FOOD}{
    printf "\nThe set Food minus %s is:", f;
    display (FOOD diff {f});
    # replace with your model and solve commands, indexing over "FOOD diff {f}". 
}
...