Обновить
215.1

Алгоритмы *

Все об алгоритмах

Сначала показывать
Порог рейтинга
Уровень сложности

Считаем комбинации мозаик при помощи APL

Время на прочтение6 мин
Количество просмотров1.5K
Это короткая статья о том, как я воспользовался APL для проверки своих комбинаторных вычислений.


Преамбула


Наш местный университет проводит еженедельные соревнования по математическим задачам, которые может решать любой. На прошлой неделе задача относилась к комбинаторике и звучала следующим образом:

«Есть сетка 3 на 3 из квадратов, образующая мозаику. Сколькими способами мы можем раскрасить эту мозаику, если у нас есть 3 цвета и соседние квадраты не могут быть одного цвета?»

Под «соседними» понимаются соседние по вертикали или горизонтали. Авторы задачи дали подсказку (если не хотите спойлеров, то сразу переходите к следующему разделу!):

Подсказка
«Пронумеруйте квадраты от 1 до 9, а затем поработайте с цветами чётных квадратов. Это позволит определить цвета нечётных квадратов».

Комбинаторика никогда не была моей сильной стороной, но я хотел решить эту задачу. Я сел и начал прикидывать решение.

Завершив вычисления, я решил быстренько проверить своё решение при помощи APL — очень милого языка программирования, который я изучал в течение последних двух лет.

Это статья о том, как я за 30 секунд проверил на APL своё решение задачи.

  1. Я начну с демонстрации моего ошибочного доказательства (в том виде, в котором я его записал);
  2. Затем я расскажу, что сделал на APL, чтобы проверить своё решение;
  3. Далее я покажу свою исходную ошибку, и наконец
  4. Я ещё немного поработаю с кодом на APL, чтобы сделать его чище.
Читать дальше →

Простая система ветровой эрозии на основе частиц

Время на прочтение15 мин
Количество просмотров3.4K

Полный исходный код этого проекта, а также объяснение того, как его использовать и читать, можно найти на Github [здесь]. Проект рендерится при помощи моего собственного [TinyEngine].

В прошлом году я много экспериментировал со способами реализации эрозии на основе частиц для генерации рельефов.

Я считаю, что эрозия на основе частиц обеспечивает хороший баланс между реализмом и простотой, давая интуитивные описания переноса массы и энергии при их движении. Следовательно, они могут воспроизводить геомофологическое явление при низкой сложности концепций/кода как хорошие приблизительные модели. Благодаря этому они более доступны для большинства пользователей, чем исследовательские модели.

Один из самых хорошо известных и производительных алгоритмов улучшения генерации рельефов на основе шума — это гидравлическая эрозия на основе частиц [перевод на Хабре]. Этот алгоритм чрезвычайно прост и обеспечивает отличные результаты относительно малыми усилиями.

Его результаты убедили меня дополнить эту систему потоками воды и водоёмами, что привело к созданию процедурной гидрологической системы [перевод на Хабре]. Используя упрощённую модель, система успешно передаёт многие эффекты реального мира, поэтому я заинтересовался в дальнейшем исследовании симуляции геоморфологии на основе частиц.

Вскоре я осознал, что внеся только незначительные изменения, эти системы можно дополнить ветровой эрозией и основными эоловыми процессами. Так как в ненаучной литературе мне не удалось найти хороших ресурсов о реализации ветровой эрозии на карте высот, я решил спроектировать и реализовать собственную модель ветровой эрозии на основе частиц для процедурного рельефа.

Получившаяся система хорошо работает, позволяя моделировать движущиеся осадочные породы, а также сплошные неподвижные препятствия. Она воссоздаёт многие эффекты, наблюдаемые при реальной ветровой эрозии, например, серповидные дюны!
Читать дальше →

SQL HowTo: делаем из мухи слона (алгоритм Ли)

Время на прочтение4 мин
Количество просмотров7.3K

