2

我打算进行优化,但我得到一个我找不到原因的错误。编译器抱怨 servicetime、startlimit 和 endlimit 不是无效的。特别是编译器在约束 TimeConstraint 中抱怨 servicetime['ORIGINS'] 没有值。

有问题的约束是:

subject to TimeConstraint {k in H}: sum{i in UNI, j in UNI} servicetime[i]*x[i,j,k] <= 1440; 

在哪里:

set ORIGINS;
set DESTINATIONS;
set UNI;
param servicetime{UNI} integer > 0;
var x{UNI,UNI, H} binary;
param startlimit{UNI};
param endlimit{UNI};

.dat 文件是:

set ORIGINS := 1 2 3 4 5 6 7;
set DESTINATIONS := 8 9 10 11 12 13 14;
set UNI = ORIGINS union DESTINATIONS;


param: startlimit endlimit  servicetime:=
1   0   1440    360
2   0   1440    360
3   0   1440    360
4   0   1440    360
5   0   1440    360
6   0   1440    120
7   0   1440    120
8   0   1440    360
9   0   1440    360
10  0   1440    360
11  0   1440    360
12  0   1440    360
13  0   1440    120
14  0   1440    120;

我看不出这怎么行。对我来说,这看起来很准确。希望有人可以对此有所了解!问候,

4

1 回答 1

1

AMPL 数据格式不允许表达式,所以ORIGINSunion被逐字解释为字符串,而不是数据语句中DESTINATIONS的集合表达式ORIGINS union DESTINATIONS

set UNI = ORIGINS union DESTINATIONS;

您可以通过在模型文件的声明中初始化集合来解决此问题:

set ORIGINS;
set DESTINATIONS;
set UNI = ORIGINS union DESTINATIONS;
param servicetime{UNI} integer > 0;
...
于 2014-10-14T14:55:49.610 回答