Нижегородский Государственный Технический Университет им. Р.Е. Алексеева Реферат. Задача о ранце. Выполнил: студент 10-В-1 Сидоренко Олег Проверил: Суркова А.С. Н.Новгород 2012 Оглавление Введение. .................................................................................................. 3 Простейшая математическая модель. .................................................... 4 Пример и алгоритм решения. .................................................................. 5 Структура программы для решения задачи. ......................................... 10 Применение ............................................................................................ 12 Список используемой литературы. ........................................................ 14 2 Введение. Задача о ранце – одна из задач оптимизации. Название это получила от максимальной задачи укладки как можно большего возможного числа вещей в рюкзак при условии, что общий объём или вес всех предметов ограничен. В общем виде, задачу можно записать как: из множества предметов со свойствами «стоимость» и «вес», требуется отобрать некоторое число предметов так, чтобы получить максимальную общую стоимость при одновременном соблюдении ограничения на общий вес. Подобные задачи часто возникают в экономике, прикладной математике. Есть много эквивалентных формулировок. Например, можно рассматривать космический аппарат – спутник Земли, где в качестве предметов выступают научные приборы. Тогда задача интерпретируется как отбор приборов для запуска на орбиту. Правда, при этом предполагается решенной предварительная задача - оценка сравнительной ценности исследований, для которых нужны те или иные приборы. С точки зрения экономики предприятия и организации производства более актуальна другая интерпретация задачи о ранце, в которой в качестве «предметов» рассматриваются заказы (или варианты выпуска партий тех или иных товаров), в качестве полезности – прибыль от выполнения того или иного заказа, а в качестве веса – себестоимость заказа. Существует несколько модификаций задачи ранцевого типа: 1. Задача о ранце с условием дробимости для части предметов (ЗРДП) 2. Задача о нескольких ранцах 3. Задача о ранце с ограниченным количеством предметов каждого наименования 4. Многомерная задача о ранце 3 Простейшая математическая модель. Постановка задачи. Имеется N видов предметов, которые турист хочет взять с собою в поход. Известны вес bi каждого предмета и его эффективность ei для туриста. Составить список предметов, помещаемых в рюкзак, учитывая, что предельный вес рюкзака не может быть более заданной величины B. Необходимо, чтобы суммарный эффект от набора предметов был максимальным. Эту задачу можно рассмотреть в двух вариантах: 1. турист решает вопрос: сколько взять предметов каждого вида. 2. турист по поводу каждого предмета решает, брать его или нет. Модель 1. Пусть xi – количество предметов каждого вида. Тогда: Это задача целочисленного линейного программирования с размерностью 1хN. Решается методами ЦЛП: метод ветвей и границ для ЦЛП, метод Гомори. Модель 2. Пусть xi – количество предметов каждого вида, может принимать только два значения 0 или 1. Модель задачи для второго варианта: Это задача булевского программирования с размерностью 1хN. Такие задачи целесообразно сводить к задачам целочисленного линейного программирования (ЦЛП) в связи с тем, что они считаются более простыми методами решения. Сведение булевских переменных к целочисленному виду проводится путем замены ограничений вида на систему ограничений: . Тогда размерность задачи станет равной (N+1)хN. 4 Пример и алгоритм решения. Существуют различные методы решения этих задач: метод Гилмора-Гомори, метод «ветвей и границ», метод Фора-Мальгранжа и др. Классический метод Фора-Мальгранжа предполагает наличие одного критерия стоимости J, который подлежит максимизации, и одного ограничения – веса где ci – стоимость (эффективность) элемента решения xi; ai – вес элемента решения xi; b – максимальный вес для ранца; n – количество элементов решения xi. Каждый элемент решения принимает одно из двух значений x={0,1}, поэтому задача относится к классу задач бивалентного программирования. Достоинство метода Фора-Мальгранжа заключается в том, что в процессе решения в процедуре предусмотрена проверка решения на оптимальность. В данной работе предлагается модификация классического метода ФораМальгранжа решения задачи «о ранце» для случая, когда имеется более одного ограничения, то есть имеется вектор ограничений где aji – вес элемента решения xi по j-ому ограничению; bi – предельный вес для ранца по j-ому ограничению. Пример: Этап 1. Предварительный этап. а) Проверка существования хотя бы одного решения. Если выполнена система неравенств хотя бы для одного элемента решения , то в рассматриваемой задаче хотя бы одно решение существует. В противном случае ненулевого решения не существует и дальнейшее решение может быть остановлено. б) Проверка существования тривиального решения. Если выполняется система неравенств то в рассматриваемой задаче существует тривиальное решение и дальнейшее решение может быть остановлено. В противном случае, переход к следующему пункту. 5 в) Проводится лексикографическое упорядочивание переменных по убыванию эффективности и в рассмотрение вводятся новые переменные что выполняются следующие неравенства такие, При этом, в случае, если то в качестве переменной yk необходимо выбрать такую, для которой удельная эффективность больше Формируется таблица соответствия переменных xi и yk. Пример: 1) Предварительный этап. а) Проверка существования хотя бы одного решения Например, для i = 5 одновременно выполняются такие условия Значит, хотя бы одно решение существует. б) Проверка существования тривиального решения , значит, тривиального решения нет. Этап 2. Определение количества нулевых переменных r в решении. Для определения величины r необходимо найти количество нулевых элементов в решении, допустимое по каждому из ограничений. Для этого из суммы весов всех элементов решения yi по j-ому ограничению последовательно вычитается максимальный из весов до тех пор, пока разность станет не больше предельного веса ранца по j-ому ограничению, например, если иначе из полученной разности вычитается следующий наибольший из незадействованных весов, При выполнении этого неравенства иначе процедура продолжается. После определения значений всех необходимо определить количество нулевых элементов в решении для системы ограничений. Для этого необходимо найти наибольшее из найденных значений, поскольку как минимум одно из ограничений начнет выполняться только с этого количества нулевых элементов. Пример: 2) Определяем количество нулевых переменных в решении. Для этого необходимо рассчитать количество нулевых переменных, определяемое каждым из ограничений. 6 Тогда количество нулевых переменных в решении Этап 3. Определение количества сочетаний вариантов решений, в которых из общего количества n элементов r будут нулевыми, а остальные равны единице. Пример: 3) Определение количества сочетаний вариантов решений, в которых из 5 элементов 1 будет нулевой, а остальные равны единице. Этап 4. Генерация уникальных вариантов решений в порядке убывания суммарной эффективности решений и заполнение таблицы, заголовочная строка которой представлена в таблице 1. Варианты решений задачи: В таблице 1 в столбце № записывается номер варианта решения, в столбцы вносятся значения элементов рассматриваемого варианта решения. Последний столбец для рассматриваемого варианта решения заполняется, если выполнены все ограничения в столбцах . В противном случае это решение будет недопустимо как минимум одним из ограничений. Пример: 4) Формирование таблицы, содержащей варианты решения Варианты решения с одной нулевой переменной: В таблице нет ни одного допустимого решения, необходимо увеличить количество нулевых переменных на единицу: r = 2. Этап 5. В таблице определяется вариант решения с наибольшей эффективностью (множество вариантов с одинаковой наибольшей эффективностью). 7 Если в таблице не существует ни одного допустимого системой ограничений варианта решения, то количество нулевых элементов в решении увеличивается на 1 и осуществляется возврат на этап 3. 5) Определение количества сочетаний вариантов решений, в которых из 5 элементов 2 будут нулевыми, а остальные равны единице. Этап 6. Выполняется проверка выбранного варианта на оптимальность. Для этого формируются множества Для того чтобы решение было оптимальным, необходимо выполнение следующего условия где где - ближайшее к минимальному значение из множества M +. Если условие не выполняется, то потенциально может существовать решение с большей эффективностью с большим количеством нулевых элементов. Для проверки данного предположения количество элементов в решении увеличивается на 1 и осуществляется возврат на этап 3. После повторного решения задачи найденное оптимальное решение сравнивается с полученным при меньшем количестве нулевых элементов в решении. Из полученных вариантов в результате выбирается вариант, дающий наибольшую эффективность. 6) Формирование таблицы, содержащей варианты решения Варианты решения с двумя нулевыми переменными: Этап 7. Осуществляется обратное переобозначение переменных. Этап 8. Выполняется проверка правильности решения задачи подстановкой в исходную систему полученного после переобозначения варианта решения задачи. 8 Пример: 7) Проверка выбранного варианта на оптимальность. Формируются множества Для оптимальности решения необходимо выполнение следующего условия 3+3 > 2, условие выполнено. Таким образом, найденное решение является оптимальным. Этап 9. Записывается ответ задачи. Пример: Ответ: 9 Структура программы для решения задачи. Итак, пусть у нас есть рюкзак объёма W, и список из n вещей, у каждой из которых есть объём v[i] и стоимость c[i], и каждую из которых можно брать сколько угодно раз. При этом все объёмы и все стоимости будут положительными и целыми. Заведём массив max длины W+1, в котором мы по итогам работы алгоритма получим наибольшую стоимость, которую может иметь набор вещей, занимающий данный объём — для каждого объёма от 0 до W включительно. А точнее, после k итераций мы получим для каждого объёма i max[i] — максимальную возможную стоимость набора вещей объёма i, в котором могут быть только первые k вещей. Не используя никаких вещей, можно получить только набор веса 0(max[0] = 0). Значит, в max[i] (0 < i <= W) нужно записать что-то, что будет хуже, чем любая возможная стоимость набора веса i. Например, -1. После этого надо сделать n итераций. На k-той итерации делаем следующее: До итерации в массиве в каждом элементе max[i] записана максимальная возможная стоимость набора вещей веса i, который составлен из вещей 0..k-1. Каждый раз, рассматривая элемент max[i], мы добьёмся того, чтобы там была записана максимальная возможная стоимость набора вещей веса i, который составлен из вещей 0..k. Для этого проверим, в оптимальном наборе вообще есть k-тая вещь? Если нет, то в max[i] уже записана оптимальная стоимость. Если есть, то, если из этого набора выкинуть одну k-тую вещь, то получится оптимальный набор вещей объёма i-v[k], оставленный из вещей 0..k. Но последний уже записан в max[i-v[k]]. Значит, надо просто сравнить величины max[i] и max[i-v[k]] + c[k] (если, конечно, i >= v[k]). Максимальную из них и надо записать в max[i]. Итак, после k-той итерации мы получим в каждом max[i] наибольшую стоимость, которую может иметь набор вещей, составленный из вещей. Значит, после n итераций мы получим именно то, что и обещалось. Осталось дело техники: пройтись по массиву max[i] и выбрать в нём максимальный элемент. Вариации: 1. Когда надо получить не только стоимость, но и сам набор. Кроме массива max, запишем ещё и массив prev. В него мы будем записывать какую вещь мы последний раз положили в набор. То есть, если при сравнении max[i] и max[i-v[k]] + c[k] оказалось, что max[i-v[k]] + c[k] лучше — это означает, что в оптимальном наборе веса i должен быть kтый предмет. Таким образом, если мы выяснили, что оптимальная стоимость max[i] достигается при наборе веса i, то можно записать, что мы добавили в набор вещь prev[i]. И перейти к оптимальному набору веса i — v[prev[i]]. Там тоже посмотреть, какую вещь взяли в последний раз. И так далее, пока не дойдём до нуля. 10 2. Когда каждую вещь можно брать только один раз. В каждой итерации надо идти по массиву не снизу вверх, а сверху вниз, то есть, от W к 0. Тогда получится, что при рассмотрении max[i-v[k]], там всё ещё будет записано набор какой максимальной стоимости веса iv[k] можно получить, используя только вещи 0..k-1. Следовательно, если получится, что в оптимальном наборе надо использовать k-тую вещь, то она будет использована только один раз. 3. Выбор значения, как можно более близкого к данному. Если нет стоимостей, то данный алгоритм помогает как можно сильнее набить рюкзак. Или же, если речь идёт не о рюкзаке, и неважно, что общий объём вещей не больше объёма рюкзака, можно из нескольких чисел с помощью сложения получить число, как можно более близкое к данному. 4. Когда каждую вещь можно брать определённое количество раз. Есть вариация задачи, в которой вещь с номером i можно брать от 0 до q[i] раз. Конечно, можно «размножить» i-ю вещь на q[i] единиц и решить задачу о 0-1 рюкзаке. Но можно поступить хитрее. Пусть q[i] = 1 + 2 + 4 + 8 +… + 2^k + r[i], где r[i] < 2^(k+1). Тогда рассмотрим k+2 предмета объёмом 1*v[i], 2*v[i], ..., 2^k*v[i], r[i]*v[i] и стоимостью 1*c[i], 2*c[i], ..., 2^k*c[i], r[i]*c[i] соответственно. Выбирая различные подмножества этих k+2 предметов, можно получить любое количество (от 0 до q[i]) вещей типа i. 11 Применение Задача о ранце и различные её модификации широко применяются на практике для нахождения решения оптимальной загрузки: - загрузка транспорта. Нахождение оптимальной загрузки транспорта помогает сокращать расходы, получать большую прибыль. - перевозка лифтом максимального количества людей - оптимальное заполнение вагонов - производственная задача с заявками на производство определенного вида продукции с показателями трудоемкости и стоимости -задача загрузки уникального оборудования -задача формирования инвестиционного портфеля -задача изготовления комплекта деталей в системе двух параллельных станков На основе задачи о рюкзаке в 1978 году Ральфом Мерклем и Мартином Хеллманом была разработана Ранцевая криптосистема Меркля-Хеллмана. Это была одна из первых криптосистем с открытым ключом, но, к сожалению, она оказалась криптографически нестойкой и, как следствие, не приобрела популярности. В алгоритме шифрования не используются типы вещей, и потому результирующий вектор х содержит лишь 0 или 1. Р.Мерклю удалось получить обратную к числу s функцию, которая давала бы вектор x, зная только некий «секретный» ключ, и он предложил $100 тому, кто сможет раскрыть ранцевую систему Меркля-Хеллмана. Меркль использовал не произвольную последовательность w[i], а супервозрастающую, то есть такую, что w[k+1]>Σw[i], i=1,2,.., k. Шифрование. – сообщение x = (x1, x2, ..., xn) – вычисляем y = b1x1 + b2x2 + …+bnxn w = {2, 7, 11, 21, 42, 89, 180, 354} - супервозрастающая последовательность. Она является основой для генерации закрытого ключа. Посчитаем сумму элементов последовательности. Она равна 706. Далее выберем простое число q, превосходящее полученное нами значение суммы. q = 881 Выберем также число r из интервала [1,q) r = 588. Построим последовательность β, умножая каждый элемент из последовательности w на r по модулю q. 2 * 588 mod 881 = 235 7 * 588 mod 881 = 592 11 * 588 mod 881 = 301 21 * 588 mod 881 = 14 42 * 588 mod 881 = 28 89 * 588 mod 881 = 353 12 180 * 588 mod 881 = 120 354 * 588 mod 881 = 236 Получим β = (295, 592, 301, 14, 28, 353, 120, 236). Пример: Пусть необходимо зашифровать "a". Сначала нужно перевести "a" в двоичный код 01100001 Далее каждый бит умножается на соответствующее число из последовательности β, а сумма значений отправляется получателю. a = 01100001 0 * 235 + 1 * 592 + 1 * 301 + 0 * 14 + 0 * 28 + 0 * 353 + 0 * 120 + 1 * 236 = 1129 Чтобы расшифровать сообщение, полученное значение умножается на мультипликативное обратное r по модулю q. 1129 * 442 mod 881 = 372 После этого 372 раскладывается следующим образом. Сначала выбирается наибольший элемент из w, который меньше чем 372, и вычисляется их разность. Далее - следующий наибольший элемент, который меньше, чем полученная разность, и повторяются эти действия, пока разность не станет равной нулю. 372 - 354 = 18 18 - 11 = 7 7-7=0 Элементы, которые были выбраны из w , будут соответствовать 1 в двоичной записи исходного текста. 01100001 13 Список используемой литературы. 1. Плотников В.Н., Зверев В.Ю. Принятие решений в системах управления. — М.: Изд-во МГТУ, 1993. — Ч.1. Теория и проектирование алгоритмов принятия оперативных решений. 2. Шнайер Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си — М.: Триумф, 2002. 3. http://habrahabr.ru/post/93698/ 14