【问题标题】:sort a list of objects and re-index by attribute (fitness) value对对象列表进行排序并按属性(适应度)值重新索引
【发布时间】:2021-01-25 11:48:23
【问题描述】:

在遗传算法中,我有一个indis(人口)列表,其中包含由indi 类型的对象表示的候选解决方案。为了直接进行选择,我想按适应度值对这些个体进行排序。 排序后,它们应该有一个新的索引来表示它们的适应度。

indi.getFitness()  # Returns the fitness.
indi.setId(index)  # sets the index

我最初的方法是不够的,因为它不包括排序:

idx=0
for indi in self.indis: 
    indi.setId(idx)
    idx += 1

问题是:如何按适应度排序并重新索引以使最佳解决方案索引为 0?

【问题讨论】:

  • 不,不能。 setId 改变它的调用对象;理解旨在返回值的集合。为副作用编写一个专门的理解是uuuuglyy。也许您想要map 方法——请参阅map 上的任何教程。
  • 在我发布答案后,您大大改变了问题。这并不酷,虽然我并没有太在意。如果你想改变范围,你应该问一个新问题,虽然它已经被问过了:How to sort a list of objects based on an attribute of the objects?
  • @wjandera,我很抱歉 - 他们阻止我的原因是我的问题不清楚,所以我尽力将问题改写得更具体 - 不过你的贡献很有价值谢谢!

标签: python list sorting object


【解决方案1】:

不,don't use a comprehension for side-effects

但是,您可以使用 enumerate 使其更简洁:

for idx, indi in enumerate(self.indis):
    indi.setId(idx)

【讨论】:

    【解决方案2】:

    由于列表带有内置排序方法,因此可以使用调用适应度方法getFitness() 的 lambda 函数。在这种情况下,使用reverse=True 选项很重要,因为最高适应度意味着最低成本。重新索引由wjandrea 实现为suggested

    def sortByFitness(self):        # sorted population for single generation
        # highest fitness has lowest cost
        self.indis.sort(key=lambda x: x.getFitness(), reverse=True)
        for idx, indi in enumerate(self.indis):
            indi.setId(idx)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-26
      • 2020-04-11
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 2023-04-03
      • 2016-02-08
      相关资源
      最近更新 更多