2015-05-09 120 views
1

我正在研究一个计算优化类的项目,并且遇到了为我的混合整数程序编写特定约束的问题。AMPL约束语法

该项目本质上是一个贷款组合优化问题,我试图在满足对风险,回报和支出的限制的同时最大化对贫困的影响。我几乎所有的约束条件都按预期工作,但是最后一个给我提出了一个问题。

这里是套;

#SETS 
set REGION;         #Set of regions 
set COUNTRY;        #Set of countries 
set LOAN_DURATION;       #Set of loans 
set GROUP within {COUNTRY,REGION};   #Set of countries within regions 

决策变量

#VARIABLES 

var x{COUNTRY,LOAN_DURATION}>=0;   #Amount of money that can be loaned  #to each country c by loan type l 
var y{COUNTRY,LOAN_DURATION} binary;  #decision of whether to use loan type #l for each country c 

这里是给我一个问题的约束;

subject to WITHIN_REGION{r in REGION, (c,r) in GROUP, l in LOAN_DURATION}: 
x[c,l] <= QUOTA[r]*sum{c in COUNTRY, l in LOAN_DURATION} x[c,l]; 

我所试图做的是说,对于每个区域,检查租借到每个国家的金额,并确保它是小于或等于租借给该区域的配额的一半。当我尝试运行这个模型时,我只是得到第二行的基本语法错误。

我有一个类似的约束之前,这一个检查,以确保每个地区至少获得其贷款总额的地区配额,它似乎是按预期工作;

subject to REGION_QUOTA{r in REGION}: 
sum{(c,r) in GROUP, l in LOAN_DURATION} x[c,l] >= QUOTA[r]*sum{c in COUNTRY, l in LOAN_DURATION} x[c,l]; 

所以我想知道是否有任何扩大专家在那里,可以让我得到这最后一个约束的手工作。

感谢

乔希

回答

1

的问题是,你在两个不同的索引表达式中具有重叠范围,(c,r) in GROUPc in COUNTRY使用相同的索引c名。您可以重命名第二个指标,以避免错误:

subject to WITHIN_REGION{r in REGION, (c,r) in GROUP, l in LOAN_DURATION}: 
x[c,l] <= QUOTA[r]*sum{c2 in COUNTRY, l in LOAN_DURATION} x[c2,l]; 

但如果你要总结x[c2,l]在所有国家地区r,这似乎是这种情况,你应该有类似:

subject to WITHIN_REGION{r in REGION, (c,r) in GROUP, l in LOAN_DURATION}: 
x[c,l] <= QUOTA[r]*sum{(c2,r) in GROUP, l in LOAN_DURATION} x[c2,l]; 
+1

谢谢你的帮助。当我将你的建议用于c和l时,它按预期工作。 – Josh

+0

对,我没有注意到'l'也需要重命名。 – vitaut