Предложение по подбору лучших вариантов двух списков (минимального и максимального) питона - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть три списка, каждый список имеет 200 000 пунктов.Первый список под названием «config» представляет собой список имен конфигурации (это конфигурация жалюзи).Второй список имеет характеристики освещенности каждой конфигурации (в том же порядке, что означает, что config_a001 дает значение освещенности 350).В последнем списке есть значение для каждого конфига (также в том же порядке, поэтому config_002 имеет значение 0,24)

config = ['config_a001', 'config_a002', ......]
illuminnace = [350, 376, 260, 500, 450,......]
LUR_value = [0.3,0.24,.7,.1,.....]

Мне нужно выбрать 5 лучших конфигураций, которые дают наибольшую освещенность и самое низкое значение LUR.Если это невозможно, мне нужно выбрать 5 лучших конфигураций с наименьшим значением LUR, но их освещенность должна быть выше определенного порога, скажем, 450.

Я знаю, что такие вещи должны решаться с использованиемгенетический алгоритм, но у меня есть опыт в этой области, я был бы признателен, если бы кто-нибудь здесь дал предложение.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Дано:

config = ['config_a001', 'config_a002', 'config_a003', 'config_a004','config_a005']
illuminnace = [350, 376, 260, 500, 450]
LUR_value = [0.3,0.24,.7,.1,.3]

Если «оптимизация» является самой высокой illuminnace с самой низкой LUR_value, вы можете сжать списки вместе, чтобы сформировать кортежи данных:

>>> list(zip(config,illuminnace,LUR_value))
[('config_a001', 350, 0.3), ('config_a002', 376, 0.24), ('config_a003', 260, 0.7), ('config_a004', 500, 0.1), ('config_a005', 450, 0.3)]

А затем сортируйте их с помощью функции key:

>>> sorted(zip(config,illuminnace,LUR_value),key=lambda t: (-t[1],t[2]))
[('config_a004', 500, 0.1), ('config_a005', 450, 0.3), ('config_a002', 376, 0.24), ('config_a001', 350, 0.3), ('config_a003', 260, 0.7)]

Если вы хотите фильтровать, добавьте выражение после zip, но перед sorted, чтобы отфильтровать по соответствующим критериям:

>>> sorted((t for t in zip(config,illuminnace,LUR_value) if t[1]>=450),key=lambda t: (-t[1],t[2]))
[('config_a004', 500, 0.1), ('config_a005', 450, 0.3)]

Если у вас более сложные критерии группировки, либо напишите пользовательскую ключевую функцию для сортировки, которая выражает ее, либо рассмотрите возможность использования itertools.groupby .Данные вашего текущего примера недостаточно полны, чтобы привести пример.

0 голосов
/ 10 декабря 2018

Вы можете подумать об организации данных в pandas DataFrame:

import pandas as pd

config = ['config_a001', 'config_a002', 'config_a003', 'config_a004', 'config_a005', 'config_a006']
il = [350, 376, 310, 340, 290, 375]
lur = [0.3, 0.24, 0.21, 0.31, 0.24, 0.28]

Создать словарь из ваших списков

d = {'config': config, 'il': il, 'lur': lur}

Создать объект DataFrame из вашего словаря

df = pd.DataFrame(d)

Используйте sort_values() и нарезайте верхние 5 результатов из столбца config:

res = df.sort_values(['il', 'lur'], ascending=[False, True])[:5]['config'].values

Это обеспечивает массив значений со значениями конфигурации.

list(res)
# Result: ['config_a002', 'config_a006', 'config_a001', 'config_a004', 'config_a003']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...