import random import itertools #Храним списки пар (элемент, вес). Веса нормализованы. weighted_elements = [[(1, 0.8), (2, 0.1), (3, 0.1)], [(1, 0.3), (2, 0.5), (3, 0.1), (10, 0.1)], [(8, 0.35), (4, 0.25), (2, 0.4)]] #Амплитуда шума. Пусть будет 30% от максимального разброса суммарных весов векторов. amp = 0.3 * sum(max(item[1] for item in sublist) - min(item[1] for item in sublist) for sublist in weighted_elements) #Если все элементы имеют равный вес, то amp == 0, что плохо. #Есть простая альтернатива: amp = 0.3 * len(weighted_elements) combs = sorted(itertools.product(*weighted_elements), key = lambda x: sum(y[1] for y in x) + amp * random.random(), reverse = True) res = [[item[0] for item in vec] for vec in combs] print (res)
Standard input is empty
[[1, 2, 8], [1, 2, 4], [1, 1, 2], [1, 2, 2], [1, 1, 8], [1, 1, 4], [1, 3, 2], [1, 10, 8], [1, 10, 2], [1, 3, 8], [3, 2, 8], [3, 2, 4], [1, 10, 4], [2, 2, 2], [1, 3, 4], [3, 1, 2], [2, 1, 8], [2, 2, 8], [2, 2, 4], [3, 2, 2], [2, 3, 2], [3, 3, 2], [3, 10, 2], [2, 1, 4], [2, 1, 2], [3, 1, 8], [3, 10, 4], [2, 10, 4], [2, 3, 4], [3, 1, 4], [2, 10, 2], [2, 3, 8], [3, 10, 8], [3, 3, 8], [2, 10, 8], [3, 3, 4]]