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

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

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

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

а также

param d {x1, x2} = ...

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

1 Ответ

0 голосов
/ 22 февраля 2019

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

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

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

...