Оператор сумм переменных AMPL

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

set CASES := {1,2,3,4,5,6};
model modelFile.mod;
option solver cplex;
option eexit -123456789;
var total;
let total := 0;

for {j in CASES}
{
    reset data;
    data ("data" & j & ".dat")
    solve;
    display total_Cost; 
    let total := total + total_Cost;
    display total;
}

Пример вывода:

CPLEX 12.6.3.0: optimal solution; objective 4.236067977
2 dual simplex iterations (0 in phase I)
total_Cost = 4.23607

total = 4.23607

CPLEX 12.6.3.0: optimal solution; objective 5.656854249
5 dual simplex iterations (0 in phase I)
total_Cost = 5.65685

total = 5.65685

где total_cost - объективное значение из задачи оптимизации.


person statBeginner    schedule 23.02.2016    source источник


Ответы (2)


Поскольку AMPL - это язык алгебраического моделирования, а не язык программирования общего назначения, переменные в нем обозначают оптимизацию. переменные, которые определяются в процессе решения. Таким образом, каждый раз, когда вы вызываете solve, переменная оптимизации total сбрасывается. Здесь вам нужен параметр, который, в отличие от переменной, не изменяется во время оптимизации:

param total;
person vitaut    schedule 23.02.2016
comment
Я пробовал сделать это с параметром, но это тоже не сработало. - person statBeginner; 02.03.2016
comment
@statBeginner Что именно не сработало? Не правильно ли обновляется? - person vitaut; 02.03.2016
comment
Нет, нет никакой разницы в выводе при использовании param и var. Но теперь я понимаю вашу точку зрения. Я не проверял, используя параметр без данных сброса. Если это сработает, это должно быть лучше концептуально, чем использование здесь var. Согласованный. - person statBeginner; 02.03.2016

Я наконец понял, что это произошло из-за нового ключевого слова «сброс данных», которое есть в AMPL. Если изменить ключевое слово на «обновить», код заработает.

person statBeginner    schedule 01.03.2016
comment
Правильно, вам не стоило использовать данные сброса =). Но переключение на параметр - тоже хорошая идея. - person vitaut; 02.03.2016