
В обсуждении проекта «большого глупого носителя» OTRAG, состоящего из пакета простых ракет, неоднократно поднимался вопрос надёжности такого количества двигателей. Вспоминалась печальная история советской сверхтяжёлой ракеты Н-1, у которой на первой ступени стояло 30 двигателей, и которая ни разу за четыре полёта не долетела до конца её работы. В комментарии рассказать про теорию вероятностей и расчёт надёжности места нет, поэтому предлагаю вашему вниманию занимательный рассказ о количестве двигателей, надёжности, комбинаторике и теории вероятностей.
Читать полностью »
Рубрика «комбинаторика» - 4
Занимательная теория вероятностей или сколько нужно двигателей?
2015-03-16 в 3:02, admin, рубрики: комбинаторика, космонавтика, Научно-популярное, теория вероятностей, теория надежностиКомбинаторные алгоритмы: индекс сочетания, индекс разбиения на подмножества
2015-01-13 в 19:16, admin, рубрики: Алгоритмы, индекс разбиения на подмножества, индекс сочетания, комбинаторика, комбинаторные алгоритмы, ПрограммированиеКороткое предисловие
Комбинаторные алгоритмы применяются достаточно часто. В интернете можно найти много информации касательно комбинаторных алгоритмов. Однако русскоязычный интернет, в основном, выдает простейшие задачи сплошного перебора (генерации) комбинаторных объектов в цикле. Например:
// Сочетания по 3 из 52
for (int i1 = 0; i1 < 50; ++i1)
for (int i2 = i1+1; i2 < 51; ++i2)
for (int i3 = i2+1; i3 < 52; ++i3)
// ...
Индекс сочетания
Каждому сочетанию, перестановке, размещению и другим комбинаторным объектам можно сопоставить индекс — это номер, в котором он появляется при переборе данным алгоритмом.
Здесь мы рассмотрим более сложную задачу, решения которой в рунете я не нашел (впрочем, приведу одну ссылку, но та формула явно неверная) — исходя из самого сочетания (в данном случае набора трех чисел) найти его индекс.
Читать полностью »
Это правильно, но неверно
2014-12-29 в 3:58, admin, рубрики: бесконечности не бывает, гармонический ряд, для плоскости семь, инфляция, комбинаторика, математика, неполный перебор, онлайнер живи, плохое собеседование, постоянная Эйлера, пятьдесят на пятьдесят, рубль держись, ряды всюду, с наступающим, скидки, скоро весна, суммирование рядов, теория вероятностей, тэги не читают, Учебный процесс в IT, центр тяжести, четыре мало Специалисты заслуженно не любят задачи и головоломки на собеседованиях. Но мы просто любим порешать такие задачи в свое удовольствие. Вот что мне лично не нравиться, так это когда ты получаешь правильный ответ, но при этом твое решение кажется автору неверным. Хочу просто показать решение нескольких популярных подобных задач, которые можно получить в уме и без сложных расчетов и сопоставить их с авторскими верными.
Читать полностью »
Выразительная простота python на примере задач из комбинаторики
2014-08-08 в 20:16, admin, рубрики: python, Алгоритмы, комбинаторика В процессе самообучения языку программирования python(имея знания с/с++) решил написать в качестве задания функции генерирующие элементы из различных множеств комбинаторных конфигураций. Конечно, можно справедливо заметить, что подобный функционал уже есть в стандартной библиотеке python в модуле itertools, но у каждого должно быть право изобрести велосипед, тем более в целях обучения…
Тот кто знаком с основами теории вероятностей должны помнить, что такое урновые схемы и о чем эта таблица:
Читать полностью »
Один алгоритм комбинаторной генерации
2014-06-16 в 7:06, admin, рубрики: Алгоритмы, Блог компании СПБАУ, комбинаторика, математика, метки: комбинаторикаКомбинаторика в старших классах школы, как правило, ограничивается текстовыми задачами, в которых нужно применить одну из трёх известных формул — для числа сочетаний, перестановок или размещений. В институтских курсах по дискретной математике рассказывают и о более сложных комбинаторных объектах — скобочных последовательностях, деревьях, графах… При этом, как правило, ставят задачу вычислить количество объектов данного типа для некоторого параметра n, например количество деревьев на n вершинах. Узнав количество объектов для фиксированного n, можно задаться и более сложным вопросом: как все эти объекты за разумное время предъявить? Алгоритмы, решающие подобного рода задачи, называются алгоритмами комбинаторной генерации. Таким алгоритмам, например, посвящена первая глава четвёртого тома «Искусства Программирования» Дональда Кнута. Кнут очень подробно рассматривает алгоритмы генерации всех кортежей, разбиений числа, деревьев и других структур. Придумать какой-нибудь алгоритм, работающий умеренно быстро, для каждой из этих задач несложно, но с дальнейшей оптимизацией могут возникнуть серьёзные проблемы.
В процессе написания магистерской диссертации, защищённой в Академическом Университете, мне потребовалось изучить и применить один из алгоритмов комбинаторной генерации, подходящий для особого класса задач. Это генерация структур, на которых дополнительно введено некоторое отношение эквивалентности. Чтобы было понятно, о чём идёт речь, я приведу простой пример. Давайте попробуем сгенерировать все триангуляции шестиугольника. Получится что-нибудь такое:

