Задать вопрос
Ответы пользователя по тегу Алгоритмы
  • Как правильно смоделировать систему N колизий тел, прям абсолютно точно?

    @rPman
    Вместо итеративного алгоритма, можно подойти к расчету до пересечения кого либо, т.е. каждый объект имеет вектор движения и его коллайдер (в случае с простыми геометрическими фигурами типа сфера или квадрат с параллельными осям поверхностями это простое уравнение, в крайнем случае можно свести все к треугольникам или если 3d то тетраэдрам и строить объекты уже из них, ну а для оптимизации, не считать самостолкновения), получив точку, считаешь касательную к колайдеру и считаешь силы и правишь вектора скорости, а там уже по ситуации (нужно ли добавлять вращение, а то тогда уравнение пересечения будет сильно сложнее), тут же можно учитывать упругость столкновения.

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

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

    upd. если подумать, оптимизация не такая простая, но грубые оценки можно делать учитывая тоносительную скорость между текущим объектом и исследуемым, а так же его расстояние, т.е. чем быстрее и чем ближе объект находится тем выше в списке на проверку он должен быть (т.е. разница скоростей между текущим и исследуемым/расстояние между ними), к сожалению считать правильную скорость сближения 'дорого', нужно подумать, не получится ли хуже при такой оценке...

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

    ну и конечно классическое разбиение на ячейки, размер подбирать под предельные и средние значения скоростей, можно делить объекты на группы - быстрые и медленные, считать сначала быстрые, в ячейках на его пути и т.п.
    Ответ написан
    Комментировать
  • Есть ли алгоритмы АНТИ антиалиасинг?

    @rPman
    Открываешь тот же GIMP и начинаешь экспериментировать (прямо на своем примере)
    * Меню Цвет -> Порог
    задаешь минимальный и максимальные значение яркости, до тех пор, пока размытое изображение не станет желаемым (по факту при изменении будет утолщение или утоньшение букв, так как антиалиасинг делает плавное изменение яркости в зависимости от условного расстояния до середины линии)
    45/255
    67c201f8c943d817348494.png
    172/255
    67c2020148aae438116236.png
    248/255
    67c202080e314927836371.png

    Алгоритм примитивный - для выбранного канала RGB/HSI (или расчетное типа суммы или среднего или что душе угодно) задается пороговое значение, если значение попадает в него - выбираем цвет 1 иначе 0 (итоговое изображение монохромное)
    * Фильтры -> Улучшения -> Повысить резкость
    * Изображение -> Режим -> Индексированный
    'Создать оптимальную палитру' установить 2 цвета
    (по уму это то же самое что порог, но забитый в коде, значения не очень оптимальные но под твою задачу могут подойти, зависит от разрешения изображения)
    Ответ написан
    4 комментария
  • Как составить наиболее эффективный алгоритм групповой рассылки сообщений по каналам WebSocket?

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

    Такой подход позволит реализовать воркеров на нескольких нодах, мало того, можно сразу очереди по какому то правилу (хеш от id например, но это фиксирует количество нод, для смены придется весь кластер перезапускать) раскидывать между нодами, тогда и синхронизацией очередей между нодами не нужно заморачиваться.
    Ответ написан
    Комментировать
  • Какой алгоритм сравнения цен между крипто биржами?

    @rPman
    Для пространственного арбитража (выравнивание цен между биржами) тебе нужны только ask и bids, т.е. для этого тебе нужны только depth запросы.

    Но ни одна крупная биржа не позволит тебе делать достаточно оперативно делать запросы depth стаканов по всем валютным парам (там их сотни даже на мелких биржах), ограничивая количество запросов в секунду.

    Но есть потоковые api (в криптоэкономике его реализуют на основе websockets), когда бот подписывается на определенный класс событий (прописывая интересующий список валютных пар в т.ч.) и получает информацию сразу в тот момент, когда она появляется на бирже. К сожалению, в большинстве случаев depth при этом придется восстанавливать на основе периодических (не частых) запросов depth и вручную обновлять их у себя в памяти на основе информации о лимитных ордерах (а так же торговых событиях, потому что некоторые биржи не дублируют информацию об отмене лимитного ордера, если этот ордер был съеден торговой сделкой).

    Т.е. только так можно оперативно получать информацию о стаканах, и уже на основе ее делать поиск пересечений bids/asks с разных бирж.

    В довесок можно создавать виртуальные торговые пар (кросс-курсы), если к примеру на одной бирже они есть а на другой нет.

    Чтобы ускорить процесс, нужно делить его на две части - поиск торговой пары, для которой появилась возможность совершить арбитражную сделку, и вычисление объема, в пределах которого эта сделка может быть исполнена (речь идет о сделках по маркету, когда она совершается на весь объем одномоментно). Первое - достаточно при вычислении depth дополнительно хранить две цены buy и sell, по которой здесь и сейчас можно совершить сделку на минимальный объем сделки, определяемый лимитами биржи, соответственно сравнение проводить только этих чисел. При обнаружении пересечений - вести подсчет предельного объема уже на основе стаканов (если анализ проводить на каждое событие, получаемое по websocket, то алгоритм можно сократить до сравнения одного нового лимитного ордера со стаканами других бирж).

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

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

    p.p.s. Возможна комбинация подхода, после оценки динамики ликвидности валютной пары, на бирже удерживается пара лимитных buy/sell с такой ценой, чтобы ее исполнение могло бы позволить получить доход с арбитражной сделкой по маркету на другой бирже, с отслеживанием их частичного или полного исполнения с помощью websocket. в этом случае можно будет пытаться ловить резкие движения, когда рынок на столько резко меняется, что исполняет ордера по достаточно выгодным ценам...

    Естественно нужно быть готовым что вторая транзакция, закрывающая арбитражную сделку, может не успеть исполниться по маркету, и остаться лимитной, в т.ч. навсегда. Т.е. в алгоритме необходимо заложить откат сделки по невыгодной цене здесь и сейчас, только чтобы не удерживать количество валют вне равновесного объема.
    Ответ написан
    3 комментария
  • Как сузить диапазон генерации случайных чисел?

    @rPman
    Для каждого следующего числа проверять, не меньше ли оно предыдущего, и если меньше, то повторять попытку получения случайного числа

    Случайные числа на интервале на javascript получают с помощью Math.Random()*(максимальное число-минимальное) плюс минимальное. По ссылке пример с math.floor, округляющий число до целого, но осторожно, в этом случае максимальное число никогда не будет получено... возможно лучше тут использовать math.round
    Ответ написан
  • Стоит ли писать алгоритмы на PHP?

    @rPman
    Благодаря добавлению почти нормальных классов и некоторой типизации, php стал вполне неплохим языком программирования.

    С точки зрения изучения алгоритмов, этого более чем достаточно.

    Но! язык это не главное для разработчика, нужны еще доступные библиотеки и инструменты разработчика (ide, отладчик, профилировщик, помощник с рефакторингом и т.п.) вот тут у php не так заоблачно (но все еще хорошо, если речь идет о разработке приложений web backend или к примеру скриптов автоматизации).

    Канонически для изучения именно программирования с прицелом на работу, лучше выбирать что то из c++/java/python может c# (точнее весь .net) но с оговорками.

    c++ благодаря последним (десятилетие) стандартам стал на столько удобным и простым (особенно если не стрелять себе в ногу извращениями) при высокой скорости работы приложений, огромной базой инструментов, что его можно выбирать первым (но не главным) языком, особенно если не учить его углубленно... используя знания о нем как базис, другие языки изучать будет значительно проще. но GUI приложения писать на c++ грустно.

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

    java - учит строгости, даст полезную базу для изучения,.. кто то поставил бы его на первое место новичкам и не только... но после него 'опускаться' до c++ будет сложно, и больших скоростей как и у python от него не жди

    Не выбирай первым языком всякие javascript (они испортят тебя как программиста) или go/rust (от них можно получить разочарование при поиске работы).
    Ответ написан
  • Алгоритм построения многоугольника из исходного квадрата и пересекающих его линий?

    @rPman
    Так и не увидел в вопросах уточнений по алгоритму, поэтому потелепатствую, возможно уточнение возникнет тут:

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

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

    Проблема выбора доли многоугольника - вопрос уточнения задания.
    Ответ написан
    Комментировать
  • Как сделать распределение по процентам, чем дороже цена тем меньше шансов?

    @rPman
    Все зависит от того, будешь ли ты проводить такие розыгрыши часто или это однократная операция. А так же, готов ли ты к серии неудач для тебя (т.е. будет ли случайное число честным для участников розыгрыша).

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

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

    Поэтому большинство розыгрышей делают не честным (например игровые автоматы), с целью убрать серию убыточных для организатора выигрышей, например выставляя условие, если общая сумма выигрышей прошедших розыгрышей выше некоторого лимита, то дорогие выигрыши исключаются из следующего розыгрыша. Так же как частный случай, можно заранее провести розыгрыши некоторого количества призов и если их сумма не превышает лимита, сохранить их список или сохранить стартовый seed генератора случайных чисел, чтобы иметь гарантии. У второго подхода есть уязвимость, сотрудники компании, имеющие доступ к этим сохраненным результатам, могут их использовать для повышения своих шансов на выигрыш, фактически грабя остальных участников.
    Ответ написан
  • Как реализовать механизм выполнения ордеров на бирже?

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

    Есть 2 основных метода, зависит от того как именно будет вестись исполнение сделок.

    Первый, децентрализованный - вы не обслуживаете стакан (только как информационный сервис) и предлагаете участникам исполнение выбранных ордеров участников на нужный объем, выступая гарантом escrow и возможно местом хранения балансов (т.е. клиенты выбирают встречный ордер, называют свой объем и биржа на этот объем исполняет ордер), и не важно что там ордера пересекаются по цене (т.е. 'стакан' в виде буквы X) и скорее всего у вас будет свой аффинированный с биржей маркетмейкер, который на привилегированных условиях иметь приоритетное право блокировать ордера и брать их на исполнение. Т.е. это будет некий бот, который запускает на исполнение встречные заявки по пересекающимся ценам а разницу в суммах берет себе, грубый пример у вас есть ордера продажи 1 по $5.1 и покупки 1 по $5.0, очевидно что если оба этих ордера исполнятся то возникает избыток на балансе (грубо говоря вы сначала продаете 1 биткоин получив $5.1 а затем покупаете по $5.0, в остатке $0.1).

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

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

    Второй способ, централизованный - биржа сама обслуживает сделки, сама их исполняет, поэтому в момент размещения ордера она сама же проверяет наличие пересечений и забирает бонусную разницу с ордеров себе сразу, таким образом стакан похож на стакан V.

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

    Второй способ, очень просто в реализации. Пишется за несколько дней, я для прикола, изучая websocket ReactPHP, делал ядро биржи, которая на симуляциях доходила до 10к сделок в секунду, там зависело от количества лимитных ордеров, которые затрагивают сделки и почти линейно замедляло, полагаю на C++ можно было бы сделать на пару порядков быстрее. Но такой прямой способ обслуживания балансов в оперативной памяти очень опасен для продакшен, например нужно помнить о единичных сбоях в памяти.
    Ответ написан
    Комментировать
  • Как решить задачу, на оптимальную нагрузку курьера доставки?

    @rPman
    В течение дня с помощью 3 курьеров нужно развести 20 коробок по 20 адресам из 4 точек. Например в рамках Питера.
    Для начала тебе нужно построить граф путей, где вершины - это 20 целевых адресов и 4 исходные точки, а вектора - это оценка (в худшем) времени пути между ними, причем как от складов до адресов так и между адресами. Это тут самая сложная задача, так как исходные данные только карты, где непонятно сколько времени ехать, есть ли зависимость от времени суток и нагруженности курьера.

    Если ты курьерская компания уже не первый год на рынке, ты можешь себе позволить собрать статистику по тысячи курьеров (у тебя есть отметки где какой курьер куда приезжал) и составить такие графы для временных периодов 'не должно быть проблемой'.

    Ну а дальше комбинаторика, самый тупой метод поиска в глубину решит условно любую задачу, причем найдет оптимальное решение, но максимально неэффективным (с точки зрения затрат на решение) способом, у тебя всего 3 курьера и всего 20 точек, это ниочем.

    Есть конечно еще момент, оценка времени перемещения курьера в виде одного числа (например максимум) не является идеальным прогнозом, так как чем больше будет курьеров, тем больше будет простоев из-за того что реальное время перемещения быстрее чем оценка, правильно брать среднее и придерживать какой то процент курьеров про запас, чтобы не увеличивать время ожидания, когда все курьеры 'опаздывают' согласно средней оценки.

    Поиск в глубину в данном случае это симуляция перемещения курьеров по развозу товаров заданным порядком, каждый шаг - меняешь порядок нахождения на точке и вычисляешь затраты времени. Если выполнять одновременную симуляцию сразу всех комбинаций, делая это по одному шагу (например шаг по ребру) то выбор на каждом шаге выбирать нужно тот вариант, у которого суммарное время наименьшее, таким образом как только хотя бы один из вариантов закончит развозить коробки, он и будет искомым.
    Ответ написан
    Комментировать
  • Почему сортировка вставкой работает быстрее сортировки выбором в самом сложном случае?

    @rPman
    Возможно вступают особенности оптимизации выполнения на процессорах с маленьким размером массива (кеши, предсказание ветвления), например если массив int порядка 1000 элементов у меня тесты это и показывают insert быстрее или равный по скорости, а 10к..1000к уже заметно медленнее

    а тут и 1000 различия есть https://www.mycompiler.io/view/1CQUKga8um2
    Ответ написан
  • Как организовать массив состоящий из разных участков памяти?

    @rPman
    От задачи.
    Если тебе нужна скорость, то придется пожертвовать памятью и создать массив указателей на элементы (т.е. в твоем примере это массив указателей на элементы с индексом 2,3,6,7,8,10).

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

    Особенно грустно, если структура кусков и размер массива будет меняться. Первый подход сильно все упростит
    Ответ написан
    1 комментарий
  • Какой язык программирования выбрать для изучения основ работы с алгоритмами и структурами данных?

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

    Только в этой последовательности и не наоборот.

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

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

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

    Если же тебе это не нужно (а бывает не нужно), то и не заморачивайся
    Ответ написан
    Комментировать
  • Как правильно пропарсить лабиринт в граф?

    @rPman
    Лабиринт в форме - ячейка это либо стена либо проход (0/1)?

    Заводим класс - 'Вершина графа', ребра которого - его параметры ссылок на Смежные вершины, для каждой стороны вверх, вниз, налево и направо. Если нужно выявление замкнутых подмножеств, то добавляем параметр - номер подмножества (значение 0 - неизвестно)

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

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

    В результате когда пройдем по всем ячейкам матрицы, у нас будет готовый список графов, ячейки которого пронумерованы (ну не по порядку, будут пропуски номеров), понадобится еще проход, чтобы записать в список эти группы, и можно удалять временную матрицу вершин
    Ответ написан
    Комментировать
  • Алгоритм максимально равномерного распределения предметов?

    @rPman
    Сортируешь числа в списке предметов по возрастанию
    Алгоритм добавления количества Z следующий:
    * по очереди берешь равные по значению числа (пусть будет X, количество N) и следующий за ними не равный по значению (пусть будет Y), если такого нет то считаем это значение - бесконечным
    * вычисляешь разницу Y-X, вычисляем, сколько можно дололжить к ним от Z - считаем если (Y-X)*N меньше или равно Z значит заменяем N первых чисел на Y, а из Z вычитаем (Y-X)*N, если (Y-X)*N больше Z (в т.ч. если Y - бесконечность) значит к этим первым N числам из списка прибавляем Z/N (если не делится на цело, значит берем целую часть от Z а затем остаток по 1 докидываем вторым проходом, Z обнуляем, завершаем работу алгоритма
    * если Z не ноль, повторяем весь алгоритм
    Ответ написан
    Комментировать
  • Доказано ли, и можно ли сжать произвольные данные до 20 байтов к примеру?

    @rPman
    Объем seed для генерации универсальных данных будет больше или равен в среднем их размеру

    Отличный пример - внутри числа pi есть все последовательности данных которые в принципе могут существовать и даже есть формула которая выдает позицию, начиная с которых она есть - πfs.

    p.s. есть алгоритмы с потерей, например сжатие изображения и звука, вот тут поле не пахано да
    ну и вишенка на торте - нейронная сеть размером несколько килобайт на видеокадр позволяет сгенерировать весь видеоряд (не смог найти, на хабре была статья, понятно там качество ужасное, нейросеть не справлялась с лицами но сама идея шикарная)
    Ответ написан
    Комментировать
  • Алгоритмы для эффективной нагрузки на сервис со стороны клиента?

    @rPman
    Ответ на этот вопрос можно получить либо экспериментально либо изучив серверную реализацию (в конечном счете тоже экспериментально).

    У тебя 2 основных узких 'горла' - скорость подготовки ответа сервером (процессор и диск) и скорость сетевого соединения до него... ну а медленный клиент можно распараллелить несколькими машинами (и соответственно провайдерами если проблема в сети на стороне клиента).

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

    В дополнении к скорости сетевого подключения есть скорость ответа (пинг), но при множественных подключениях клиента к серверу, его влияние на результат почти исчезает.

    Ну и вишенка на торте, транспортный уровень может внести корректировки, полистай статью

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

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

    Ну и нагрузка на процессор, если реализация однопоточная (асинхронная реализация сильно усложнит подсчет) то скорость ответа будет линейно зависеть от времени обработки одного и нагрузки на процессор (проще замерить сколько клиентов дадут 100% нагрузку). Но вот многопоточные реализации могут давать неожиданные ухудшения характеристики, т.е. 10 потоков могут не дать 10-кратное увеличение скорости, и с величением потоков будет много ресурсов уходить на поддержание этой работы (кажется теория вообще говорит о квадратном корне из количества потоков), и это еще про кеш процессора речи не идет, так как в зависимости от того, влезает ли алгоритм обработки (нужная ему память) в него или нет тоже можно получить кучу странностей, например 1-2 потока будут давать быструю скорость, но добавив третий, даже не нагрузив весь процессор, можно получить значительное понижение производительности, так как данные трех потоков не влезают в кеш. Кстати оперативная память хоть и называется Random Access memory но может давать разную производительность в зависимости от характера нагрузки (особенно это видно по вычислениям на GPU) что тоже не лучшим образом влияет на многопоточный результат.

    т.е. может так получиться что аренда большого количества слабых блейдов будет эффективнее небольшого количества мощных серверов
    Ответ написан
    Комментировать
  • Какой алгоритм оптимизации выбрать?

    @rPman
    В общем случае гуглить - многомерная оптимизация (у тебя всего 4 показателя да еще и значения на известных границах - лафа, это визуализировать проще)

    Если собираемые показания с шумом, то с ними бороться можно только повышением количества сбора показаний (вычислений)

    Процесс творческий.

    К сожалению не существует универсального алгоритма, выше автор дал скрин (срез по 3 показателям, мог бы цветом четвертый визуализировать) очень неудачная функция, большое плато искать на нем минимум - грустно, и все способы крутятся вокруг поиска дополнительной информации о функции.

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

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

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

    p.s. можно к функции добавить усложнение, которое ведет себя более ярко выраженно в исследуемых точках, грубо говоря 1/(f(x)-a) будет сильнее меняться для значений первоначальной функции рядом с точкой a (осторожно с делением на 0, в этой точке такой подход даст неопределенный результат и для него может понадобиться пересчет), т.е. там где сама функция похоже на плато, возведением в отрицательную степень максимизирует незначительные движения и может помочь найти разницу

    upd. посмотри weka, фреймворк написан на java, есть gui, как для выбора алгоритмов так и по визуализации (слабоват), как отправная точка для поиска алгоритмов чтобы и и посмотреть что есть и попробовать, что не понятно, вбиваешь название алгоритма в гугл и ищешь подробности
    Ответ написан
    Комментировать
  • Какой оптимальный алгоритм для однозначного определения слагаемых в сумме?

    @rPman
    Если представить стоимость отдельного заказа (в копейках) в 2-ричной системе счисления (набор бит) и каждый заказ должен устанавливать только свой бит (брать младшие биты, установив остальные в 0), то сумма этих чисел в младших разрядах будет аналогично битовой операции OR, т.е. по итоговой сумме можно будет однозначно понять, какой заказ был включен в нее.

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

    Пример, берем младшие 4 бита для адреса (возможность одновременно быть в обработке 4-ем заказам)
    1 - 10110001 цена 177р
    2 - 01100010 цена 98р
    3 - 11110100 цена 244р
    4 - 00011000 цена 24р
    если платежка пришла по 3-ем заказам, например 1+2+4 то это даст сумму 299р - 100101011, смотрим на младшие биты, установлены 1,2 и 4


    Недостаток, 20 заказов это 2^20 копеек - это разница в цене на 10т.р. (т.е. 20-ый заказ может отличаться по цене от первоначального на эту сумму), так же это накладывает ограничение на минимальную цену заказа (можно подбирать для дешевых заказов младшие биты а для по дороже - по старше.

    Логично что это подойдет только если заказов мало, например 2^10 это всего 10.24р

    К сожалению если не добавить какого то еще знания о возможностях группировки заказов, то это никак не оптимизировать
    Ответ написан
    1 комментарий
  • Есть ли приложения генерирующие анимацию облака точек по видео?

    @rPman
    Задача может быть решена аппаратно, 3d камеры от того же intel в примерах в sdk предлагают софт именно для этого, дают облако точек, но пользоваться этим невозможно

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

    Вектор угла направления взгляда/положения лица будет прыгать как сумашедший от кадра к кадру, я еще про эмоции не сказал, каждая эмоция тоже параметризована, все это не позволит дать точное соответствие одной и той же точки на лице на соседних кадрах, т.е. построив к примеру поверхности по этим точкам они просто не сойдутся на следующем кадре, в результате будет сильный шум, затрудняющий хоть какую то адекватное применение (игрался я с 3d камерами от intel, сильный шум результата делает все бессмысленным)
    Ответ написан
    Комментировать