Определите функцию для матрицы расстояний в усилителе. Продолжайте получать "я не определен"
Я пытаюсь настроить модель усилителя, которая группирует заданные точки в двумерном пространстве в соответствии с моделью 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 должны были быть упомянуты в строке, я не знаю, как я мог пропустить это.