Написать алгоритм, который вернёт все такие триангуляции, довольно несложно. Например, сгодится такая процедура: фиксируем какое-нибудь ребро (пусть это будет ребро 1-6), после чего в цикле перебираем вершины, не являющиеся его концами. На текущей вершине и фиксированном ребре строим треугольник, а оставшиеся после этого две области триангулируем рекурсивно. Если присмотреться к получающимся в результате работы этого алгоритма триангуляциям, то можно заметить, что многие из них почти одинаковы и отличаются лишь тем, как расставлены пометки (номера) вершин. Поэтому, полезно было бы придумать алгоритм, который будет генерировать так называемые непомеченные триангуляции — те, что изображены на следующем рисунке:

Алгоритм построения покрывающих наборов
2014-01-20 в 18:45, admin, рубрики: Алгоритмы, комбинаторика, математика, парадокс, собеседование, теория вероятностей, тестирование, метки: Алгоритмы, дискретная математика, тестированиеОткровенно говоря, ранее я ни разу не занимался в серьезной мере методами тестирования программного обеспечения. Однако, понимаю, что для полной уверенности в том, что программа будет работать, нужно перепробовать всевозможные варианты её использования. Также очевиден для меня и тот факт, что сделать это не всегда возможно. Если имеются конкретные варианты использования, но невозможно проверить их всех в силу их количества, стараются построить набор, который покроет все самые используемые варианты. Но что делать, если использование всех вариантов равновероятно? Как за минимальное число времени обнаружить все ошибки, на которые есть большая вероятность наткнуться? Данная задача действительно известна, и с ней нередко сталкиваются, ну хотя бы, в Яндексе.
Чтобы стало понятно о чем идет речь, представим, что нам необходимо протестировать какую-либо программу или сайт. Очень хорош пример с тестированием веб-формы, скажем для регистрации или для поиска. Возникает вопрос, с какими ошибками в ней скорее всего встретится пользователь? Пускай у нас в форме имеется 6 вопросов, для каждого из которых возможны 10 вариантов ответа. Допустим, на страницу зашел целый миллион пользователей, и каждый из них ответил уникально. Теперь представим, что в форме для заполнения ответами скрывается ошибка. Если ошибка обнаруживается только при определенной комбинации ответов на все 6 вопросов, то на неё наткнется лишь один человек. Если же ошибка вылетает при наборе определенных ответов на какие-то 3 вопроса, то количество людей, обнаруживших ошибку возрастет до тысячи. Очевидно, что чем меньше элементов в комбинации, требуемой для ошибки, тем больше людей с ней встретится. Соответственно, перед нами теперь стоит задача: если мы не можем обнаружить все ошибки, то давайте хотя бы найдем самые критичные, то есть те, на которые наткнется больше всего пользователей.
Таким образом мы должны сформировать тест-кейсы (и чем меньше, тем лучше), при переборе которых мы наткнемся на самые легкодоступные ошибки. Допустим, у нас имеется множество вопросов A, которое мы задаем количеством вариантов ответа на каждый из них: А = {2, 3, 5, 2, ...}. Пусть n — количество вопросов, а 1≤m≤n — степень критичности ошибок, она же степень покрытия или глубина покрывающего набора. Чем меньше значение m, тем критичнее ошибка. Задавая степень покрытия мы строим тестовый набор, который позволит обнаружить все ошибки, степень критичности которых меньше данного m. Если m = n, то поиск ошибок сводится к перебору всех вариантов. Чем меньше задаем степень, тем меньше тест-кейсов будет сформировано и тем меньше ошибок мы найдем.
Читать полностью »
Производящие функции — туда и обратно
2013-11-30 в 20:00, admin, рубрики: Алгоритмы, комбинаторика, математика, числа фибоначчи, метки: Алгоритмы, комбинаторика, математика, числа фибоначчи «Производящая функция является устройством, отчасти напоминающим мешок. Вместо того чтобы нести отдельно много предметов, что могло бы оказаться затруднительным, мы собираем их вместе, и тогда нам нужно нести лишь один предмет — мешок».
Д. Пойа
Введение
Математика делится на два мира — дискретный и непрерывный. В реальном мире есть место и для того и для другого, и часто к изучению одного явления можно подойти с разных сторон. В этой статье мы рассмотрим метод решения задач с помощью производящих функций — мостика ведущего из дискретного мира в непрерывный, и наоборот.
Идея производящих функций достаточно проста: сопоставим некоторой последовательности <g0, g1, g2, ..., gn> — дискретному объекту, степенной ряд g0 + g1z + g2z2 +… + gnzn +… — объект непрерывный, тем самым мы подключаем к решению задачи целый арсенал средств математического анализа, который как мы все знаем очень большой.
Вышесказанное можно записать с помощью математических формул следующим образом: <g0, g1, g2, ..., gn> <=> g0 + g1z + g2z2 +… + gnzn +…. Обычно говорят, последовательность генерируется, порождается производящей функцией. Важно понимать, что это символьная конструкция, то есть вместо символа z может быть любой объект, для которого определены операции сложения и умножения.
Читать полностью »
Генерация номеров счастливых билетов
2013-08-14 в 6:54, admin, рубрики: php, Алгоритмы, комбинаторика, Программирование, метки: PHP, Алгоритмы, комбинаторика, Программирование 
В рамках небольшого тестового задания потребовалось реализовать старую и известную задачу с поиском количества счастливых билетов (указанной пользователем разрядности номера). Как ни странно, при большом числе источников с математическим описанием алгоритма, реальных примеров реализации оптимизированного варианта (без перебора) оказалось немного, но всё же большой проблемы эта часть задания не составила.
Во второй же части потребовалось уже выводить сами номера, и вот тут быстрый поиск в сети ожидаемого результата не дал. Однако, задача решена, и хотелось бы поделиться реализаций с читателим ради получения критического мнения и распространения информации для тех, кому подобные или схожие алгоритмы могут понадобиться.
Читать полностью »
Женщина-математик, которая разрабатывает алгоритмы для лифтов
2013-07-23 в 11:09, admin, рубрики: Алгоритмы, головоломки, комбинаторика, математика, метки: lift, головоломки, комбинаторика 
55-летний американский математик Тереза Кристи (Theresa Christy) работает в компании Otis Elevator Co. и считается одним из лучших специалистов по вертикальному транспорту. Двадцать пять лет своей жизни она посвятила разработке и оптимизации алгоритмов для лифтов. Именно её привлекли во время недавней реконструкции Empire State Building стоимостью $550 млн. Тереза Кристи увеличила скорость лифтов на 20% до 6 м/c, так что они теперь проходят первые 80 этажей всего за 48 секунд.
Читать полностью »
Используем алгоритм размещений с повторениями для «расстрела» фотографий на Java
2013-06-20 в 14:43, admin, рубрики: java, Алгоритмы, комбинаторика, Песочница, метки: java, Алгоритмы, комбинаторика Порой программистам приходится сталкиваться с комбинаторикой для решения насущных задач. Мне на практике пришлось сделать «расстрел» фоторграфий. Нужно было сгенерировать все возможные размещения трех изображений пуль и наложить их поверх некой исходной картинки. Все сгенерированные изображения должны иметь прозрачный фон, иначе ничего хорошего из этого не получится. Привычным для меня языком программирования является Java, поэтому приведу пример того, как с помощью комбинаторики и Java написать небольшую программу, которая будет выполнять поставленную задачу.
Читать полностью »