Правила игры очень просты: надо построить цепочку слов от начального (МУХА) до конечного (СЛОН), на каждом шаге меняя только одну букву. При этом могут использоваться только русские 4-буквенные нарицательные существительные в начальной форме: например, слова БАЗА, НОЧЬ, САНИ допускаются, а слова ЛИТЬ, ХОТЯ, РУКУ, НОЧИ, САНЯ, ОСЛО, АБВГ, ФЦНМ — нет.

Эта игра под названием «Дублеты» приобрела известность благодаря Льюису Кэрроллу — не только автору книг про Алису, но ещё и замечательному математику. В марте 1879 года он начал раз в неделю публиковать в журнале «Ярмарка тщеславия» по три задания в форме броских фраз: «Turn POOR into RICH» — «Преврати бедного в богатого», «Evolve MAN from APE» — «Выведи человека из обезьяны», «Make TEA HOT» — «Сделай чай горячим». В том же году он выпустил брошюру «Дублеты», подробно описал в ней правила и предложил читателям попрактиковаться на нескольких десятках примеров.

Александр Пиперски, "Из мухи — слона", «Квантик» №2, 2019 и №3, 2019

Сегодня мы научимся реализовывать на SQL волновой алгоритм, решив заодно классический пример из этой игры для конкретного словаря.

Читать далее

Первый truly stateless оптимальный алгоритм модел-чекера и его проверка на Coq

Время на прочтение12 мин
Количество просмотров3.8K

Надоели нестабильные баги в многопоточном коде? Попробуй воспользоваться модел-чекерами! Ведь больше не надо бояться неверифицированных модел-чекеров,  работающих либо за экспоненциальное время, либо неоптимально. Все это в прошлом: в Max Planck Institute for Software Systems разработали новый алгоритм под названием TruSt, который решает эти проблемы и, кроме того, верифицирован на Coq.

Меня зовут Владимир Гладштейн. Этим летом я проходил стажировку в MPI-SWS в группе, которая придумала алгоритм нового модел-чекера для поиска багов в многопоточных программах. Этот алгоритм является оптимальным и truly stateless (вследствие чего работает с линейными затратами по памяти). В этом посте я расскажу, как работают модел-чекеры, в каких случаях их можно использовать, и что за алгоритм придумали мои коллеги. А еще как я проверял доказательства его корректности на Coq.

Читать далее

Синтетические постеры для кино: как обрезать логотип телеканала, хардсабы и чёрные грани

Время на прочтение5 мин
Количество просмотров5.4K

На IVI пользователи выбирают кино для просмотра, ориентируясь в первую очередь на постер и название фильма. Обычно правообладатель предоставляет один постер для каждого фильма и сериала, но бывают ситуации, когда могут понадобиться дополнительные/альтернативные изображения. Их создание — трудоемкая задача, потому что с помощью этих изображений нужно передать содержимое контента. Чтобы упростить её, мы прибегаем к генерации синтетических постеров. В этой статье я немного приоткрою занавес и расскажу о том, как мы удаляем визуальный мусор в процессе создания постеров.

Читать далее

Вариационные автоэнкодеры для системы рекомендаций

Время на прочтение5 мин
Количество просмотров4.7K

В данной статье представлена модель вариационного автоэнкодера, а именно Standard-VAE в контексте рекомендательных систем. Это невероятно интересный подход, хотя его математика может заставить выпить не одну чашку кофе, чтоб ее поняли.

Тут мы концентрируемся на математике и не рассматриваем практическую реализацию, так как она есть в некоторых библиотеках машинного обучения, куда и можно обратиться за кодом.

Узнать больше

Восстанавливаем результаты выборов в Государственную думу 2021 года с помощью машинного обучения

Время на прочтение9 мин
Количество просмотров26K

