В общем, была задача на оптимизацию плана работ: есть набор заказов, и в каждом N тасков. Таски могут зависеть друг от друга или нет, имеют длительность и тип. Ещё есть M работников, каждый из которых может выполнять таски только определённых типов, причём, у каждого своя скорость.
Если все таски в заказе выполнены, фирма получает сколько-то денег. У заказа есть дедлайн, за просрочку штраф (за каждый день просрочки), который вычитается из цены заказа. И ещё фирма тратит деньги за каждый день своей работы независимо от того, как загружены её сотрудники (то есть просто платит зарплаты по сути). Ещё важен учёт праздников и выходных.
Нужно заработать на определённом наборе заказов и работников как можно больше денег. Полный текст задачи и код программы проверки есть в репозитории. Эта задача является изменённым заказом, который мы с напарником решали в реальной жизни: оптимизация работы печатных станков для типографии. Правда, тогда и мы справились так себе, и заказчик в итоге сначала захотел всё вручную сам делать, а потом и вовсе похоронил проект при смене директора.
!!! Не читайте дальше, если хотите сначала попробовать решить самостоятельно, потому что я сейчас опишу эффективные подходы и результаты.
________________________________________
Так вот. Мы с другим экспертом Андреем сразу сели и написали разные варианты, чтобы задать шкалу, по которой будем оценивать решения команд. За пару часов я собрал примитивный жадный алгоритм, который сортировал заказы по прибыльности и укладывал в сетку кое-как, это дало нам нижнюю оценку. Мой алгоритм заработал ~75 млн виртуальных рублей, мы решили для оценки поставить нижней границей 40 млн. То есть всё, что ещё ниже, оценивалось в ноль баллов за качество оптимизации.
Затем Андрей закрылся дома на три дня и вышел на свет со сложным жадным алгоритмом, который очень хитро сортировал заказы и очень хитро укладывал их в сетку, попутно выбирая разные способы этой укладки в зависимости от конкретного заказа. Это позволило заработать ~275 млн рублей. Мы сделали верхней границей для оценки 280 млн.
К сожалению, в итоге только две команды из десяти прошли нижнюю границу, заработав, соответственно, ~91 и ~105 млн. К верхней границе не приблизился никто. И у четырёх команд алгоритм вообще не смог уложить без нарушений задачи в сетку (то есть, например, произвольно менял длительности, накладывал задачи друг на друга, давал одному работнику две задачи в один момент и так далее). Важной ошибкой команд, на мой взгляд, являлся тот факт, что никто не воспользовался возможностью запустить алгоритм на несколько минут и дать ему поработать. По условиям задания, можно было тянуть до 5 минут на одну оптимизацию, но по факту решения команд отрабатывали за единицы и десятки секунд.
На самом конкурсе, пока команды работали, я решил попробовать сделать быстрое (по времени написания) но эффективное решение. Сначала попробовал жадную сортировку + доведение до лучшего варианта методом имитации отжига. В качестве нового состояния я просто менял местами заказы целиком. Этот вариант работал пару минут и дал мне около ~200 млн дохода. К слову, команда-лидер использовала такой же подход, просто не докрутила число итераций и температуру.
Ну и потом я взял готовую либу по реализации классической генетики с особями и скрещиванием. Особью был массив с приоритетами заказов (которые конечно же нужно было аккуратно уложить чистым алгоритмом). Тип скрещивания: scattered. Всего 15 поколений по 20 особей, и это за минуту-полторы давало ~230-240 млн. Считаю, что для конкурса это самый лучший выбор: пишется одним человеком за день и даёт почти максимум, при этом легко настраивается на нужную длительность работы, легко параллелится.
Ну а потом уже дома я посидел и накодил свой вариант сложного жадного с плавающим окном перебора отсортированных заказов и плавающей же укладкой по работникам. Такая штука за две минуты зарабатывает ~281 млн. Но за три дня в условиях стресса я бы такое не сделал, скорее всего.
#dev
#Cechia🇨🇿
#Parlamentari
Risultati parziali.
Distribuzione dei seggi.
🟦 SÌ (#ANO|PfE): 80 (+8)
⬛️ Insieme (#Spolu|Centro-destra; comprende #ODS|ECR, #KDU|PPE e #TOP09|PPE): 52 (-19)
🟪 Sindaci e indipendenti (#STAN|Centro liberale): 22 (-11)
⬛️ Partito Pirata Ceco (#Piráti|G/EFA, comprende anche #Zelení|G/EFA): 18 (+14)
🟦 Libertà e Democrazia diretta (#SPD|ESN; comprende anche #Trikolora|Estrema destra, #Svobodní|Destra e #PRO|Destra): 15 (-5)
🟦 Automobilisti per se stessi (#AUTO|PfE): 13 (nuovo)
Totale: 200
Maggioranza: 101
Nota: tra parentesi è indicata la variazione rispetto alle elezioni del 2021.
@TuttoElezioni
#Cechia🇨🇿
#Parlamentari
Risultati preliminari.
Scrutinato: 100%.
Affluenza: 68,95% (+3,56% rispetto al 2021)
🟦 SÌ (#ANO|PfE): 34,51%
⬛️ Insieme (#Spolu|Centro-destra; comprende #ODS|ECR, #KDU|PPE e #TOP09|PPE): 23,36%
🟪 Sindaci e indipendenti (#STAN|Centro liberale): 11,23%
⬛️ Partito Pirata Ceco (#Piráti|G/EFA, comprende anche #Zelení|G/EFA): 8,97%
🟦 Libertà e Democrazia diretta (#SPD|ESN; comprende anche #Trikolora|Estrema destra, #Svobodní|Destra e #PRO|Destra): 7,78%
🟦 Automobilisti per se stessi (#AUTO|PfE): 6,77%
🟥 Basta (#Stačilo|Sinistra; comprende #SOCDEM|S&D e #KSČM|Comunisti): 4,30%
@TuttoElezioni
#Cechia🇨🇿
#Parlamentari
Risultati parziali.
Scrutinato: 99,95%
🟦 SÌ (#ANO|PfE): 34,57%
⬛️ Insieme (#Spolu|Centro-destra; comprende #ODS|ECR, #KDU|PPE e #TOP09|PPE): 23,33%
🟪 Sindaci e indipendenti (#STAN|Centro liberale): 11,21%
⬛️ Partito Pirata Ceco (#Piráti|G/EFA, comprende anche #Zelení|G/EFA): 8,94%
🟦 Libertà e Democrazia diretta (#SPD|ESN; comprende anche #Trikolora|Estrema destra, #Svobodní|Destra e #PRO|Destra): 7,79%
🟦 Automobilisti per se stessi (#AUTO|PfE): 6,77%
🟥 Basta (#Stačilo|Sinistra; comprende #SOCDEM|S&D e #KSČM|Comunisti): 4,31%
@TuttoElezioni
#Cechia🇨🇿
#Parlamentari
Risultati parziali.
Scrutinato: 99,18%
🟦 SÌ (#ANO|PfE): 34,77%
⬛️ Insieme (#Spolu|Centro-destra; comprende #ODS|ECR, #KDU|PPE e #TOP09|PPE): 23,20%
🟪 Sindaci e indipendenti (#STAN|Centro liberale): 11,16%
⬛️ Partito Pirata Ceco (#Piráti|G/EFA, comprende anche #Zelení|G/EFA): 8,83%
🟦 Libertà e Democrazia diretta (#SPD|ESN; comprende anche #Trikolora|Estrema destra, #Svobodní|Destra e #PRO|Destra): 7,83%
🟦 Automobilisti per se stessi (#AUTO|PfE): 6,79%
🟥 Basta (#Stačilo|Sinistra; comprende #SOCDEM|S&D e #KSČM|Comunisti): 4,33%
@TuttoElezioni
#Cechia🇨🇿
#Parlamentari
Risultati parziali.
Scrutinato: 98,12%
🟦 SÌ (#ANO|PfE): 34,98%
⬛️ Insieme (#Spolu|Centro-destra; comprende #ODS|ECR, #KDU|PPE e #TOP09|PPE): 23,03%
🟪 Sindaci e indipendenti (#STAN|Centro liberale): 11,11%
⬛️ Partito Pirata Ceco (#Piráti|G/EFA, comprende anche #Zelení|G/EFA): 8,75%
🟦 Libertà e Democrazia diretta (#SPD|ESN; comprende anche #Trikolora|Estrema destra, #Svobodní|Destra e #PRO|Destra): 7,86%
🟦 Automobilisti per se stessi (#AUTO|PfE): 6,81%
🟥 Basta (#Stačilo|Sinistra; comprende #SOCDEM|S&D e #KSČM|Comunisti): 4,35%
@TuttoElezioni
#Cechia🇨🇿
#Parlamentari
Risultati parziali.
Scrutinato: 96,25%
🟦 SÌ (#ANO|PfE): 35,23%
⬛️ Insieme (#Spolu|Centro-destra; comprende #ODS|ECR, #KDU|PPE e #TOP09|PPE): 22,83%
🟪 Sindaci e indipendenti (#STAN|Centro liberale): 11,06%
⬛️ Partito Pirata Ceco (#Piráti|G/EFA, comprende anche #Zelení|G/EFA): 8,66%
🟦 Libertà e Democrazia diretta (#SPD|ESN; comprende anche #Trikolora|Estrema destra, #Svobodní|Destra e #PRO|Destra): 7,90%
🟦 Automobilisti per se stessi (#AUTO|PfE): 6,82%
🟥 Basta (#Stačilo|Sinistra; comprende #SOCDEM|S&D e #KSČM|Comunisti): 4,38%
@TuttoElezioni
#Cechia🇨🇿
#Parlamentari
Risultati parziali.
Scrutinato: 90,31%
🟦 SÌ (#ANO|PfE): 35,95%
⬛️ Insieme (#Spolu|Centro-destra; comprende #ODS|ECR, #KDU|PPE e #TOP09|PPE): 22,28%
🟪 Sindaci e indipendenti (#STAN|Centro liberale): 10,93%
⬛️ Partito Pirata Ceco (#Piráti|G/EFA, comprende anche #Zelení|G/EFA): 8,41%
🟦 Libertà e Democrazia diretta (#SPD|ESN; comprende anche #Trikolora|Estrema destra, #Svobodní|Destra e #PRO|Destra): 8,01%
🟦 Automobilisti per se stessi (#AUTO|PfE): 6,87%
🟥 Basta (#Stačilo|Sinistra; comprende #SOCDEM|S&D e #KSČM|Comunisti): 4,45%
@TuttoElezioni
#Cechia🇨🇿
#Parlamentari
Risultati parziali.
Scrutinato: 85,66%
🟦 SÌ (#ANO|PfE): 36,26%
⬛️ Insieme (#Spolu|Centro-destra; comprende #ODS|ECR, #KDU|PPE e #TOP09|PPE): 22,05%
🟪 Sindaci e indipendenti (#STAN|Centro liberale): 10,87%
⬛️ Partito Pirata Ceco (#Piráti|G/EFA, comprende anche #Zelení|G/EFA): 8,29%
🟦 Libertà e Democrazia diretta (#SPD|ESN; comprende anche #Trikolora|Estrema destra, #Svobodní|Destra e #PRO|Destra): 8,05%
🟦 Automobilisti per se stessi (#AUTO|PfE): 6,90%
🟥 Basta (#Stačilo|Sinistra; comprende #SOCDEM|S&D e #KSČM|Comunisti): 4,48%
@TuttoElezioni
#Cechia🇨🇿
#Parlamentari
Risultati parziali.
Scrutinato: 75,22%
🟦 SÌ (#ANO|PfE): 36,94%
⬛️ Insieme (#Spolu|Centro-destra; comprende #ODS|ECR, #KDU|PPE e #TOP09|PPE): 21,56%
🟪 Sindaci e indipendenti (#STAN|Centro liberale): 10,73%
🟦 Libertà e Democrazia diretta (#SPD|ESN; comprende anche #Trikolora|Estrema destra, #Svobodní|Destra e #PRO|Destra): 8,14%
⬛️ Partito Pirata Ceco (#Piráti|G/EFA, comprende anche #Zelení|G/EFA): 8,05%
🟦 Automobilisti per se stessi (#AUTO|PfE): 6,94%
🟥 Basta (#Stačilo|Sinistra; comprende #SOCDEM|S&D e #KSČM|Comunisti): 4,54%
@TuttoElezioni
#Cechia🇨🇿
#Parlamentari
Risultati parziali.
Scrutinato: 64,48%
🟦 SÌ (#ANO|PfE): 37,49%
⬛️ Insieme (#Spolu|Centro-destra; comprende #ODS|ECR, #KDU|PPE e #TOP09|PPE): 21,06%
🟪 Sindaci e indipendenti (#STAN|Centro liberale): 10,65%
🟦 Libertà e Democrazia diretta (#SPD|ESN; comprende anche #Trikolora|Estrema destra, #Svobodní|Destra e #PRO|Destra): 8,22%
⬛️ Partito Pirata Ceco (#Piráti|G/EFA, comprende anche #Zelení|G/EFA): 7,88%
🟦 Automobilisti per se stessi (#AUTO|PfE): 7,00%
🟥 Basta (#Stačilo|Sinistra; comprende #SOCDEM|S&D e #KSČM|Comunisti): 4,58%
@TuttoElezioni