Обновить
213.78

Алгоритмы *

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

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

Процедурная генерация бумажных снежинок

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

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

Читать далее

Почему Go To Considered Harmful?

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

Некоторое время назад мне понадобилось процитировать известное письмо Дейкстры 1968 года, и я воспользовался случаем, чтобы таки внимательно прочитать его. В наши дни "споры о `goto`" уже неактуальны, поскольку в большинстве современных языков команды `goto` либо нет вообще, либо используется она редко, и стало быть, обсуждать особо нечего. Однако мне была интересна аргументация. В нашей области масса "фольклорного знания", которое на поверку не всегда оказывается точным (что хорошо показано в книге Боссавита), так что оценить логику Дейкстры с позиции сегодняшнего дня не помешает. Надо сказать, что его формулировки не всегда легко понять, поэтому я решил изложить их несколько более простым языком, потратив немного больше места.

Читать далее

Как компьютеры рисуют странные формы: метаболы, marching squares, электрические поля

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

Пару месяцев назад я наткнулся на очень красивые анимации. В основе этих анимаций лежат несколько простых окружностей, но выделяет их то, насколько органично они сливаются друг с другом. Мне стало любопытно, как это работает, и моё исследование оказалось гораздо интереснее, чем я ожидал. Выяснилось, что соединяющиеся друг с другом круглые объекты называются метаболами (metaballs) и с ними связано множество математических и вычислительных понятий. Если вы в чём-то похожи на меня, то посмотрев на эти анимации, вы бы сразу задались вопросом, как подойти к решению такой задачи. Допустим, нам поручили разобраться с тем, как генерировать метаболы. Как сформулировать эту задачу? Что означает возможность органичного слияния окружностей? Как компьютер рендерит нечто подобное на экране? Всё это очень сложные вопросы.

В этой статье мы совершим путешествие и узнаем, как люди решают эту задачу. Базовый алгоритм, играющий неотъемлемую роль в генерации таких анимаций, называется marching squares. Он используется во многих сферах графики, а также медицинской визуализации. Но каким бы полезным ни был алгоритм, самым важным в нашем путешествии будет то, насколько изящен этот подход при решении подобной задачи. Есть истинная красота в том, что мы берём расплывчатую задачу и преобразуем её в конкретный решаемый вид. Главная цель этой статьи — дать вам ощущение радости при исследовании смены точек зрения, превращающих подобные сложные задачи в решаемые.
Читать дальше →

Теория графов в криптографии. Обзор основных подходов

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

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

Читать далее

Конкордантность смысла

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

В [1, 2, 3] тексты (знаковые последовательности с повторами) с помощью матричных единиц, как образов слов, превращались (координатизировались) в алгебраические системы. Координатизация — необходимое условие алгебраизации любой предметной области...

Читать далее

Знакомство с трансформерами. Часть 1

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

Трансформеры (transformers) — это очень интересное семейство архитектур машинного обучения. Существует много хороших учебных материалов по этой теме (например — вот и вот), но в последние несколько лет трансформеры, в основном, становились всё проще. Поэтому сейчас гораздо легче, чем раньше, объяснить принципы их работы. Этот материал представляет собой попытку, что называется, «на пальцах», объяснить то, как работают современные трансформеры.

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

Для того чтобы понять примеры кода, понадобятся практические знания фреймворка PyTorch. Но эти примеры можно и пропустить без вреда для понимания остального материала.

Здесь можно найти видеолекции о трансформерах. А в этом репозитории имеется реализация простого трансформера с использованием PyTorch.

Читать далее

Обзор архитектуры AlphaFold 2

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

В данном обзоре мы подробно рассмотрим нейронную сеть AlphaFold 2 от компании DeepMind, с помощью которой недавно был совершен прорыв в одной из важных задач биологии и медицины: определении трехмерной структуры белка по его аминокислотной последовательности.

В первых трех разделах обзора описывается задача, формат входных данных и общая архитектура AlphaFold 2. Далее, начиная с раздела «Input feature embeddings», описываются детали архитектуры. В разделе «Резюме» кратко суммируется основная информация из обзора.

Читать далее

Цифровой водяной знак на основе дискретного Wavelet-преобразования

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

Цифровой водяной знак на основе дискретного Wavelet-преобразовании.

Читать далее

Разработка архитектуры системы управления поведением объекта: основа

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

Исследование направленно на изучение вопроса построения архитектуры системы управления поведением объекта, как замены концептуального представления – «цифровой» двойник, часть полученных результатов разработок, изложенных в статье, показывают основные методы и подход системы

