Режим обучения:
Пользователь выбирает следующее добавляемое в остов ребро, если ребро выбрано правильно, то оно выделяется цветом, если не правильно, то пользователь предупреждается об этом. Пометки пересчитываются программой.
Постановка задачи
Задача о ранце является одной из классических комбинаторных задач оптимизации, в рамках данного курса мы будем рассматривать только одномерную задачу о ранце. Содержательная постановка одномерной задачи: дан набор из n предметов, каждый из которых имеет цену ci и вес wi (i=1,2…n), в ранец, имеющий грузоподъемность Wmax, нужно загрузить предметы таким образом, чтобы суммарная ценность предметов в рюкзаке была максимальной. Математическая формулировка задачи представлена в (1), также эта задача называется задачей о 0-1 ранце или целочисленной задачей о ранце (иногда также задачей о рюкзаке).
| (1) |
|
Задача о ранце относится к классу NP-трудных задач, следовательно не имеет алгоритма, находящего оптимальное решение задачи за время, полиномиально зависящее от числа входных параметров, то есть в данном случае от числа предметов в наборе – n.
Методы решения
Основной идеей данного метода является ограничение полного перебора за счет разбиения множества решений на подмножества, получения оценок содержащихся в подмножестве решений и отбрасывании непереспективных подмножеств. Более подробно этот метод можно посмотреть в работах [4, 5, 6].
Применительно к задаче о ранце, дихотомическое разбиение на подмножества осуществляется по принципу присутствия/отсутствия текущего предмета в ранце. Соответственно, все множество решений делится на решения, содержащие текущий предмет и не содержащие его. Оценка решений, содержащихся в подмножестве и приведение вида задачи, производится на основании теоремы Данцига [6].
Теорема (правило) Данцига:
Пусть переменные хj
| (2) |
где s определяется из условия:
| (3) |
Приведение задачи осуществляется согласно правилу Данцига, то есть переменные хj
В качестве вершины ветвления выбирается предмет с номером s.
Верхняя оценка подмножества получается при добавлении в решение дробной части предмета с номером s.
| (4) |
Нижняя оценка – при подсчете цен только целых предметов
| (5) |
Шаг 1. Приводим задачу согласно правилу Данцига.
Шаг 2. Выбираем вершину ветвления
Шаг 3. Получаем верхнюю и нижнюю оценки задачи на текущем шаге по формулам (4) и (5). Исключаем из дальнейшего рассмотрения ветви, для которых полученная верхняя оценка меньше или равна нижней оценке для некоторой другой ветви.
Ветвление также не проводится если верхняя и нижняя оценка в одном направлении совпали – это значит, что по данному направлению достигнут максимум целочисленной задачи.
Шаг 4. Производим процедуру ветвления: для одной ветви устанавливаем
Указания по отображению процесса поиска решения:
Режим демонстрации:
Отображать приведенную задачу. Помечать вершины ветвления
Режим обучения:
Пользователь выбирает вершину ветвления
Метод динамического программирования близок к методу ветвей и границ в том смысле, что также ограничивает перебор решений. Для задачи о ранце процесс поиска решения при помощи динамического программирования является псевдополиномиальным.
Основная идея этого метода состоит в составлении рекуррентных соотношений согласно принципу оптимальности Беллмана: завершающая часть оптимального решения также должна быть оптимальной. Более подробно этот метод можно посмотреть в работах [3, 4, 5, 6].
Рекуррентное соотношение для задачи о ранце выглядит следующим образом:
| (6) |
При граничных условиях:
| (7) |
Значение, полученное в результате вычисления соотношения (6), является оптимальным решением исходной задачи.
Часто процедура поиска решения при помощи динамического программирования записывается в табличном виде, однако в данной работе будем использовать для отображения процесса дерево.
Алгоритм состоит в последовательном вычислении соотношений (6).
Указания по отображению процесса поиска решения:
Режим демонстрации:
Отображать задачу. Вершины ветвления (кроме начальной) помечать соответствующим номером добавляемой в решение переменной
Режим обучения:
Пользователь помечает вершины ветвления, программа проставляет метки на ребрах. Если вершина выбрана не правильно, то пользователь предупреждается об этом. Пользователь выбирает ветку с оптимальным решением.
Постановка задачи
Еще одной классической комбинаторной задачей оптимизации является задача коммивояжера.
Задача формулируется так: в полном взвешенном графе с n вершинами необходимо найти гамильтонов цикл с минимальным суммарным весом входящих ребер. Вес ребра (i, j), соединяющего вершины с номерами i и j обозначается как