Определите функцию для матрицы расстояний в усилителе. Продолжайте получать "я не определен"

Я пытаюсь настроить модель усилителя, которая группирует заданные точки в двумерном пространстве в соответствии с моделью Saglam et al(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];

До сих пор я пытался изменить форму строки х1 на

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

так же как

param d {x1, x2} = ...

Увы, ничего из этого не помогло. Таким образом, любая помощь, которую кто-то может предложить, высоко ценится. Я искал в Интернете, но не нашел ничего полезного для своей задачи.

1 ответ

В конце концов я нашел то, чего не хватало. Строка, в которой я рассчитал параметр d, должна быть

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

Ретроспективно ясно, что подписи i и j должны были быть упомянуты в строке, я не знаю, как я мог пропустить это.

Другие вопросы по тегам