Я пытаюсь рассчитать оптимальную команду для игры Fantasy Cycling. У меня есть csv файл, содержащий 176 велосипедистов, их команды, количество набранных ими очков и цену, которую они могли бы получить в моей команде. Я пытаюсь найти самую результативную команду из 16 велосипедистов.
Правила, которые применяются к составу любой команды:
- Общая стоимость команды не может превышать 100.
- В фантазийной команде может быть не более 4 велосипедистов из одной команды.
Короткая выдержка из моего csv файла может быть найдена ниже.
THOMAS Geraint,Team INEOS,142,13
SAGAN Peter,BORA - hansgrohe,522,11.5
GROENEWEGEN Dylan,Team Jumbo-Visma,205,11
FUGLSANG Jakob,Astana Pro Team,46,10
BERNAL Egan,Team INEOS,110,10
BARDET Romain,AG2R La Mondiale,21,9.5
QUINTANA Nairo,Movistar Team,58,9.5
YATES Adam,Mitchelton-Scott,40,9.5
VIVIANI Elia,Deceuninck - Quick Step,273,9.5
YATES Simon,Mitchelton-Scott,13,9
EWAN Caleb,Lotto Soudal,13,9
Простейшим способом решения этой проблемы было бы создание списка всех возможных комбинаций команд, а затем применение правил для исключения команд, которые не соответствуют вышеупомянутым правилам. После этого просто подсчитать общий балл для каждой команды и выбрать самый высокий результат. Теоретически, создание списка используемых команд может быть выполнено с помощью кода ниже.
database_csv = pd.read_csv('renner_db_example.csv')
renners = database_csv.to_dict(orient='records')
budget = 100
max_same_team = 4
team_total = 16
combos = itertools.combinations(renners,team_total)
usable_combos = []
for i in combos:
if sum(persoon["Waarde"] for persoon in i) < budget and all(z <= max_same_team for z in [len(list(group)) for key, group in groupby([persoon["Ploeg"] for persoon in i])]) == True:
usable_combos.append(i)
Тем не менее, вычисление всех комбинаций списка из 176 велосипедистов в команды по 16 человек - это то, что слишком много вычислений для моего компьютера, хотя ответ на этот вопрос подразумевает нечто иное. Я провел некоторое исследование и не мог найти способ применить вышеупомянутые условия без необходимости перебирать все варианты.
Есть ли способ найти оптимальную команду, либо с помощью вышеуказанного подхода, либо с помощью альтернативного подхода?
Редактировать: в тексте полный CSV файл можно найти здесь