• Как распределить заказы по курьерам?

    @Aleshonne
    Научные вычисления
    Это задача теории расписаний, обработка заданий множеством подвижных процессоров (возможно, с директивными сроками, если время приезда курьера назначено), и она, если я ничего не путаю, является NP-полной. Точное решение — полный перебор всех комбинаций заказов и курьеров, его можно немного оптимизировать, см. темы «Функция Беллмана», «Метод ветвей и границ».
    Если коротко, то нужно рассмотреть рекуррентную функцию B_i, которая является множеством оптимальных по Парето решений задачи для i заказов, и зависит от параметров i-го заказа и решения B_(i-1). Чтобы узнать конкретный вид функции B_i, надо отучиться в универе на математической специальности, а потом, как тут уже писали, пару лет исследовать проблему (возможно, попутно защитив диссертацию). Я знаю человека, который за решение похожей задачи доктора получил.
    Рекомендую использовать живого человека (диспетчера), который вручную разобьёт набор заказов на кластеры с учётом времени в пути между ними, а также будет вносить оперативные корректировки в процессе развоза заказов. По кластеру курьер отлично сориентируется сам.
    Ещё можно использовать жадный алгоритм, по принципу:
    1) добавить в конец списка курьеров одного фиктивного (всего n+1 курьер, m заданий);
    2) i-му курьеру назначить случайное незанятое задание j и (m/(n + 1) - 1) ближайших к нему;
    3) если есть свободные курьеры, увеличить i на 1 и перейти к пункту (2);
    4) задания, доставшиеся фиктивному курьеру раздать тем курьерам, к начальной точке работы которых они ближе.
    Фиктивный курьер нужен, потому что обычно последнему при таком распределении достаются осколки из разных углов. Но результат работы алгоритма требует контроля живым человеком.
    Ответ написан
    Комментировать
  • Нейросети, пакеты, библиотеки, откуда такая сложность?

    @AlexSku
    не буду отвечать из-за модератора
    он или включен или выключен

    Активацию ступеньку (sign) заменили на сигмоиду, т.к. нужно по частным производным считать градиент от конца к началу.
    Потом перешли на ReLU для повышения скорости вычисления.
    Полносвязные слои имели много параметров, поэтому нашли свёрточные фильтры (в основном, для изображений).
    Было развитие систем с обратной связью (как в мозге), они же рекуррентные: LSTM, GRU. Там вместо нейрона несколько вентилей. Но обучение шло на последовательных данных.
    Для параллельной обработки запроса внедрили корреляционные матрицы (внимание), так что современные сети делают на трансформерах. Но там миллиарды параметров, обычным компьютерам они не по зубам, поэтому пользователи делают только запросы через облако.
    Ответ написан
    2 комментария
  • Нейросети, пакеты, библиотеки, откуда такая сложность?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Насколько я понимаю TensorFlow - это коробочное решение от Гугла которое также поддерживает специальное железо TPU (Tensor Processing Unig) которое работает лучше чем вычисления на видеокартах.

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

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    В общем-то, все просто, если у вас нейронов штук 100. Ну 1000 - тогда решение с помощью массивов и сработает, хоть и тормозить будет.

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

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

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

    Именно поэтому все эти универсальные библиотеки такие страшные.

    А decimal не работает, потому что у него не хватает точности. Плюс float работает быстрее ибо реализован аппаратно.
    Ответ написан
    4 комментария
  • Форматирование статей на Хабре с кодом, как?

    pragmatik
    @pragmatik Куратор тега Хабр
    Смотрю материал, присланный вами на проверку. Часть кода вы воткнули как блоки обычного текста: 642d3e43d2c0a027632132.png
    Другую часть вы оформили опцией предназначенной для СТРОЧНОГО выделения кода:642d3fdb86455180370149.png

    В то время как для вставки блоков кода предназначен другой инструмент:642d405fa0e0e594499770.png642d4069d162a686144707.png
    Ответ написан
    3 комментария