Результаты выборов в государственную думу, которые проходили 17-19 сентября 2021 вызывают сомнения у многих экспертов. Независимый электоральный аналитик Сергей Шпилькин оценил количество голосов, вброшенных за партию власти, примерно в  14 миллионов. В данной работе применены методы машинного обучения для того, чтобы выявить избирательные участки, на которых подсчет голосов происходил без нарушений и установить истинный результат на тех участках, где , предположительно, были зарегистрированы ошибочные данные.

Полученные в ходе исследования данные визуализируются с помощью графиков и карт.

Читать далее

Простой цифровой радиоприемник на базе контроллера STM32G4 своими руками

Время на прочтение44 мин
Количество просмотров43K

Обучающие проекты по созданию простого цифрового радиоприемника на базе микроконтроллера STM32G431KB.

Читать далее

Сколько ты стоишь? Метод анализа вакансий с HR-агрегаторов

Время на прочтение8 мин
Количество просмотров11K

Конечно, когда мы решаемся сменить работу, мы исходим из своих личных побуждений и мотиваций; и очевидно, что увеличение своего материального положения — не последняя из причин. Но при ответе себе лично на вопрос «сколько я хочу получать» обычно оперируем своим собственным потреблением. Но случалось ли вам слышать именно на собеседовании такой вопрос: «А почему Вы хотите получать именно столько?» Мне случалось пару раз, и, признаюсь, в те разы терялся что ответить. Некоторые размышления меня натолкнули, что лучший ответ будет: «Столько предлагает рынок».

Читать далее

Фильтрация шума сигнала

Время на прочтение7 мин
Количество просмотров57K

Фильтрация шума очень важная вещ, при работе с различными датчиками. Сигнал, получаемый от них всегда приходит с шумами, и важно уметь их грамотно отфильтровать. Качественная фильтрация шума способна уменьшить погрешность и увеличить качество измерения датчика. Этим мы сегодня и займемся.

Читать далее

Нейросеть, способная объяснить себе задачу: P-tuning для YaLM

Время на прочтение9 мин
Количество просмотров21K

Мы уже рассказывали о том, как применили семейство генеративных нейросетей YaLM для подготовки ответов в Поиске, Алисе или даже в Балабобе. Главная особенность наших моделей — метод few-shot learning, который позволяет без дополнительного обучения решать большинство задач в области обработки естественного языка. Достаточно лишь подготовить подводку на человеческом языке — и модель сгенерирует текст. Но что, если это не самый оптимальный путь?

Сегодня я расскажу читателям Хабра про апгрейд этого метода под названием P-tuning. Вы узнаете про недостатки оригинального метода few-shot и преимущества нового подхода. Покажу, где он уже применяется на примере покемонов. Добро пожаловать под кат.
Читать дальше →

Алгоритм генерации тайловых карт Model Synthesis

Время на прочтение7 мин
Количество просмотров5.2K
image

Я много писал об алгоритме коллапса волновой функции (Wave Function Collapse). Этот алгоритм, разработанный Максимом Гуминым в 2016 году, генерирует тайловые карты и пиксельные текстуры на основании удовлетворения ограничениям с дополнительной рандомизацией [перевод на Хабре]. Но знали ли вы, что большинство основных идей для него взято из статьи, написанной больше десятка лет назад? Сегодня мы рассмотрим диссертацию 2007 года на степень PhD Пола Меррела Model Synthesis и некоторые из разработанных им расширений алгоритма, в частности, Modifying in Blocks.

Model Synthesis


Идея Model Synthesis очень похожа на WFC, по которому я написал целый туториал. Но в этой статье мы опишем идею с нуля.

Model Synthesis начинает с передачи примера тайловой карты, которая используется алгоритмом для того, чтобы учиться, какие тайлы могут располагаться друг рядом с другом при построении модели. Затем для выходного результата инициализируется пустая сетка ячеек. Каждая ячейка имеет список «потенциальных» тайлов, которые могут её заполнить.

