Пишу о матмоделях и прикладных задачах. Сотрудничество: @tarasov_math Сайт http://tarasov.expert
Поздравляю всех женщин с 8 марта. Любви, приключений и нового сарафанчика всем :)
В этот раз не придумал оригинального поздравления, математика с любовью плоховато сочетается.
Работа с любым клиентом начинается с загрузки данных. Казалось бы один раз помучался и загрузил. Но мы в наших проектах постоянно упирались в кучу проблем с этим связанными.
1. Ошибки во входных данных. Люди их видят и могут справляться. А вот программа сходу так не может. Здравый смысл алгоритму прикрутить можно, но это большие дополнительные усилия.
2. Неявные ручные бизнес процессы. Люди принимают решения и что-то помечают в таблицах, а что-то остается в голове. Есть правила заполнения, но они не всегда выполняются. В результате, во входных данных иногда невозможно определить что мусор, а что важно.
3. Заведомо некорректные входные данные. Один наш потенциальный клиент очень вольно трактовал 139 приказ (лётные правила). Если не придираться, то они все выполняли. А если посмотреть, как пилот приземляясь в Петербурге оказывался через 12 часов в Москве, то возникали вопросы как он успел выспаться дома и уехать в Москву. В результате во входных данных всегда были телепорты пилотов и нам с этим приходилось работать.
Другая компания ставила прилет самолета из Турцию в Москву в 23.00 На самом деле он всегда прилетал в час ночи. Турист приезжал в аэропорт и ему объявлялось, что самолет задерживается.
На бумаге одно, а в уме другое.
4. Никогда такого не было и вот опять (с).
Вообще забавно, что у заказчиков всегда разрыв в голове между тем, как должно быть, и как оно на самом деле. Ни один заказчик не расскажет, какая фигня случается. Пока не не погрузитесь на половину в проект. Да и тогда он не то что расскажет, а когда вы носом ткнете помнется и признается, что да иногда такая ерунда случается.
На самом деле, чтобы алгоритм был реально полезен, его надо разрабатывать для реальных случаев, а не воздушных замков. И разрыв между этими штуками бывает очень большой.
В одной компании, тщательно следили за выполнением 139 приказа и были уверены, что его нарушений нет в принципе. А мы нашли там грубейшие вещи, главный диспетчер, говорят, когда увидел "поседел во второй раз".
В общем, чтобы почистить данные для алгоритма иногда приходится оцифровать компанию, изменить их существующие процессы и поменять принципы управления. 🤣
Я это рассказываю всем крупным заказчикам, чтобы готовить их. Потому что есть большой фронт работ, который не запланирован в ТЗ, но который все равно придется делать. И если сроки из-за этого сползут, надо чтобы было точно понятно, что я делал все что мог, чтобы этого не случилось.
Буду делать расписание самолётов для АК Россия. Подписал контракт. Всë как я люблю - задача сложная, сроки горят.
Читать полностью…Тюнинг параметров в SCIP.
В коммерческих солверах ЦЛП есть автотюнинг. То есть автоматический подбор различных настроек солвера, чтобы он лучше решал задачу.
По моему опыту это очень полезная штука. Разумеется, надо самому понимать, какие опции и зачем нужны, но автоподбор экономит время и дает интересные идеи. В общем, на моей практике раз в год задачу стоит тюнить. Задачи начинают решаться в 4-10 раз быстрее. Это достаточно сильно.
А вот в некоммерческих солверах с этим проблемы. Я уж думал не написать ли собственный такой сервис для SCIP.
И вот сотрудник нашел такую штуку, оптимизирует настройки солвера SCIP:
https://hyperopt.github.io/
SCIP еще интересен, тем, что у него там очень много настроек (под тысячу уже кажется). И разобраться в этом осознанно нет шансов, только если вы не автор SCIP.
Попробовали, ускорили раз в 10 кажется. Точнее сложно сказать, мы для одной задачи решали много маленьких задач и не дожидались ответа за 10 минут. А теперь стало находиться решение за 2 минуты. Очень мощный эффект.
Пришел заказ на планирование работы мясоперерабатывающего завода от старого клиента. Второй завод в 2025 году. :)
Читать полностью…Математики решили знаменитую "задачу о диване".
Какой формы должен быть диван, чтобы он проходил в коридоре в поворот на 90 градусов, чтобы была площадь дивана была максимальна.
https://habr.com/ru/companies/cloud4y/articles/881132/
Мы сейчас вплотную подошли к этой задаче с другой стороны. Как спланировать лифтовый холл, чтобы можно было в любую квартиру занести диван (на самом деле вынести гроб).
Приехал в командировку в Ростов-на-Дону. Интересный проект по Revenue Management. По рукам ударили, на следующей неделе будем подписывать договор надеюсь ничего не сорвется. Заказчик очень заботливый, встретили с поезда. Заказали гостиницу, красота. :)
Читать полностью…А подскажите пожалуйста веб студию, которая быстро и качественно сделает сайтик визитку на 5 страниц. Сайтик должен быть красивый.
Читать полностью…Как устроена дифракция/интерференция.
Пару лет назад научился объяснять 6-летнему ребенку, как получаются разноцветные переливы на обложке его блокнотика или CD.
По шагам это выглядело так:
1. Свет, как и звук, это волны, которые колеблются.
2. Частоту света мы видим как цвет. А частоту звука мы слышим как тон.
3. Как тон мы слышим не только, если прямо волна волна, а даже идет куча щелчков с нужной частотой. Можно вот тут например поиграться https://www.onlinemictest.com/ru/tone-generator/
Дальше уже следующий ход конем. Если сильно хлопнуть в ладони напротив лесенки, то звук отражается от каждой ступеньки и возвращается обратно. Куча щелчков сливаются в звук. При этом тон зависит от расстояния между ступеньками. Снизу лестницы оно меньше, а сверху больше, так как звук идет по диагонали.
Получается, что эхо от лестницы имеет тон и меняет его.
Вот тут можно послушать как звучит Чичен Ица
https://www.youtube.com/watch?v=AyveBtpJ4Hk
А на обложке календарика тоже сделана такая лестница, только с очень мелкими шагами, под длину волны света. В результате она тоже отражает под разным наклоном разный цвет.
Эффект такой "лестницы" называется дифракция, а сама лестница дифракционная решетка. Чечен Ица это звуковая дифракционная решетка получается.
P.S. Мой пост двухлетней давности был полезен для бизнеса. После него мне позвонил друг из Германии и пытал полчаса, как все работает (6-летним детям иногда проще объяснять). Зато через пару месяцев компания, где он работает пришла к нам за заказом. :)
С появлением LLM БЯМ, возникает возможность нового интерфейса работы с программами - час запросов. Это и интерфейс резко упрощает и не надо помнить где какая функция находится.
Технически все отлично реализуется, БЯМ достаточно уметь переводить запрос в файл конфига (или создает патч этого конфига). А программа уже просто визуализирует этот конфиг файл.
Появляются первые варианты, вот видео Text-to-CAD от https://zoo.dev/
Подскажите кто-нибудь уже делает что-то подобное в России? Хочу проконсультироваться.
Парадокс Симпсона в реальной жизни.
Был летом заказчик, я написал для него программу оптимизации работы завода. И там всплыла контринтуитивная штука.
Есть два полуфабриката: 60% раствор некоторого вещества, 30% раствор того же вещества, и некоторый продукт, который делается из 30% раствора вещества. Полуфабрикаты так же являются и продуктами, то есть продаются напрямую.
Себестоимость и маржинальность привожу в табличке.
Заказчики придумали и используют способ поднять маржинальность. Они разбавляют 60% раствор вещества и используют его для основного продукта. Процедура разбавления простая, можно заметить что 14000/2 = 7000 < 8000. Себестоимость продукта падает на 1 тысячу, а маржинальность поднимается. Казалось бы прекрасно. Мы подняли маржинальность одного из продуктов, а другие маржинальности остались неизменны, то есть мы подняли общую маржинальность.
Нет! Общая маржинальность уменьшилась.
Как так? Смотрим картинки, я расписал 2 сценария.
Просто надо считать средневзвешенную маржу. Правда уменьшение общей маржинальности это тоже выворот статистики, так как мы стали продавать больше 30% полуфабриката, и у нас просто увеличился общий объем продаж.
А смотреть реально надо на потерянные 6 миллионов прибыли.
Причем чтобы увидеть, что мы теряем эти 6 миллионов на ровном месте, достаточно просто использовать здравый смысл.
Продукт тут вообще не причем. Если разбавить 1 тонну 60% раствора и продать то мы заработаем 2*30=60 миллионов вместо 63, то есть мы потеряем 3 миллиона. А мы для улучшения продукта разбавили 2 тонны и потеряли 6 миллионов.
Вот и вся арифметика.
Этот пример абсолютно реальный, но бумажный. Мне приходили входные данные и приходилось убеждать, что не надо разбавлять 60% раствор. Но на практике, они вроде так не делали.
Но аналогичная, но более сложная история у них там все таки случалась и люди реально теряли миллионы в месяц.
Число 2025 с математической точки зрения прикольное. Помимо того что (20+25)² = 2025
это так же 1³+2³+3³+4³+5³+6³+7³+8³+9³ = 2025
и (1+2+3+4+5+6+7+8+9)²= 2025
И еще друг нашел, что 2025 можно составить комбинацией чисел от 1 до 5 : 1*3⁴*5²
Несколько мелких заметок про Чебышёва, математику и гонки. Я раньше писал, что я вижу математику в мире
1. Оптимальная тракетория гоночных автомобилей, это многочлены наименее уклоняющиеся от нуля, которые придумал Чебышёв.
2. Я когда в Хуавее работал мы один раз ходил на корпоратив покататься на картах. Я там довольно плохо ехал, еле прошел в финал, но изучил трассу придумал как тут должен выглядеть многочлен Чебышева на этой трассе, потом проехал по заданной схеме и выиграл гонку.
3. Еще я делал программу для управления станком. Там надо было одновременно ограничивать скорость и ускорение. Когда сформулировали задачу получилась в точности задача скоростного прохождения трассы так, чтобы не слететь с неё на поворотах.
Сферический конь в вакууме.
Есть классический анекдот про математика, которого попросили сделать прогноз скачек лошадей и он сделал первую модель со сферическим конем в вакууме.
Одним из прототипов этого анекдота была реальная история.
Во время командировки в Париж в 1878 году великий русский математик, академик Пафнутий Львович Чебышёв прочитал лекцию «Математические методы кройки одежды».
Естественно, на лекции был аншлаг, пришли лучшие парижские портные и самые знаменитые модницы.
Пафнутий Львович начал выступление со слов: «Примем для простоты, что человеческое тело имеет форму шара…». Дочитывать материал пришлось в полупустой аудитории.
На основе этой лекции он написал работу: «О кройке одежды».
Его работы оказали на самом деле оказались очень практически полезны. Причем не только в раскрое одежды а везде, где надо делать хорошие приближения.
А его пример с раскройкой шара из двух кусочков ткани теперь используется при производстве теннисных мячиков.
Задачка по физике.
Не по теме блога конечно, но придумал сам уникальную задачку.
Вопрос такой, когда чаще всего останавливаются настенные часы? То есть сколько времени они показывают?
Со мной спорили, что они остановиться могут любое время, и я стал фотографировать остановившиеся часы.
В общем и правда, останавливаются в разное время, но есть четкая закономерность. И вот, наконец, поймал идеальное время, в которое часы должны останавливаться чаще всего.
Решение:
В современных часах в стрелках нет противовеса. И в 8 часов 45 минут 45 секунд стрелки тяжелее всего поднимать. Если батарейка садится медленно, то часы останавливаются чаще всего в этот момент.
Часы бывают разные, но вот самая маленькая стрелка всегда в районе 45. Если есть и минутная и секундная, то минутная чаще всего тоже в диапазоне 40-50 минут
План работы на сегодня:
9:15 планерка
10:00 созвон с лидом
12:30 созвон с клиентом 1
13:30 день рождения сына
15:00 созвон с клиентом 2
16:00 созвон с клиентом 3.
Еще в перерывах успевать надо писать документы, покодить и текучку разгрести.
Решил сменить аватарку. Логотипчик клевый, но общение получалось слишком анонимное.
Читать полностью…Как правильно писать тексты, чтобы их было удобно читать.
Меня научный руководитель научил, когда я писал кандидатскую.
Заголовок текста (статьи/диссертации/поста) должен иметь точное название соответствующее основной мысли.
Сам текст должен расшифровывать эту мысль. Если текст большой он разбирается на блоки и у каждого блока так же есть заголовок, который опять же точно соответствует тексту, который он описывает.
Так что если просто прочитать оглавление (заголовки второго уровня), должен получиться связный текст, который более подробно раскрывает смысл по сравнению с заголовком.
Большой текст может иметь сложную древовидную структуру и он должен быть образован так, чтобы мы могли расхлопнуть какие-то "подпапки", а какие-то не расхлопывать. И при любом таком расхлопывании должен получаться связный текст.
В век перегрузки информации это очень полезно, так как позволяет экономить ментальные усилия по прочтению текста и экономии времени, чтобы не читать то, что очевидно или не нужно конкретному читателю.
Это еще напоминает формат GIF когда изображение загружается сначала большими квадратиками, а потом всё более четко.
В книгах до 19 века кстати практиковались аннотации к каждой главе, они были, например, в Робинзоне Крузо и Графе Монте Кристо.
Как тренировать исследователя внутри себя.
Впомнил еще одну классическую детскую головоломку "лепестки вокруг розы". Она достаточно простая, куча людей берет её всего с нескольких попыток. При этом множество технарей в неё втыкается и не может решить. Билл Гейтс например не решил.
https://mshakerinava.github.io/Petals-Around-the-Rose/
Думаю вы её решите сами без проблем. Но если что на ней отлично работает следующий принцип.
Смотрим ситуации где лепестков очень много и смотрим ситуации где лепестков очень мало - и сразу же находим разницу.
Этот принцип довольно универсальный и я его постоянно применяю в работе. Эта и подобные головоломки можно решать "не думая".
Сейчас в одном форуме обсуждают книгу Цель Голдратта. Очень ее люблю, всегда закупаю себе экземпляры, чтобы подарить клиентам и друзьям.
Книга очень классная, но идея бутылочного горлышка оказывается сильно нетривиальной, и не все её правильно переваривают.
Мне одни заказчики как-то заявили:
Теория ограничений не работающая ерунда.
Я спросил: почему?
Мы посмотрели на свой проект, поняли что у нас главное бутылочное горлышко это специалисты по машинному обучению. Наняли много специалистов, через несколько месяцев деньги кончились и проект закрыли.
😕
Та что книжку мало прочитать, надо еще понять. Еще есть проблема в выявлении главного ограничения. Есть вещи которые мы любим и умеем делать, а есть которые не умеем. Рано или поздно мы чиним все что умеем и упираемся в том что не умеем.
Мне вот в бизнесе надо нарабатывать лиды. И мне приходится напоминать себе , что это самое главное и все равно умудряюсь заниматься этим сильно меньше необходимого времени.
А у вас есть подобные проблемы с главными ограничениями ?
Универсальный трансформатор и неровные производственные смены.
У одного из заказчиков есть этап производства - сушка деталей. Все детали сушатся вместе посменно.
Смен сейчас 3 по 8 часов в сутках.
Каждая деталь должна просушиться определенное время. Если деталь должна сушиться больше 8 часов, то она сушится вторую смену. Получается потеря производительности.
Можно в целом перейти на 12 часовые смены, или на 6-часовые. Но тогда одни детали станут эффективней сушиться, а другие менее эффективно.
Вспомнилась задача про трансформатор, как сделать трансформатор, чтобы он мог равномерно выдавать 6 видов напряжений по шагам от 1 до 6. Можно сделать с 12 концами по одной обмотке на каждый шаг напряжения. Вопрос, а какое можно сделать минимальное число концов?
Решение приведено на картинке. Надо разделить витки в пропорции 1:3:2 и там можно набрать витки всех длин от 1 до 6. И достаточно всего 4 концов.
Такой же трюк можно провернуть со сменами, если сделать их неравномерными.
Можно например сделать смены длиной 5,8,11 часов. И тогда там можно будет сушить детали длительностью 5,8,11,13,16,19 часов со 100% эффективностью.
Предложил на словах заказчику, попозже подсчитаю экономический эффект.
Общаюсь с одним заказчиком. Надо расставить самолеты по рейсам. Исходно речь шла про 15-20 самолетов, а тут неожиданно речь пошла про 100+ Пришлось объяснять, что для этого требуется другого класса решение, за совсем другую цену. Придумалась аналогия.
Если вы хотите ехать со скоростью 15-20 км/ч вам достаточно велосипеда. Если ехать со средней скоростью 50км/ч, то нужен автомобиль. А если требуется 100+ то нужен или самолет, или проложить скоростную автомагистраль между пунктами.
Собирали хурал, из кто более менее рядом с Москве. Здорово видеть народ в живую.
Читать полностью…Решил убить двух зайцев. Сделать простенькую мат. модель работы завода с двумя переделами, чтобы научить студента делать мат. модели и сделать демо, которое показывать потенциальным заказчикам. Пока собирался пришел лид с прямо таким заказом. Окей, будет три зайца одним выстрелом. :)
Как доделаем, покажу. Надеюсь дойдут руки сделать красивый сайтик с возможностью перерасчета и визуализацией.
UPD. Еще забыл рассказать. Клиент на первом переделе делает некоторые 3д модели, и главным параметром является площадь модели. То есть цех может сделать за день X квадратных метров поверхности модели (видимо шлифует).
С похожей историей я встречался c детальками после лазерной резки. Там себестоимость детальки состояла из плошади детальки (материал) и периметра (длина лазерного реза). Забавно.
Линейное программирование может больше, чем кажется, ч. 3.
ЛП может находить самые равномерные решения.
От меня с ЛП как-то отмахивались, рассказав следующую историю. Сделали алгоритм оптимизации запасов на складах и распределении этих запасов между клиентами.
Возникла ситуация, когда по некоторым причинам запасов оказалось меньше, чем потребностей клиентов. И алгоритм попытался сгрузить все запасы единственному самому приоритетному клиенту.
А правильно было сгрузить более равномерно, чтобы у каждого клиента было время пока не решится вопрос с дополнительными поставками.
Разработчики алгоритма заявили, что проблема связана с фундаментальной особенностью ЛП – то, что решение всегда находится экстремальное, то есть на границе. И если у одного клиента выше приоритет раздачи, то он получает всё, а другие ничего.
На мой взгляд, проблема тут в недопоставленной задачи. Просто был сделан алгоритм под стандартную ситуацию – когда всего хватает и не был обработан редкий, но важный случай ситуации нехватки остатков. Точнее он даже был сделан – по приоритетам клиентов, но не так как будет действовать реальный диспетчер. Достаточно было проработать эту ситуацию, описать поведение диспетчера и его автоматизировать. Видимо человек все равно бы звонил клиентам и выяснял бы у кого горит, а кому пока не критично. А из тех, кому критично распределять по уровню недовольства. При этом можно использовать те же приоритеты, и если у нас один клиент в два раза более приоритетный чем другой, то мы раздадим запасы 100 к 50, а не 150 к 0.
А “экстремальность” решений ЛП легко превращается равномерность при правильной постановке задачи.
Вот пара геометрических примеров.
Центр вписанной окружности многоугольника или многогранника – это самая средняя, то есть не экстремальная точка, и при этом это в точности решение задачи ЛП – найти точку внутри многогранника с самым большим расстоянием от границы.
Был такой великий математик и педагог Игорь Федорович Шарыгин, с кем мне довелось быть знакомым. Ему для учебника понадобилось нарисовать неравнобедренный и неравносторонний треугольник. И он задумался, какой многоугольник самый несимметричный. Точную постановку задачи уже не помню. Кажется, у него получился треугольник с углами 20 60 и 100 градусов, и он очень радовался треугольнику в 100 градусов.
Оказывается еще не все знакомы с парадоксом Моравека, о том что мы неверно оцениваем объективную интеллектуальную сложность видов деятельностей. "Мозги" оказалось сделать и повторить проще чем "руки". Я его для себя сформулировал так: футбол более интеллектуальная игра, чем шахматы.
Вообще тут все просто и ИИ не причем. Нам кажется вершиной интеллектуальной деятельности то, что мы плохо умеем. А то, что мы умеем хорошо - кажется простым. Написание ИИ позволило увидеть объективную картину сложности.
В связи с этим вспоминается парадокс оплаты фрилансера или трансформатора Форда, который я для себя открыл.
Те вещи, которые делать легко, должны оплачиваться выше чем те что делаются сложно.
Потому что первые находятся в середине зоны экспертизы, и ты их делаешь быстро и качественно. А на вторых ты еще учишься и делаешь их похуже.
Поздравляю всех с наступающим новым годом! Желаю всем успеха и удачи в наступающем (20+25)² году . И успевать радоваться жизни в непростое время.
Небольшое подведение итогов.
Год прошел, как я вернулся делать проектный бизнес - полет нормальный.
Команда растет, задачи интересные. Денег заработал меньше чем хотел, но больше чем если бы сидел в найме. Сделал большой задел на следующий год. Приятным удивлением было, что старые клиенты меня помнят и любят.
За год успел проектировать, где ставить заводы, склады и вокзалы, как оптимизировать работу уже построенных заводов, самолетов, кораблей, как проектировать отдельные здания. Оптимизировал продажу яблок, и билетов на кораблики.
Детские мечты сбываются оптом :)
Ошибки делал, но не математические, а бизнесовые. Учусь составлять договора, выстраивать бизнес процессы в компании и правильно оценивать риски. Но это все проблемы велосипедиста - чем быстрее движешься вперед, тем сильнее дует ветер в лицо. :)
Линейное программирование может больше, чем кажется, ч. 2.
Уточнение расписания полетов.
В рамках стартапа написал проект подгонки расписания авиакомпании. Очень хорошо легко на линейное программирование.
Есть некоторое уже готовое расписание и в нем есть сложности. Между какими-то рейсами маловат зазор времени. И если по какой-то причине один рейс задержится, то задержится и следующий. Еще может быть, что время вылета или прилета неудобное клиентам или аэропорту. Аэропорт не просто так дает слоты на вылет/прилет, они могут быть заняты или иметь разную цену. Еще есть ночные рейсы, что увеличивает требования к экипажам усложняя составление расписания. Иногда достаточно чуть-чуть подвинуть рейс, чтобы он перестал считаться ночным.
Задача заключается в том, чтобы подвигать расписание рейсов так, чтобы оно стало лучше учетом описанных факторов.
И эта задачка очень просто делается смешано-целочисленным линейным программированием.
Между некоторыми рейсами есть зависимость. Что конец первого рейса должен быть раньше (с некоторым запасом времени) начала второго рейса. Такие пары могут быть из-за того, что это рейсы, которые выполняются одним самолетом или одним экипажем. В общем случае траектория каждого сотрудника может быть своя, и по каким-то причинам бортпроводники остаются в том же самолете, а пилоты пересаживаются. Тут главное, что мы можем все такие зависимости учесть.
Основной набор переменных тут - время вылета каждого рейса. И они все непрерывные, что прекрасно. Время прилета определяется автоматически (вообще если очень хочется, можно еще заниматься менять время рейса, жечь больше топлива, но лететь чуть быстрее, это иногда дает эффект). Зависимости все пишутся в виде t_i <= t_j + c_ij. Где просто вычисляется определенная константа c_ij.
Целочисленные переменные тут возникают только, чтобы учесть стоимость таймслотов аэропорта.
Как видно, резать специально время на кусочки тут не пришлось, и благодаря этому задачка очень даже быстро работает.
Продать только её никому не продали, но это уже другая история :)
В сообществе NoML @noml_community сделали краткий ролик про круглый стол, который ранее организовывали.
Я, неожиданно для себя, очень бодренький, приятно посмотреть 😄
Линейное программирование может больше, чем кажется, ч. 1
Если мы пишем мат модель какого-нибудь завода, то типичным подходом является разбить время работы каждого станка на временные слоты – сутки или часы. И сделать кучу булевых переменных типа делает ли станок C в час Ч работу Р. Получается куча переменных, а модель записывается естественно. И часто вполне неплохо работает. Проблема возникает, когда размерность задачи получается слишком большая, и задача тормозит. Это может быть из-за большого количества станков, или длительного периода планирования. Еще иногда время работы станка нельзя загрублять даже по часам. Важно чтобы станок работал в какой-то момент ровно 4 часа 37 минут. А по минутам бить не реально. Я часто слышу, что это слабое место для ЦЛП задач.
Люди, вы просто не умеете их готовить!
Что тут можно сделать? Правильно моделировать время.
1. Событийное время. В авиации какие-то разработчики до нас разбивали время на 5-минутки. А мы сделали следующее – для каждого аэропорта разбили время по моментам прилета и вылета самолета. В некоторых аэропортах за сутки было всего 2 или 4 таких момента.
Модель стала посложнее. Время стало зависеть от аэропорта (прямо небольшая теория относительности), но в целом ничего сложного. Для больших аэропортов типа Шереметьево при необходимости мы уменьшали временные промежутки, то есть какие-то моменты прилета/вылета склеивали между собой. Если приходилось сдвигать время, мы эти места запоминали и потом дополнительно учитывали в ограничениях. Таким трюком получилось уменьшить общую размерность задачи раз в 10.
2. Можно сделать интервалы времени с плавающей длиной. Летом для одного завода, где станки должны были работать точное время, мы сделали эпохи. То есть общий период планирования разбили на 50 участков, длина каждого из них это непрерывная переменная. Надо отметить, что слабым местом ЦЛП является целочисленность. А непрерывные переменные задачу не усложняют. В этом смысле время можно и нужно планировать непрерывно.
Далее для каждого станка задали его работу по номеру эпохи. Размерность задачи резко понизилась, но вместо этого появилась нелинейность. Теперь, чтобы узнать сколько было произведено продукции станком в заданную эпоху, надо умножить длину эпохи на флаг работы станка. От нелинейности можно избавиться, задав дополнительные переменные.
Таким образом, мы упрощаем модель в одном месте и усложняем в другом. Если временных интервалов было больше, чем типов работ, то это скорее всего выгодный обмен.