Как отслеживать индекс элементов в списке после его сортировки? - PullRequest
1 голос
/ 23 апреля 2020

Ps1, Ps2, Ps3, Ps4, Ps5 и F являются заданными значениями. Мне нужно найти значения a, b, c, d и e, которые максимизируют результат этого уравнения:

60 + a (Ps1-F) + b (Ps2-F) + c (Ps3-F) + d (Ps4-F) + e (Ps5-F) = 0

Ограничения заключаются в том, что сумма a, b, c, d и e никогда не может быть меньше чем 20, и каждый из этих элементов может быть только 0 или 10.

Это то, что я сделал до сих пор:

a = 0
b = 0
c = 0
d = 0
e = 0

values = [a, b, c, d, e]


def roll_over(f, p1, p2, p3, p4, p5):
    counter = 0
    constants = [p1 - f, p2 - f, p3 - f, p4 - f, p5 - f]

    for i in constants:
        if i >= 0:
            values[counter] = 10
        else:
            values[counter] = 0
        counter = counter + 1

После этого мне нужно обработать случай, в котором я иметь только отрицательные значения в константах списка (и, следовательно, приведенный выше код дает мне только 0 для значений списка. Идеальная стратегия состоит в том, чтобы взять два самых больших элемента в константах списка (даже если они отрицательные) и присвоить число 10 двум элементы в списочных значениях с тем же индексом, оставляя остальные как 0 сортируя список постоянно, я не могу найти способ вернуться к соответствующим элементам в значениях (что быть d и b соответственно).

Спасибо!

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Учитывая, что у вас есть только 5 переменных с 2 возможными значениями в каждой, будет только 32 возможных комбинации, вы можете позволить себе использовать для этого подход грубой силы и проверять каждую действительную комбинацию, чтобы получить комбинацию с максимальным результатом:

def fn(a,b,c,d,e):
    Ps1,Ps2,Ps3,Ps4,Ps5,F = 1.5, 2.3, 1.0, 0.8, 4.9, 1.9 # your given values
    return 60 + a*(Ps1-F) + b*(Ps2-F) + c*(Ps3-F) + d*(Ps4-F) + e*(Ps5-F)


from itertools import product

candidates = (values for values in product(*[(0,10)]*5) if sum(values)>=20)
a,b,c,d,e  = max( candidates, key=lambda values:fn(*values))

выход:

print(a,b,c,d,e, "=", fn(a,b,c,d,e))
# 0 10 0 0 10 = 94.4
0 голосов
/ 23 апреля 2020

Из того, что я могу собрать, вам нужна функция, подобная этой.

Он копирует список, находит 2 самых больших, используя heapq.largest, заменяет их на 10 или 0 и возвращает новый список ..

def replace_with_10(values):
    import heapq

    # get the largest 2 values in the list.
    largest, second_largest = heapq.nlargest(2, values)
    # >>> -4 -5

    # enumerate over the list applying hte changes..
    for idx, num in enumerate(values):
        if num in (largest, second_largest):
            values[idx] = 10
        else:
            values[idx] = 0
    return values

values = replace_with_10([-11, -5, -50, -4, -52])
# >>> [0, 10, 0, 10, 0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...