【问题标题】:AMPL loops and omitting variablesAMPL 循环和省略变量
【发布时间】:2018-10-06 17:09:36
【问题描述】:

最近开始使用 ampl,但在迭代和索引方面遇到了麻烦。

我有以下模型脚本:

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 中省略一种产品?

【问题讨论】:

    标签: syntax iteration ampl


    【解决方案1】:

    您可以在 .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}". 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-26
      • 2014-11-09
      • 2015-04-30
      • 2013-06-12
      相关资源
      最近更新 更多