Var A:= или фраза default в объявлении переменной задает начальные значение переменной(ым). Переменной, которой не присвоено начальное значение с помощью :=, также может быть назначено начальные значение из файла данных. Начальные значения переменных обычно изменяются - в идеале на оптимальные значения - после решения модели. Основная цель начальных значений переменных - дать решателю хорошее начальное решение. Решатели для линейного программирования редко способны найти хорошее применение начальному решению, однако начальные значения широко и с успехом используются в нелинейных моделях.
Способы определения начальных значений переменных
Существует несколько способов задать значения переменных в AMPL:
- В файле *.mod можно указать выражение := в операторе var, который определяет переменную. Например, чтобы присвоить 1 всем переменным myvar[i],
мы запишем:
var myvar{S}:= 1;
или назначить значение p[i]+1 для myvar[i], где p[i] - некоторый параметр:
var myvar{i в S}:= p[i] + 1;
- В файле *.dat указать начальные значения в качестве данных для переменных, так же, как объявляются данные для параметров. Например, если в модели мы определили:
var myvar{S}; где S = {1,2,3,4,5}
, тогда файл *.dat может содержать запись:
var myvar: = 1 23 2 87 3 57 4 99 5 17;
- В файле *.run используя оператор let для назначения начальных значений. После объявления var myvar{S}; в модели, можно присвоить одно и то же значение всем переменным:
let {i in S} myvar[i]:= 1;
или можно использовать выражение для назначения различных значений:
let {i in S} myvar[i]:= p[i] + 1;
Переменные можно объявить, как целые числа integer, или как двоичные binary,так что они будут принимать целые значения либо 0 или 1 соответственно - в любом оптимальном решении. Модели, которые содержат переменные integer или binary являются целочисленными моделями, особенности которых обсуждаются в Разделе "Целочисленные модели".
Согласование начальных значений переменных с ограничениями
Предположим, мы придумали начальное решение для модели, но не уверены, удовлетворяет ли оно всем ограничениям. Как проверить, что заданные начальные значения входят в область допустимых решений?
- Во-первых, необходимо присвоить первоначальные значения переменным модели. Это можно сделать следующими способами:
1.1. Чтение списков данных таблиц из текстового файла (*.dat) в формате AMPL или из базы данных. Формат синтаксиса такой же, как для чтения данных для параметров, за исключением использования var вместо param.
1.2. Считать неформатированные данные с помощью команды read AMPL.
1.3. Присвоить значения, вычисленные из выражения AMPL, используя команду AMPL let. Также, можно использовать let для присвоения значения отдельным переменным.
- Использовать следующие команды для отображения невозможности решения:
display min{i in 1.._ncons} _con[i].slack; display min{j in 1.._nvars} _var[j].slack;
AMPL отобразит два числа: первое показывает наибольшую неосуществимость в каждом ограничении, а второе показывает наибольшую неосуществимость каждой переменной по отношению к ее границам. Если оба эти числа неотрицательны или отрицательны, но очень малы (например, -2,58785e-10), тогда решение с заданными первоначальными значениями переменных - возможно.
В противном случае можно использовать следующие утверждения, чтобы отобразить все имеющиеся невозможные варианты:
display{i in 1.._ncons: _con[i].slack<-1e-6}(_conname[i], _con[i].slack); display {j in 1.._nvars: _var[j].slack<-1e-6} (_varname[j], _var[j].slack);