在 ampl 中定义距离矩阵的函数。继续获得 "i is not defined"
Define the function for distance matrix in ampl. Keep getting "i is not defined"
我正在尝试根据 Saglam 等人 (2005) 的模型建立一个 ampl 模型,该模型将二维 space 中的给定点聚类。出于测试目的,我想随机生成一些数据点,然后为它们计算欧几里得距离矩阵(因为我需要这个)。我知道我只能在没有数据点的情况下制作距离矩阵,但在稍后的步骤中将给出数据点,然后我需要计算每个点之间的距离。
下面是我目前编写的代码。加载模型时,我不断收到错误消息 "i is not defined"。由于 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} = ...
唉,这些都没用。因此,非常感谢某人可以提供的任何帮助。我搜索了网络,但没有找到对我的任务有用的东西。
我终于找到了缺少的东西。我计算参数d的那一行应该是
param d {i in D, j in D} = sqrt((x1[i]-x1[j])^2 + (x2[i]-x2[j])^2);
回过头来看下标i和j应该都提到了才对,不知道怎么漏掉了。
我正在尝试根据 Saglam 等人 (2005) 的模型建立一个 ampl 模型,该模型将二维 space 中的给定点聚类。出于测试目的,我想随机生成一些数据点,然后为它们计算欧几里得距离矩阵(因为我需要这个)。我知道我只能在没有数据点的情况下制作距离矩阵,但在稍后的步骤中将给出数据点,然后我需要计算每个点之间的距离。
下面是我目前编写的代码。加载模型时,我不断收到错误消息 "i is not defined"。由于 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} = ...
唉,这些都没用。因此,非常感谢某人可以提供的任何帮助。我搜索了网络,但没有找到对我的任务有用的东西。
我终于找到了缺少的东西。我计算参数d的那一行应该是
param d {i in D, j in D} = sqrt((x1[i]-x1[j])^2 + (x2[i]-x2[j])^2);
回过头来看下标i和j应该都提到了才对,不知道怎么漏掉了。