
- •Комбинаторные методы решения оптимизационных задач
- •Генерация сочетаний:
- •Генерация перестановок:
- •Генерация размещений:
- •Генерация подмножеств заданного множества
- •Void subset::reset()
- •Int _tmain(int argc, _tchar* argv[])
- •Решение упрощенной задачи о рюкзаке с помощью генератора множества всех подмножеств
- •Int knapsack_s(
- •Int knapsack_s(
- •Int _tmain(int argc, _tchar* argv[])
- •Int _tmain(int argc, _tchar* argv[])
- •Генерация сочетаний
- •Xcombination (
- •Xcombination::xcombination (short n, short m)
- •Int _tmain(int argc, _tchar* argv[])
- •Решение задачи об оптимальной загрузке судна на основе генератора сочетаний
- •Int boat(
- •Int boat(
- •Int _tmain(int argc, _tchar* argv[])
- •Сложность: в общем случае
Генерация сочетаний
Булеан
можно рассматривать как объединение
всевозможных сочетаний, построенных
из элементов множества
Поэтому генерация множества
может быть сведена к генерации булеана
и
выбору из него всех подмножеств с
мощностью
(2)
На рис. 14 представлена
схема построения множества сочетаний
из элементов множества
Закрашенным прямоугольником на рисунке
обозначены номера (индексы) элементов
битовых последовательностей
и элементов множества
Стрелки связывают битовые последовательности,
содержащие три двоичные единицы и
сгенерированные сочетания множества
Для каждой стрелки указаны индексы
единичных позиций соответствующих
битовых последовательностей. Эти индексы
используются для выбора элементов из
множества
для
включения в соответствующее сочетание.
Очевидно, что такой алгоритм генерации
сочетаний имеет сложность
как и алгоритм генерации множества всех
подмножеств.
25:
Рис.14. Схема генерации сочетаний на основе множества всех подмножеств
26:
Рассмотрим еще один пример. Имеется множество всех подмножеств: . Всего подмножеств 16. Требуется найти все сочетания по три.
Порядковый номер |
Запись в двоичном коде |
Запись подмножеств в общем виде |
Требуемые сочетания по три |
|||||
0 |
0 |
0 |
0 |
0 |
|
|
||
1 |
0 |
0 |
0 |
1 |
|
|
||
2 |
0 |
0 |
1 |
0 |
|
|
||
3 |
0 |
0 |
1 |
1 |
|
|
||
4 |
0 |
1 |
0 |
0 |
|
|
||
5 |
0 |
1 |
0 |
1 |
|
|
||
6 |
0 |
1 |
1 |
0 |
|
|
||
7 |
0 |
1 |
1 |
1 |
|
|
||
8 |
1 |
0 |
0 |
0 |
|
|
||
9 |
1 |
0 |
0 |
1 |
|
|
||
10 |
1 |
0 |
1 |
0 |
|
|
||
11 |
1 |
0 |
1 |
1 |
|
|
||
12 |
1 |
1 |
0 |
0 |
|
|
||
13 |
1 |
1 |
0 |
1 |
|
|
||
14 |
1 |
1 |
1 |
0 |
|
|
||
15 |
1 |
1 |
1 |
1 |
|
|
27-29:
На рис. 15 и 16 представлена реализация генератора сочетаний на языке С++. Генератор реализован в виде структуры xcombination.