我正在尝试建立一个放大模型,根据Saglam等人(2005)的模型,在二维空间中聚集给定点。出于测试目的,我想随机生成一些数据点,然后计算它们的欧几里德距离矩阵(因为我需要这个)。我知道我只能制作没有数据点的距离矩阵,但在后面的步骤中将给出数据点,然后我需要计算每个点之间的距离。
下面你会找到我到目前为止所写的代码。在加载模型时,我不断收到错误消息“我未定义”。因为我是一个应该在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];
到目前为止,我试图将行格式param 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应该在线上提到,我不知道怎么会错过。