关于选择两个列表(最小和最大)的最佳选择的建议

时间:2018-12-10 15:51:17

标签: python genetic-algorithm

我有三个列表,每个列表有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,.....]

我需要选择能产生最高照度和最低LUR值的最佳5种配置。如果无法做到这一点,我需要选择LUR值最低的5种最佳配置,但它们的照度应高于特定阈值,例如450。

我知道应该使用遗传算法解决类似问题,但是我在这一领域经验丰富,如果有人提出建议,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以考虑将数据组织到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()并从config列中切割前5个结果:

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

这将为numpy数组提供配置值。

list(res)
# Result: ['config_a002', 'config_a006', 'config_a001', 'config_a004', 'config_a003']

答案 1 :(得分:1)

给出:

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。您当前的示例数据不够完整,无法给出示例。