Изначально допустим любой тайл. Основной цикл выбирает ячейку и выбирает для неё заданный тайл, помечая все остальные как недопустимые. Затем он распространяет последствия этого выбора при помощи алгоритма AC4, то есть помечает тайл как недопустимый для текущей ячейки, если все его валидные смежные ячейки уже недопустимы. После распространения цикл сбрасывается и мы выбираем другую ячейку, для которой нужно выбрать тайл.
Читать дальше →

Химия. Максимальный поток

Время на прочтение5 мин
Количество просмотров4.8K

Привет, Хабр! Недавно потратил кучу времени в попытках решить задачку, как оказалось, на максимальный поток. Алгоритм и реализация в ней оказались несложными, но связь между постановкой вопроса и использованием потоков, на мой взгляд, не очевидная, и я, потратив какое-то время в поисках каких-то объяснений или намеков на решение в гугле, смог найти только небольшую статейку с довольно куцым объяснением. Потому пишу данный пост, в надежде на то, что кому-нибудь он поможет.

Читать далее

Ближайшие события

Как создать легко воспроизводимый DS проект

Время на прочтение8 мин
Количество просмотров2.9K

Аналитику или исследователю данных приходится разрабатывать множество алгоритмов по обработке и анализу различных данных. Большинство алгоритмов разрабатываются для многоразового использования, а значит, код либо запускается разработчиком с определенной периодичностью, либо код передается другим пользователям для обработки своих данных. При этом алгоритмы имеют множество параметров и зависимостей, которые необходимо индивидуально настраивать под определенные данные.

Для того чтобы сделать процесс развертывания, использования и доработки алгоритма интуитивно понятным воспользуемся инструментом Kedro. Основная концепция kedro заключается в модульной структуре, где весь цикл работы с данными формируется из отдельных блоков в единый рабочий процесс. Проект на kedro имеет следующую структуру:

Читать далее

Обратная сторона хакатона

Время на прочтение5 мин
Количество просмотров2.8K

Два года назад мы провели масштабное мероприятие – Rosneft Seismic Challenge 2019 – соревнование по машинному обучению, где нужно было найти границы между различными геологическими слоями (фациями) по данным сейсморазведки. В рамках соревнования мы получили хорошие результаты по метрике качества Dice. Но оказалось, что внедрить решения победителя в прод совсем не так просто, как кажется на первый взгляд. Об этом поподробнее ниже.

 

Читать далее

Как Windows 11 уменьшила размер кумулятивных обновлений на 40%

Время на прочтение5 мин
Количество просмотров17K


Раз в месяц Microsoft выпускает кумулятивное обновление Windows, которое включают в себя все предыдущие. То есть для приведения системы в актуальное состояние требуется установка единственного апдейта.

Учитывая огромное количество исправлений в Windows, кумулятивное обновление без оптимизации может сильно вырасти в размере, что неприемлемо. Например, его не смогут скачать пользователи с медленным подключением к интернету, а только в США таких 20%. Поэтому уменьшение размера обновлений — приоритетная задача. Теперь для неё нашлось решение.

Если вкратце, то раньше каждое обновление включало в себя прямую дельту изменений системы, а также обратную дельту для приведения системы к базовой RTM, чтобы установить новую прямую дельту через месяц. Однако выяснилось, что обратную дельту можно вычислить в процессе установки обновления. Теперь Microsoft намерена запатентовать этот алгоритм.
Читать дальше →

Паутина для чайников: алгоритм строительства паучьих сетей

Время на прочтение17 мин
Количество просмотров10K


К паукам можно относиться как угодно: их можно бояться, недолюбливать или держать в качестве питомцев. Но любой, от арахнофоба до арахнолога, согласится с тем, что они мастера по строительству своих сетей. Научное сообщество уже очень давно и с большим интересом наблюдает за членистоногими прядильщиками, но полностью раскрыть все их секреты пока еще не удалось. И вот ученые из университета Джонса Хопкинса (США) решили детально рассмотреть и описать процесс строительства паутины, используя при этом искусственный интеллект и приборы ночного видения. Выяснилось, что разные виды пауков подчиняются общим правилам в ходе создания своих сетей. Следовательно, наблюдение за движениями лапок может предсказать, что именно будет строить паук. На какие стадии можно разделить строительство паутины, как пауки ведут себя во время каждой из них, и как эти данные могут помочь в понимании нас самих? Ответы на эти вопросы мы найдем в докладе ученых. Поехали.
Читать дальше →

