Tôi có một danh sách các đối tượng (nhiễm sắc thể) trong đó có một phòng tập thể dục thuộc tính (chromosome.fitness là giữa 0 và 1)Thể hình cân đối lựa chọn (roulette bánh xe lựa chọn) trong Python
Cho một danh sách các đối tượng như vậy, làm thế nào có thể Tôi thực hiện một chức năng mà trả về một nhiễm sắc thể duy nhất có cơ hội được chọn là tỷ lệ thuận với thể dục của nó? Tức là, nhiễm sắc thể với thể dục 0,8 có khả năng được chọn là một với tập thể dục 0,4 lần.
Tôi đã tìm thấy một vài triển khai Python và mã giả, nhưng chúng quá phức tạp đối với yêu cầu này: hàm chỉ cần danh sách các nhiễm sắc thể. Nhiễm sắc thể lưu trữ phòng tập thể dục của riêng mình dưới dạng biến nội bộ.
Việc triển khai tôi đã viết là trước khi tôi quyết định cho phép nhiễm sắc thể lưu trữ phòng tập thể dục của riêng mình, vì vậy có rất nhiều danh sách và thứ phức tạp hơn.
---------------------------- CHỈNH SỬA ---------------- ------------
Cảm ơn Lattyware. Chức năng sau đây dường như hoạt động.
def selectOne(self, population):
max = sum([c.fitness for c in population])
pick = random.uniform(0, max)
current = 0
for chromosome in population:
current += chromosome.fitness
if current > pick:
return chromosome
Nếu bạn có nhiều sự lựa chọn, hoặc bạn phải chọn nhiều giá trị với cùng một bộ trọng lượng, bạn cũng có thể biến O (n) giải pháp này vào một giải pháp O (log (n)) bằng cách sử dụng một tìm kiếm nhị phân, hoặc thậm chí một giải pháp O (1) bằng cách sử dụng một số loại bảng tra cứu. –
@SvenMarnach Điều này đúng, tôi đưa ra giải pháp đơn giản nhất ở đây, không nhất thiết phải là nhanh nhất - điều đó thực sự đáng chú ý. –
[Bài viết này] (http://www.keithschwarz.com/darts-dice-coins/) đưa ra một giải thích tốt đẹp về việc phát triển một thuật toán O (1) cho mẫu này. – Dougal