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

Я пытаюсь создать модель амплитуды, которая объединяет заданные точки в 2-мерное пространство в соответствии с моделью Саглама и др. (2005). В целях тестирования я хочу случайным образом сгенерировать некоторые точки данных, а затем вычислить для них евклидову матрицу расстояний (так как она мне нужна). Я знаю, что я могу создать только матрицу расстояний без точек данных, но на более позднем этапе точки данных будут предоставлены, а затем мне нужно рассчитать расстояния между каждой точкой.

Ниже вы найдете код, который я написал до сих пор. При загрузке модели все время появляется сообщение об ошибке «i не определено». Поскольку 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} = ...

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


person cuca    schedule 22.02.2019    source источник


Ответы (1)


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

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

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

person cuca    schedule 22.02.2019