Решаем логистическую задачу: алгоритм привязки фактической и плановой стоянок автомобилей

Время на прочтение5 мин
Количество просмотров2K

Привет жителям Хабра! Меня зовут Андрей, я разработчик облачного сервиса по планированию маршрутов Муравьиная логистика. В этой статье я хочу поделиться опытом использования алгоритма, который может пригодиться любой компании, выполняющей анализ данных доставки.

Отмечу, что первоначальное и основное предназначение Муравьиной логистики – это формирование маршрутов по заданным пользователем параметрам. За 9 лет работы сервиса появилось множество дополнительных возможностей, в том числе построение фактического маршрута движения автомобиля на основании данных GPS-трекера. Но нашим клиентам было недостаточно просто видеть на карте траекторию движения автомобиля. Сервис должен предоставить в удобном формате уже проанализированные данные - каждой плановой точке маршрута автомобиля необходимо присвоить соответствующую фактическую стоянку.

Читать далее

Открытый проект файловой системы для внутренней памяти STM32H

Время на прочтение8 мин
Количество просмотров9.3K

Зачем ставить внешнюю IC памяти или SD карту если в микроконтроллере осталось много свободной Flash памяти! 

Микроконтроллеры семейства STM32H снабжены двумя независимыми банками Flash памяти и это очень удобно. В одном банке можно расположить программный код, а в другом временные перезаписываемые данные.  

Как сделать из внутренней Flash подобие EEPROM сравнительно неплохо написано в этом апноуте от ST. Но с некоторого уровня комплексности встроенного ПО хранить данные в именованных файлах удобнее чем в жёстких структурах. Файлы упрощают реюзинг, облегчают поддержку преемственности версий, апгрейды и даунгрейды. Файлы освобождают от хлопот с планированием размещения во флэш и разруливанием конфликтов размещения, особенно если приложение модульное и модули разрабатываются отдельно. 

Читать далее

Уроки абстракции: чему FP может научить ООП

Время на прочтение14 мин
Количество просмотров12K

Одним из наиболее распространенных «лучших практик» в программировании является принцип DRY: не повторяйся. Для реализации этого принципа можно использовать множество методов: инкапсуляция, параметризация, инверсия управления и многое другое. Одним из этих методов является абстракция, и одно из основных различий между функциональным программированием (FP) и объектно-ориентированным программированием (ООП) заключается в способе применения абстракции. Обычной практикой в ООП является ограничение абстракции до строгого полезного минимума для рассматриваемой проблемы. В ООП преждевременное абстрагирование часто считается ошибкой, как и преждевременная оптимизация.

В FP, с другой стороны, абстракция, как правило, продвигается настолько далеко, насколько это возможно. Каждая проблема разбита на серию простейших возможных функций, которые затем комбинируются для построения решения проблемы. Выявление этих абстракций обычно является наиболее важной частью решения проблемы. Фактически, программисты FP часто тратят больше времени на то, чтобы найти, какую проблему им следует решить, чем на их решение. И, конечно же, обычно кажется, что эти функции одинаковы от одной проблемы к другой. Только способ их комбинирования отличается. Это причина, по которой абстракция является одним из наиболее ценных методов, используемых программистами FP.

В этой статье мы сравним, как ООП и ФП будут обрабатывать абстракцию в конкретной простой задаче: вычислении суммы целых чисел от 1 до произвольного значения n. Проблема настолько проста для решения с помощью императивного программирования, что кажется, что в этом нет ничего интересного. Вот как это можно сделать в Java:

Читать далее

Вклад авторов