Ограничения
Ограничения модели устанавливаются через менеджер ограничений, доступный в объекте модели. Далее в этом разделе Модель = О2.СоздатьМодель();.
МенеджерОграничений = Модель.Ограничения();
Обязательные и условные ограничения
Ограничения модели могут быть обязательными или условными. В методах установки ограничений пристуствует опциональный параметр "Условия", в который могут быть переданы одна или несколько булевых переменных.
Если параметр "Условия" не передан, то ограничение считается обязательным, и решатель учитывает такое ограничение в любом случае. Если же в качестве "Условия" передана булева переменная или массив из булевых переменных, то установленное ограничение считается условным и проверяется решателем только в том случае, когда значения всех указанных булевых переменных имеют значение ИСТИНА, то есть значения переменных объединяются логическим "И".
В качетсве условий проверки могут передаваться не только булевые переменные, но и другие булевы выражения, например булевы константы или отрицания булевых переменных.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
// добавляем обязательное ограничение: x > 0
Модель.Ограничения().ЗначениеБольше(Пx, 0);
СуммаПоложительна = Модель.БулеваПеременная();
СуммаНеПоложительна = Модель.Отрицание(СуммаПоложительна);
// добавляем условные ограничения
Модель.Ограничения().Соотношение("x + y > 0", СуммаПоложительна);
Модель.Ограничения().Соотношение("x + y <= 0", СуммаНеПоложительна);
Методы ограничения значений
Соотношение
Данный метод устанавливает необходимость проверки одного или нескольких соотношений, описанных строкой. Соотношения должны содержать линейные выражения, разделенные символами: "=", "<>", ">", ">=", "<", "<=", ";".
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Модель.Ограничения().Соотношение("0 <= x + y < 5*y; x > 0");
// в данном случае будут установлены следующие ограничения:
// x + y >= 0
// x + y < 5y
// x > 0
СоотношениеЗначений
Данный метод устанавливает соотношение между двумя линейными выражениями.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
// устанавливаем соотношение: y > x
Модель.Ограничения().СоотношениеЗначений(Пy, Пx, Перечисления.О2_ТипыСравнений.Больше);
// устанавливаем соотношение: 55 + x < 3y
Модель.Ограничения().СоотношениеЗначений("55 + x", "3 * y", Перечисления.О2_ТипыСравнений.Меньше);
ЗначениеРавно
Метод устанавливает ограничение на равенство двух линейных выражений. Является оберткой для метода "СоотношениеЗначений".
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
// устанавливаем соотношение: 2x = y
Модель.Ограничения().ЗначениеРавно("2*x", Пy);
ЗначениеНеРавно
Метод устанавливает ограничение на неравенство двух линейных выражений. Является оберткой для метода "СоотношениеЗначений".
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
// устанавливаем соотношение: 2x <> y
Модель.Ограничения().ЗначениеНеРавно("2*x", Пy);
ЗначениеБольше
Метод добавляет проверку соотношения, при котором первое выражение строго больше второго. Является оберткой для метода "СоотношениеЗначений".
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
// устанавливаем соотношение: 2x > y
Модель.Ограничения().ЗначениеБольше("2*x", Пy);
ЗначениеБольшеИлиРавно
Метод добавляет проверку соотношения, при котором первое выражение больше или равно второму. Является оберткой для метода "СоотношениеЗначений".
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
// устанавливаем соотношение: 2 * x >= y
Модель.Ограничения().ЗначениеБольшеИлиРавно("2*x", Пy);
ЗначениеМеньше
Метод добавляет проверку соотношения, при котором первое выражение строго меньше второго. Является оберткой для метода "СоотношениеЗначений".
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
// устанавливаем соотношение: 2x < y
Модель.Ограничения().ЗначениеМеньше("2*x", Пy);
ЗначениеМеньшеИлиРавно
Метод добавляет проверку соотношения, при котором первое выражение меньше или равно второму. Является оберткой для метода "СоотношениеЗначений".
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
// устанавливаем соотношение: 2x <= y
Модель.Ограничения().ЗначениеМеньшеИлиРавно("2*x", Пy);
ВсеРазличные
Метод добавляет ограничение, при котором все указанные выражения должны принимать попарно различные значения.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Пz = Модель.Переменная("z");
Выражения = О2.Массив(Пx, Пy, "2*x + z");
Модель.Ограничения().ВсеРазличные(Выражения);
МинимумРавен
Метод добавляет ограничение, при котором минимальное значение среди указанных выражений равно значению другого выражения.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Пz = Модель.Переменная("z");
Выражения = О2.Массив(Пx, Пy, "2*x + z");
Модель.Ограничения().МинимумРавен(Выражения, "3 + y");
МаксимумРавен
Метод добавляет ограничение, при котором максимальное значение среди указанных выражений равно значению другого выражения.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Пz = Модель.Переменная("z");
Выражения = О2.Массив(Пx, Пy, "2*x + z");
Модель.Ограничения().МаксимумРавен(Выражения, "3 + y");
ПроизведениеРавно
Метод добавляет ограничение, при котором произведение значений указанных выражений равно значению другого выражения.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Пz = Модель.Переменная("z");
Выражения = О2.Массив(Пx, Пy, "2*x + z");
Модель.Ограничения().ПроизведениеРавно(Выражения, "3*y + x");
ЗначениеВДомене
Метод добавляет ограничение, при котором значение указанного выражения принадлежит определенному множеству целых чисел (домену).
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Домен = Модель.Домены().Диапазон(15, 35);
Модель.Ограничения().ЗначениеВДомене("3*y + x", Домен);
АбсолютноеЗначениеРавно
Метод добавляет ограничение, при котором абсолютное значение указанного выражения равно значению другого выражения.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
// добавляем ограничение: |x - y| = x + 5
Модель.Ограничения().АбсолютноеЗначениеРавно("x - y", "x + 5");
ОтношениеЗначенийРавно
Метод добавляет ограничение, при котором результат целочисленного деления значений двух выражений равен значению третьего выражения. Все выражения должны быть линейными выражениями одной переменной.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
// добавляем ограничение: (x + 20) / (y + 1) = x + 2
Модель.Ограничения().ОтношениеЗначенийРавно("x + 20", "y + 1", "x + 2");
ОстатокДеленияРавен
Метод добавляет ограничение, при котором остаток от деления деления значений двух выражений равен значению третьего выражения.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
// добавляем ограничение: (x + 20) % (y + 1) = x + 2
Модель.Ограничения().ОстатокДеленияРавен("x + 20", "y + 1", "x + 2");
ВозрастающаяПоследовательность
Метод добавляет ограничение, при котором значения указанных выражений должны образовывать строго возрастающую последовательность. То есть Expri < Expri+1.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Выражения = Новый Массив();
Выражения.Добавить(Пx);
Выражения.Добавить("x + 2*y + 3");
Выражения.Добавить("5*y - 20");
Модель.Ограничения().ВозрастающаяПоследовательность(Выражения);
НеубывающаяПоследовательность
Метод добавляет ограничение, при котором значения указанных выражений должны образовывать неубывающую последовательность. То есть Expri <= Expri+1.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Выражения = Новый Массив();
Выражения.Добавить(Пx);
Выражения.Добавить("x + 2*y + 3");
Выражения.Добавить("5*y - 20");
Модель.Ограничения().НеубывающаяПоследовательность(Выражения);
УбывающаяПоследовательность
Метод добавляет ограничение, при котором значения указанных выражений должны образовывать строго убывающую последовательность. То есть Expri > Expri+1.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Выражения = Новый Массив();
Выражения.Добавить(Пx);
Выражения.Добавить("x + 2*y + 3");
Выражения.Добавить("5*y - 20");
Модель.Ограничения().УбывающаяПоследовательность(Выражения);
НевозрастающаяПоследовательность
Метод добавляет ограничение, при котором значения указанных выражений должны образовывать невозрастающую последовательность. То есть Expri >= Expri+1.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Выражения = Новый Массив();
Выражения.Добавить(Пx);
Выражения.Добавить("x + 2*y + 3");
Выражения.Добавить("5*y - 20");
Модель.Ограничения().НевозрастающаяПоследовательность(Выражения);
ЭлементРавен
Метод добавляет ограничение, при котором значение выражения с определенным индексом равно определенному значению, то есть Выражения[Индекс] = Значение. В данном методе "Индекс" и "Значение" также являются линейными выражениями.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Выражения = Новый Массив();
Выражения.Добавить(Пx);
Выражения.Добавить("x + 2*y + 3");
Выражения.Добавить("5*y - 20");
Индекс = Модель.ПеременнаяДиапазона(0, 2);
Модель.Ограничения().ЭлементРавен(Выражения, Индекс, Пy);
Инверсия
Метод добавляет ограничение, при котором, если ПрямойНабор[А] = Б, то ОбратныйНабор[Б] = А. Здесь "ПрямойНабор" и "ОбратныйНабор" - это массивы из переменных модели.
А1 = Модель.ПеременнаяДиапазона(0, 2);
А2 = Модель.ПеременнаяДиапазона(0, 2);
А3 = Модель.ПеременнаяДиапазона(0, 2);
Б1 = Модель.ПеременнаяДиапазона(0, 2);
Б2 = Модель.ПеременнаяДиапазона(0, 2);
Б3 = Модель.ПеременнаяДиапазона(0, 2);
ПрямойНабор = О2.Массив(А1, А2, А3);
ОбратныйНабор = О2.Массив(Б1, Б2, Б3);
Модель.Ограничения().Инверсия(ПрямойНабор, ОбратныйНабор);
РазрешенныеКомбинации
Метод добавляет ограничение, при котором значения указанных выражений должны образовать одну из разрешенных комбинаций. Здесь "Комбинации" - это двумерный массив целых чисел (массив из массивов). Размер массива второго уровня должен соответствовать размеру массива выражений.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Выражения = Новый Массив();
Выражения.Добавить(Пx);
Выражения.Добавить("x + 2*y + 3");
Выражения.Добавить("5*y - 20");
Комбинации = Новый Массив();
Комбинации.Добавить(О2.Массив(1, 4, 7));
Комбинации.Добавить(О2.Массив(5, 4, 9));
Комбинации.Добавить(О2.Массив(12, 1, -4));
Модель.Ограничения().РазрешенныеКомбинации(Выражения, Комбинации);
ЗапрещенныеКомбинации
Метод добавляет ограничение, при котором значениям указанных выражений запрещено образовывать указанные комбинации. Здесь "Комбинации" - это двумерный массив целых чисел (массив из массивов). Размер массива второго уровня должен соответствовать размеру массива выражений.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Выражения = Новый Массив();
Выражения.Добавить(Пx);
Выражения.Добавить("x + 2*y + 3");
Выражения.Добавить("5*y - 20");
Комбинации = Новый Массив();
Комбинации.Добавить(О2.Массив(1, 4, 7));
Комбинации.Добавить(О2.Массив(5, 4, 9));
Комбинации.Добавить(О2.Массив(12, 1, -4));
Модель.Ограничения().ЗапрещенныеКомбинации(Выражения, Комбинации);
Методы ограничения булевых выражений
ТолькоОдин
Метод добавляет ограничение, при котором ровно одно из указанных булевых выражений имеет значение ИСТИНА.
Индикатор1 = Модель.БулеваПеременная();
Индикатор2 = Модель.БулеваПеременная();
Индикатор3 = Модель.БулеваПеременная();
Индикаторы = О2.Массив(Индикатор1, Индикатор2, Индикатор3);
Модель.Ограничения().ТолькоОдин(Индикаторы);
НиМенееОдного
Метод добавляет ограничение, при котором хотя бы одно из указанных булевых выражений имеет значение ИСТИНА. Метод является синонимом для метода "БулевоИли".
Индикатор1 = Модель.БулеваПеременная();
Индикатор2 = Модель.БулеваПеременная();
Индикатор3 = Модель.БулеваПеременная();
Индикаторы = О2.Массив(Индикатор1, Индикатор2, Индикатор3);
Модель.Ограничения().НиМенееОдного(Индикаторы);
НиБолееОдного
Метод добавляет ограничение, при котором ни более одного из указанных булевых выражений имеют значение ИСТИНА.
Индикатор1 = Модель.БулеваПеременная();
Индикатор2 = Модель.БулеваПеременная();
Индикатор3 = Модель.БулеваПеременная();
Индикаторы = О2.Массив(Индикатор1, Индикатор2, Индикатор3);
Модель.Ограничения().НиБолееОдного(Индикаторы);
БулевоИли
Метод добавляет ограничение, при котором хотя бы одно из указанных булевых выражений имеет значение ИСТИНА.
Индикатор1 = Модель.БулеваПеременная();
Индикатор2 = Модель.БулеваПеременная();
Индикатор3 = Модель.БулеваПеременная();
Индикаторы = О2.Массив(Индикатор1, Индикатор2, Индикатор3);
Модель.Ограничения().БулевоИли(Индикаторы);
БулевоИ
Метод добавляет ограничение, при котором все указанные булевы выражения имеют значение ИСТИНА.
Индикатор1 = Модель.БулеваПеременная();
Индикатор2 = Модель.БулеваПеременная();
Индикатор3 = Модель.БулеваПеременная();
Индикаторы = О2.Массив(Индикатор1, Индикатор2, Индикатор3);
Модель.Ограничения().БулевоИ(Индикаторы);
БулевоИсключающееИли
Метод добавляет ограничение, при котором опрерация XOR над значениями указанных булевых выражений должна возвращать значение ИСТИНА.
Индикатор1 = Модель.БулеваПеременная();
Индикатор2 = Модель.БулеваПеременная();
Индикатор3 = Модель.БулеваПеременная();
Индикаторы = О2.Массив(Индикатор1, Индикатор2, Индикатор3);
Модель.Ограничения().БулевоИсключающееИли(Индикаторы);
Следствие
Метод устанавливает причинно-следственную связь, при которой, если "Причина = Истина", то и "Следствие = Истина". То есть: Причина ⇒ Следствие, но не наоборот.
Индикатор1 = Модель.БулеваПеременная();
Индикатор2 = Модель.БулеваПеременная();
Модель.Ограничения().Следствие(Индикатор1, Индикатор2);
Методы ограничения интервалов
Интервал
Метод создает новый интервал. "Начало", "Размер" и "Конец" должны быть переменными или линейными выражениями одной переменной. Если параметр "Условие" не передано, то интервал считается обязательным и учитывается в любом случае. Если в параметре "Условие" передана булева переменная или иное булево выражение, то интервал считается существующим, только если булево выражение принимает значение ИСТИНА.
Созданный интервал автоматически накладывает ограничение "Начало + Размер = Конец", если услови его существования соблюдены.
Начало = Модель.ПеременнаяДиапазаона(0, 100);
Размер = Модель.ПеременнаяДиапазаона(0, 100);
Конец = Модель.ПеременнаяДиапазаона(0, 100);
ИнтервалСуществует = Модель.БулеваПеременная();
Интервал = Модель.Ограничения().Интервал(Начало, Размер, Конец, ИнтервалСуществует);
ФиксированныйИнтервал
Метод создает новый интервал фиксированного размера. "Начало" должно быть переменной или линейным выражением одной переменной. "Размер" должен быть целым неотрицательным числом. Если параметр "Условие" не передано, то интервал считается обязательным и учитывается в любом случае. Если в параметре "Условие" передана булева переменная или иное булево выражение, то интервал считается существующим, только если булево выражение принимает значение ИСТИНА.
Начало = Модель.ПеременнаяДиапазаона(0, 100);
ИнтервалСуществует = Модель.БулеваПеременная();
// создаем фиксированный интервал, имеющий Размер = 20
Интервал = Модель.Ограничения().ФиксированныйИнтервал(Начало, 20, ИнтервалСуществует);
ПотребностьИнтервала
Метод создает объект с типом "ПотребностьИнтервала". Данный объект позволяет привязать к интервалу потребность в определенном ресурсе.
Например, во время работы ЧПУ станка требуется присутсвие одного оператора, то есть потребность интервала работы равна "1".
Обеъекты "ПотребностьИнтервала" используются при установке ограничений на конкуретное использование ресурсов (см. КонкурентноеИспользование).
Начало = Модель.ПеременнаяДиапазаона(0, 100);
Размер = Модель.ПеременнаяДиапазаона(0, 100);
Конец = Модель.ПеременнаяДиапазаона(0, 100);
ИнтервалСуществует = Модель.БулеваПеременная();
Интервал = Модель.Ограничения().Интервал(Начало, Размер, Конец, ИнтервалСуществует);
Прямоугольник
Метод создает прямоугольник, размеры которого ограничены созданными ранее интервалами для оси X и для оси Y. Прямоугольники используются для добавляения ограничения на запрет перекрытия прямоугольных областей на плоскости (см. ЗапретПерекрытий2D).
При определении прямоугольника могут использоваться опциональные интервалы. В таком случае прямоугольник тоже становится опциональным. Опциональный прямоугольник считается существующим, если выполнены условия существования для обоих его интервалов.
НачалоX = Модель.ПеременнаяДиапазаона(0, 100);
РазмерX = Модель.ПеременнаяДиапазаона(0, 100);
КонецX = Модель.ПеременнаяДиапазаона(0, 100);
НачалоY = Модель.ПеременнаяДиапазаона(0, 100);
РазмерY = 20;
ИнтервалX = Модель.Ограничения().Интервал(НачалоX, РазмерX, КонецX);
ИнтервалY = Модель.Ограничения().ФиксированныйИнтервал(НачалоY, РазмерY);
Прямоугольник = Модель.Ограничения().Прямоугольник(ИнтервалX, ИнтервалY);
ЗапретПерекрытий
Устанавливает ограничение, запрещающее перекрытие указанных интервалов (см. Интервал). Если в списке интервалов присутсвуют опциональные интервалы, то дополнительно учитываются условия их существования.
Начало = Модель.ПеременнаяДиапазона(0, 100);
Размер = Модель.ПеременнаяДиапазона(0, 100);
Конец = Модель.ПеременнаяДиапазона(0, 100);
Интервалы = Новый Массив();
Интервалы.Добавить(
Модель.Ограничения().ФиксированныйИнтервал(10, 20)
);
Интервалы.Добавить(
Модель.Ограничения().ФиксированныйИнтервал(60, 10)
);
Интервалы.Добавить(
Модель.Ограничения().Интервал(Начало, Размер, Конец)
);
Модель.Ограничения().ЗапретПерекрытий(Интервалы);
ЗапретПерекрытий2D
Устанавливает ограничение, запрещающее перекрытие на плоскости указанных прямоугольников (см. Прямоугольник).
Прямоугольник1 = Модель.Ограничения().Прямоугольник(...);
Прямоугольник2 = Модель.Ограничения().Прямоугольник(...);
Прямоугольник3 = Модель.Ограничения().Прямоугольник(...);
Прямоугольники = О2.Массив(Прямоугольник1, Прямоугольник2, Прямоугольник3);
Модель.Ограничения().ЗапретПерекрытий2D(Прямоугольники);
КонкурентноеИспользование
На вход данного метода передается массив из объектов типа "ПотребностьИнтервала" (см. ПотребностьИнтервала) и общая емкость ресурса. Метод устанавливает ограничение, при котором общая потребность перекрывающихся интервалов не превышает указанную емкость.
Например, ЧПУ станок в момент своей работы требует присутсвия одного оператора (потребность = 1). Если два станка работают последовательно, то достаточно только одного оператора. Если же интервалы работы станков перекрываются, то в момент перекрытий потребуется уже два оператора.
ВсегоОператоров = 2;
// описываем данные первого ЧПУ станка
Начало1 = Модель.ПеременнаяДиапазона(0, 100);
Размер1 = Модель.ПеременнаяДиапазона(0, 100);
Конец1 = Модель.ПеременнаяДиапазона(0, 100);
Интервал1 = Модель.Ограничения().Интервал(Начало1, Размер1, Конец1);
Потребность1 = Модель.Ограничения().ПотребностьИнтервала(Интервал1, 1);
// описываем данные второго ЧПУ станка
Начало2 = Модель.ПеременнаяДиапазона(0, 100);
Размер2 = Модель.ПеременнаяДиапазона(0, 100);
Конец2 = Модель.ПеременнаяДиапазона(0, 100);
Интервал2 = Модель.Ограничения().Интервал(Начало2, Размер2, Конец2);
Потребность2 = Модель.Ограничения().ПотребностьИнтервала(Интервал1, 1);
// описываем данные остальных станков...
Потребности = О2.Массив(Потребность1, Потребность2, ...);
Модель.Ограничения().КонкурентноеИспользование(ВсегоОператоров, Потребности);
Резервуар
Устанавливает ограничение для динамически изменяющегося ресурса, при котором количество остатка ресурса не должно выходить за границы допустимого диапазона [МинЗначение, МаксЗначение]. Изменение количества ресурса описывается событиями накопления. Каждое событие содержит данные о времени приращения ресурса и о величине приращения.
СобытияНакопления = Новый Массив();
Для К = 0 По 3 Цикл
СобытияНакопления.Добавить(
Модель.Ограничения().СобытиеНакопления(Модель.ПеременнаяДиапазона(0, 3), 25)
);
КонецЦикла;
Модель.Ограничения().Резервуар(0, 100, СобытияНакопления);
Методы ограничения в графах и автоматах
ДугаГрафа
Создает дугу ориентированного графа, соединяющее два узла. Узлы характеризуются их порядковыми номерами/индексами. Если созданная дуга задействуется в одном из условий ограничений графа, то булево выражение в параметре "Используется" принимает значение ИСТИНА.
Р1 = Модель.БулеваПеременная();
Р2 = Модель.БулеваПеременная();
Р3 = Модель.БулеваПеременная();
Дуга1 = Модель.Ограничения().ДугаГрафа(1, 2, Р1);
Дуга2 = Модель.Ограничения().ДугаГрафа(2, 3, Р2);
Дуга3 = Модель.Ограничения().ДугаГрафа(3, 1, Р3);
ЦиклГрафа
Устанавливает ограничение, при котором используемые дуги графа должны образовывать Гамильтонов цикл графа.
Р1 = Модель.БулеваПеременная();
Р2 = Модель.БулеваПеременная();
Р3 = Модель.БулеваПеременная();
Дуга1 = Модель.Ограничения().ДугаГрафа(1, 2, Р1);
Дуга2 = Модель.Ограничения().ДугаГрафа(2, 3, Р2);
Дуга3 = Модель.Ограничения().ДугаГрафа(3, 1, Р3);
ДугиГрафа = О2.Массив(Дуга1, Дуга2, Дуга3);
Модель.Ограничения().ЦиклГрафа(ДугиГрафа);
МножественныеЦиклыГрафа
Устанавливает ограничение, при котором используемые дуги графа должны образовать один или несколько циклов, пересекающихся в узле с индексом 0.
Р1 = Модель.БулеваПеременная();
Р2 = Модель.БулеваПеременная();
Р3 = Модель.БулеваПеременная();
Дуга1 = Модель.Ограничения().ДугаГрафа(1, 2, Р1);
Дуга2 = Модель.Ограничения().ДугаГрафа(2, 3, Р2);
Дуга3 = Модель.Ограничения().ДугаГрафа(3, 1, Р3);
ДугиГрафа = О2.Массив(Дуга1, Дуга2, Дуга3);
Модель.Ограничения().МножественныеЦиклыГрафа(ДугиГрафа);
ПереходСостояния
Создает объект, описывающий возможный переход конечного автомата из одного состояния в другое. Переходу присваивается номер для его дальнейшей идентификации среди прочих переходов. Параметры "НачальноеСостояние", "КонечноеСостояние" и "Номер" должны быть целыми числами.
Объекты "ПереходСостояния" используются при установке ограничений, описывающих конечный автомат (см. Автомат).
Переход1 = Модель.Ограничения().ПереходСостояния(1, 2, 1);
Переход2 = Модель.Ограничения().ПереходСостояния(2, 3, 2);
Переход3 = Модель.Ограничения().ПереходСостояния(2, 4, 3);
Переход4 = Модель.Ограничения().ПереходСостояния(4, 5, 4);
Переход5 = Модель.Ограничения().ПереходСостояния(5, 3, 5);
КонечныйАвтомат
Устанавливает ограничение, при котором активные переходы состояний конечного автомата позволяют перейти из начального состояния в одно из конечных состояний.
// описываем все возможные переходы
Переход1 = Модель.Ограничения().ПереходСостояния(1, 2, 1);
Переход2 = Модель.Ограничения().ПереходСостояния(2, 3, 2);
Переход3 = Модель.Ограничения().ПереходСостояния(2, 4, 3);
Переход4 = Модель.Ограничения().ПереходСостояния(4, 5, 4);
ВозможныеПереходы = О2.Массив(Переход1, Переход2, Переход3, Переход4);
// создаем переменные для определения активных переходов
АктивныйПереход1 = Модель.ПеременнаяДиапазона(1, 4);
АктивныйПереход2 = Модель.ПеременнаяДиапазона(1, 4);
АктивныйПереход3 = Модель.ПеременнаяДиапазона(1, 4);
АктивныйПереход4 = Модель.ПеременнаяДиапазона(1, 4);
АктивныеПереходы = О2.Массив(
АктивныйПереход1,
АктивныйПереход2,
АктивныйПереход3,
АктивныйПереход4
);
НачальноеСостояние = 1;
КонечныеСостояния = О2.Массив(5, 3);
// описываем конечный автомат
// если решение существует, то в переменных будут содержаться номера переходов
Модель.Ограничения().КонечныйАвтомат(
НачальноеСостояние,
КонечныеСостояния,
ВозможныеПереходы,
АктивныеПереходы
);