Я получаю сообщение об ошибке: D уже определено, и я не могу его решить

Пробую поставить задачу минимизации. При попытке загрузить мод-файл я все время получаю сообщение об ошибке:

basemodel.mod, line 4 (offset 86): D is already defined context: set >>> D; <<<

Я работаю с консолью amp и хочу сначала загрузить файл мода, затем файл dat, а затем решить проблему. Сообщение об ошибке появляется после загрузки мода-файла и перед загрузкой dat-файла.

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

Вот код, который я написал до сих пор:

set D;

param clus {1..k} integer;

param x1 {D};
param x2 {D};

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

var x {i in D, l in clus} binary;
var x {j in D, l in clus} binary;

var D_l {l in k} >= 0;
var D_max;

minimize cost_function: D_max;

subject to C1: D_l[l] >= d[i,j] * (x[i,l] + x[j,l] - 1);
subject to C2 {i in D}: sum {l in k} x[l] = 1;
subject to C3 {i in D}:D_max >= D_l;

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


Ответы (1)


Я предполагаю, что вы запустили код один раз, не получив ошибки «D is already defined», а затем попытались запустить его повторно, не очистив определения, созданные при первом запуске. Определения set / param / var будут висеть до тех пор, пока вы не сделаете что-нибудь для их очистки, поэтому, если вы повторно запустите тот же код, вы получите ошибки для всего, что все еще определено с последнего запуска.

Я обычно начинаю свои модели AMPL с reset;, чтобы очистить все, чтобы мне не приходилось сталкиваться с этой проблемой. (Если, конечно, я не планирую запускать их как часть более крупного рабочего процесса.)

Еще пара проблем с вашим примером кода:

  • Определение кластеров относится к k, которое не было определено
  • Var x определяется дважды.
person Geoffrey Brent    schedule 19.02.2019
comment
Я попробовал ваш подход, и он сработал, я не понимал, что мне придется каждый раз его сбрасывать. И спасибо, что осветили другие проблемы, я не так уж опытен в усилителе. - person cuca; 20.02.2019