При зарождении, появлении концепции «цифрового» двойника, сформировалось несколько позиций, старающихся выразить концептуальное представление виртуального прототипа – «цифрового» двойника, существующего объекта. Промышленность начало рассматривать «цифровой» двойник как разновидность систем и сред: a) PLM – управление жизненным циклом изделия, под жизненным циклом в настоящей, принятой и распространённой на предприятиях, системе понимается процесс производства изделия, максимум передаются/получается данные применяемые в I) маркетинге, за частую не адресном или не объективном; II) сервисном (прим.: не в полной мере), хаотичном обслуживании выпущенных изделий, применяемых человеком или машиной (прим.: системой); b) PLM+ERP+датчики, представляемая система, при практическом построении, когда концепция начинает приобретать проектную архитектуру с набором методов, показывает такие же I и II проблемы, но в дополнении к этому появляется «слепая зона» в восприятии реальности, активней, сильнее влияющая чем первые (прим.: III).

Приведённые разновидности, рассматриваемые как организация и реализация «цифрового» двойника в существующей реалии, содержат набор проблем. Представленные выше в качестве нескольких примеров (прим.: I, II, III), должны учитываться в исследованиях, разработках, а также практических опытах при создании решений, перехода от концепции к проектной архитектуре – системе управления поведением объекта.

Читать далее

Что нужно программисту?

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

Прочитал статью «Математика для программиста». Удивительно, что в ней куча букв, но нет внятного смысла. Я решил исправить этот фатальный недостаток.


Читать дальше →

Python: самое короткое решение 41 задачи из проекта Эйлера

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

Сегодня мы решим 41-ю задачу из Проекта Эйлера в 6 строк кода. Сделаем это сначала в развёрнутом виде, а потом максимально сократим решение.

Читать далее

Воссоздаем Minecraft-подобную генерацию мира на Python

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

Minecraft, самая продаваемая игра в мире, наиболее известная своими пикселизированными блоками и бесконечными мирами, содержит потрясающий процедурный генератор ландшафта — с пещерами, водоёмами, и даже различными биомами.

Процедурная генерация является важной частью компьютерной графики — она используется в основном в играх и в фильмах. Она помогает создавать случайные структуры, не вызывающие ощущения «машинного» стиля.

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

В детстве мне нравилось играть в Minecraft, и мне всегда было интересно, как эта игра генерирует бесконечные миры. В данной я статье я попытаюсь воссоздать это на Python.

Прим. переводчика. Осторожно, в статье много иллюстраций (в том числе анимированных)

Читать далее

Advent of Code с нами уже 7 лет

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

Приближается декабрь, а значит и ежегодный праздник программирования - Advent Of Code. Для тех кто устал перекладывать JSON-ы и шлепать формы.

Читать далее

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

Карма, основанная на кластерах

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

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

Читать далее

Обращение к Javascript-сообществу: перестаньте писать квадраты

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

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

Read more

Видеодетектор огня

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

Введение - А зачем это нужно?

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

В ряде случаев распознавание огня по камере может происходить в разы быстрее, чем при использовании штатных систем на основе пожарных извещателей, да и количество камер на объектах сейчас такое, что они смотрят практически в каждый уголок)

Читать далее

SQL HowTo: генерируем лабиринты (алгоритм Прима и геометрические типы)

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

SQL является мощным инструментом для обработки множеств, а функционал PostgreSQL позволяет делать многие вещи еще проще, поэтому идеально подходит для реализации некоторых алгоритмов на графах.

Причем работа с графами - это не просто разминка для ума, а вполне себе прикладная задача. Например, в прошлой статье мы сделали "из мухи - слона" волновым алгоритмом Ли, аналогичным используемому у нас в СБИС при расчете себестоимости в многокомпонентных актах выпуска.

А сегодня мы научимся генерации случайных лабиринтов алгоритмом Прима с использованием геометрических типов данных.

Читать далее

Простое объяснение симуляции жидкости в реальном времени

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

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

Код проекта можно найти на моём Github.


Ресурсы, посвящённые симуляции жидкостей, могут быть очень пугающими. Помню, что когда я впервые прочитал статью о ней и увидел уравнения Навье-Стокса, то был в ужасе. Со временем я понял, что сама тема совершенно не сложна. На самом деле, если бы вам дали задачу написать собственный симулятор жидкостей, то вы, вероятно, написали бы что-то подобное на основании интуитивного понимания работы жидкостей. Если, посмотрев на уравнения Навье-Стокса, вы подумали «ага, понятно», то вы, возможно, быстрее бы реализовали симуляцию жидкости, прочитав работы, перечисленные в конце этой статьи. Я же попытаюсь не использовать сжатое выражение и объяснять всё как можно медленнее.
Читать дальше →

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

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


Преамбула


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

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

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

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

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

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

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

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

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