У меня есть список кортежей, состоящих из 1000 идентификаторов объектов и их оценок, то есть:
scored_items = [('14',534.9),('4',86.0),('78',543.21),....]
.
Пусть T
будет агрегированным баллом 20 самых высоких баллов.items.
Это просто.Используя python:
top_20 = sorted(score_items, key=lambda k: k[1],reverse = True)[:20]
T = sum(n for _, n in top_20)
Далее, пусть t
равняется четверти T
.То есть в python: t = math.ceil(T/4)
Мой вопрос : каков наиболее эффективный способ случайного выбора 20 элементов (без замены) из scored_items
, чтобы их суммарный балл был равен илибольше чем (но никогда не ниже) t
?Они могут включать или не включать элементы из top_20
.
Предпочитают ответ в Python и предпочитают не слишком полагаться на внешние библиотеки
Справочная информация: Это алгоритм ранжирования предметов, который доказательство стратегии согласно эзотерической - но полезной - теореме теории игр.Источник: раздел 2.5 в этой статье, или просто прочитайте сноску 18
на странице 11 этой же ссылки.Кстати, стратегия доказательства , по сути, означает, что это трудно для игры.
Я начинающий программист на питоне и уже давно думаю, как решить эту проблему, но просто не могу показатьсяобернуть мою голову вокруг этого.Было бы здорово узнать, как эксперты подойдут и решат это.
Полагаю, самый простой (и, возможно, наименее эффективный) способ - генерировать случайным образом наборы из 20 предметов, пока сумма их баллов не превысит или не станет равной t
.
Но должен быть лучший способ сделать это правильно?