在放大器中定义距离矩阵的功能。不断收到“我未定义”

时间:2019-02-22 09:25:48

标签: ampl

我试图根据Saglam等人(2005)的模型建立一个将给定点聚集在二维空间中的扩增模型。为了测试,我想随机生成一些数据点,然后为它们计算欧几里得距离矩阵(因为我需要这一点)。我知道我只能在没有数据点的情况下制作距离矩阵,但在后续步骤中将给出数据点,然后需要计算每个点之间的距离。

下面您将找到我到目前为止编写的代码。加载模型时,我不断收到错误消息“未定义”。由于i是应该在x1上运行的下标,并且x1是在集合D上定义的并且具有一个下标的参数,因此我无法弄清楚为什么此代码无效。据我了解,如果仅将变量用作下标,则不必定义变量?

reset;

# parameters to define clustered
param m; # numbers of data points
param n; # numbers of clusters

# sets
set D := 1..m; #points to be clustered
set L := 1..n; #clusters

# randomly generate datapoints
param x1 {D} = Uniform(1,m);
param x2 {D} = Uniform(1,m);
param d {D,D} = sqrt((x1[i]-x1[j])^2 + (x2[i]-x2[j])^2);

# variables
var x {D, L} binary;
var D_l {L} >=0;
var D_max >= 0;

#minimization funcion
minimize max_clus_dis: D_max;

# constraints
subject to C1 {i in D, j in D, l in L}: D_l[l] >= d[i,j] * (x[i,l] + x[j,l] - 1);
subject to C2 {i in D}: sum{l in L} x[i,l] = 1;
subject to C3 {l in L}: D_max >= D_l[l];

到目前为止,我试图将参数x1的行格式更改为

param x1 {i in D, j in D} = ...

以及

param d {x1, x2} = ...

A,这无济于事。因此,深深感谢某人可以提供的任何帮助。我在网上搜索,但发现没有什么对我的任务有用。

1 个答案:

答案 0 :(得分:0)

我最终发现了缺少的东西。我计算参数d的那一行应该是

param d {i in D, j in D} = sqrt((x1[i]-x1[j])^2 + (x2[i]-x2[j])^2);

很明显,应该在行上提到下标i和j,我不知道该怎么想。