Tìm kiếm một thuật toán phân bổ màu sắc leo lên cho các lĩnh vực tường


8

Tôi đã đăng câu hỏi này sớm hơn trên stackoverflow, nơi nó được đóng dưới dạng ngoài chủ đề. Tôi hy vọng nó sống sót ở đây.

Tôi tập thể dục leo núi của chúng tôi, các tuyến đường cần phải được thiết lập lại theo thời gian. Các quy tắc sau được áp dụng:

  • Chúng tôi có tổ chức leo núi với một số màu sắc khác nhau với số lượng khác nhau. - Khi một tuyến đường được đặt trong một khu vực, không có tuyến đường nào khác có cùng màu phải được đặt trong khu vực đó hoặc trong các khu vực lân cận để tránh nhầm lẫn.
  • Một số kết hợp màu sắc phải được tránh trong một khu vực, như trắng / xám hoặc đỏ / hồng.
  • Mục tiêu là có bốn tuyến đường trong mỗi lĩnh vực, ít hơn là ổn nếu bốn tuyến sẽ phá vỡ các quy tắc trên.

Bây giờ tôi đã thử hai cách tiếp cận khác nhau. Cái đầu tiên là Mô phỏng luyện kim trong đó tôi đã khởi tạo bức tường với một mô hình màu ngẫu nhiên (nhưng với trọng lượng màu nhất định) và tính toán độ xấu cho mỗi phối màu. Tính xấu này cũng được tính toán cho sự kết hợp giữa một ngành và các nước láng giềng. Trong mỗi lần lặp, một tuyến được chọn ngẫu nhiên từ khu vực tồi tệ nhất được hoán đổi với một tuyến từ khu vực khác được chọn ngẫu nhiên. Điều này cho thấy một số loại hội tụ, nhưng kết quả không thể sử dụng được (tức là trạng thái kết quả chứa các thành phần có màu gấp đôi hoặc gấp ba).

Sau đó tôi tiếp cận vấn đề từ phía đối diện và bắt đầu với một bức tường trống. Lần này, mọi màu sắc đều có sự phân rã từ một khu vực sang các khu vực lân cận. Nồng độ của các màu tương tự cũng được tăng lên, tức là một tuyến đường màu đỏ làm tăng nồng độ cam trong một khu vực và gần đó. Một nguồn màu ngẫu nhiên có trọng số (xô) đã cho tôi màu tiếp theo của bức tường, được đặt tại khu vực có nồng độ thấp nhất của màu này. Nếu nồng độ vượt quá ngưỡng nhất định, màu sẽ không được thêm vào (nhưng được đặt lại vào thùng). Đây là một phần thành công vì trạng thái kết quả không chứa bất kỳ màu kép nào - nhưng một số lĩnh vực trống hoặc chỉ chứa một màu.

Vậy: Điều gì có thể là một thuật toán thích hợp để giải quyết vấn đề này, với các quy tắc trên? Tôi sẽ vui vẻ thêm thông tin khi có yêu cầu.


Chỉnh sửa 1 - Thêm thông tin:

  • trường hợp thử nghiệm của tôi có 15 lĩnh vực,
  • mỗi khu vực nên chứa 4 tuyến đường
  • phòng tập thể dục thực sự có 3 tòa nhà với trung bình 50 ngành
  • một số khu vực được bố trí xung quanh trụ cột, một số được kết nối bởi mái nhà
  • chúng tôi có khoảng 10 màu giữ khác nhau
  • chiều cao của các khu vực khác nhau giữa 6 (phần mới bắt đầu) và 20 mét (13 dọc + 7 mái), vì vậy chúng tiêu thụ số lượng giữ khác nhau. Tuy nhiên, trung bình là khoảng 12 và điều này có thể được coi là không đổi.
  • có một số lượng giới hạn của mỗi màu, số lượng không bằng nhau
  • một số màu dễ hơn, khó hơn một chút (nghĩa là chúng ta có thể tạo ra một tuyến đường màu vàng với bất kỳ khó khăn nào, trong khi việc tạo ra một tuyến đường màu cam rất dễ dàng cho trẻ em sẽ gần như không thể)
  • một số lĩnh vực là "dễ dàng hơn", vì vậy màu sắc dễ dàng sẽ xuất hiện ở đây (đây là tùy chọn, setters tuyến của chúng tôi có thể làm cho mọi thứ khó hơn hoặc dễ dàng hơn trong phạm vi rộng).
  • chúng ta có thể nói một cách an toàn những màu nào kết hợp tốt với nhau trong một khu vực hoặc trong các khu vực lân cận và những sự kết hợp nào không. Có một số điều ngạc nhiên, chẳng hạn như trắng và đen (combo xấu): cả hai đều chuyển sang màu xám trong khi cao su (giày) hoặc phấn (tay) được để lại trên chúng.
  • một số màu giữ là sự kết hợp như tím / trắng (trong một mẫu sọc).

Chỉnh sửa 2: Một số câu hỏi về thuật toán di truyền

Bây giờ tôi đã tải xuống và biên dịch ParadisEO và thậm chí có IDE của tôi (tôi đang sử dụng Code :: Blocks) để biên dịch ví dụ QuickStart. ParadisEO cung cấp các thuật toán di truyền với một mục tiêu duy nhất cũng như GA đa mục tiêu. GertVdE đề nghị tính toán mức độ phù hợp của từng lĩnh vực và tối đa hóa tổng số thể lực của tất cả các lĩnh vực như một mục tiêu duy nhất. Tôi cũng có thể tối đa hóa thể lực của từng lĩnh vực với GA đa mục tiêu không? Đó sẽ là khoảng 50 mục tiêu.

Ngoài ra, tôi đang vật lộn với định nghĩa của một chức năng chéo hợp lý. Vì số lượng tối đa của mỗi màu là cố định, việc vượt qua có thể dẫn đến các trạng thái bất hợp pháp. Nếu tôi cho phép nhiều hơn số tiền tối đa đã cho trước đó, mẫu tổng thể có thể hội tụ thành một sự lặp lại của các kết hợp ít "rắc rối" hơn trong đó các màu rắc rối đã bị loại bỏ. Mặt khác, tôi cũng có thể loại bỏ các màu dư thừa cho đến khi đạt được mức tối đa, làm cho chức năng chéo không bảo thủ.

(Tôi hoàn toàn mới đối với các thuật toán di truyền)


@Christophe Bạn không nên thêm một hạn chế về khoảng cách tối thiểu / tối đa giữa hai lần giữ trong một tuyến đường?
GertVdE

Hiện tại tôi chỉ muốn quyết định màu nào đi đâu. Kích thước giữ, hình dạng và khoảng cách giữa các lần giữ thực sự được đặt trong một tuyến phụ thuộc vào cấp tuyến mong muốn (độ khó) và phong cách cá nhân của người đặt tuyến.
Christoph

@Christophe: ok. nhưng vấn đề vẫn còn quá mơ hồ: bạn có bao nhiêu màu khác nhau? bạn cần điền bao nhiêu lĩnh vực? Nếu bạn bỏ qua "chất lượng" của các tuyến đường khác nhau như bạn đã đề cập trước đó, bạn có muốn tính đến tổng số lượng giữ bạn có trong mỗi màu và số lần giữ trung bình trên mỗi tuyến (hoặc số tiền chính xác, nếu bạn biết rôi). Nếu không, bạn phải cho rằng bạn có một lượng vô hạn của mỗi màu.
GertVdE

Trong mọi phòng tập thể dục leo núi mà tôi đã tham gia, các tổ chức cho một tuyến đường cụ thể được đánh dấu trên tường liền kề với tổ chức bằng băng dính màu --- màu đặc biệt của tuyến đường. Điều này cho phép người thiết lập tuyến đường tự do lựa chọn trong tất cả các khoản giữ mà không liên quan đến màu sắc của chúng. Bạn đang hy sinh chất lượng tuyến đường cho một thẩm mỹ màu sắc?
Glenn

@Glenn: Chà, bạn ở đâu? Có thể có cách xử lý này. Trong phòng tập thể dục leo núi của chúng tôi (và trên thực tế, tất cả những người tôi đã từng đến), các tuyến đường được đánh dấu bằng màu giữ (đây là ở Hamburg và xung quanh). Băng có xu hướng rơi ra và đôi khi hầu như không nhìn thấy được từ 13 mét bên dưới. Chúng tôi có đủ khả năng để các setters tuyến lựa chọn và cho đến bây giờ chúng tôi chưa bao giờ có cảm giác rằng chúng tôi đang hy sinh chất lượng tuyến đường.
Christoph

Câu trả lời:


2

Tôi sẽ giải quyết vấn đề nêu trên bằng cách sử dụng phương pháp thuật toán di truyền. Bạn mã từng giải pháp dưới dạng một vectơ số nguyên:

  • Giả sử số lượng tuyến đường tối đa cho mỗi ngành là M (bạn chọn); giả sử N ngành
  • Tạo một vectơ mã hóa có kích thước M * N trong đó mỗi phân đoạn đại diện cho một khu vực và mỗi mục trong phân khúc đại diện cho một tuyến đường
  • Gán màu theo giá trị nguyên, chỉ số; sử dụng 0 là không có tuyến đường (để cho phép ít tuyến đường hơn M)
  • Đối với mỗi chỉ số màu, có các giá trị RGB

Sau đó, bạn xác định một hàm tập thể dục là tổng trọng số của chênh lệch màu tối thiểu trong mỗi khu vực và số lượng tuyến đường trong một khu vực (số lượng số không trong vectơ). Bạn có thể sử dụng khung Paradiseo hoặc Inspyred để triển khai Thuật toán di truyền.


Tôi không có kinh nghiệm về trăn, vì vậy tôi sẽ thử Paradiseo. Tôi cũng có Matlab tại nơi làm việc để tôi có thể dành thêm một số giờ cho việc này. Một chức năng khác biệt màu chung sẽ không hoạt động (xem thông tin bổ sung), nhưng tôi có thể đưa ra một chức năng thể dục có tính đến các tuyến đường trong một khu vực và tất cả các tuyến đường xung quanh.
Christoph

Đối với Matlab (hoặc Octave), bạn có thể sử dụng gói GA
GertVdE

Tôi sẽ xem liệu tôi có thể bắt đầu với Paradiseo không (C ++ sẽ dễ dàng mở rộng hơn khi tôi có một thuật toán tốt và muốn thêm UI hoặc những thứ khác). Nếu quá khó, tôi sẽ quay trở lại Matlab. Hộp công cụ tối ưu hóa toàn cầu của Matlab cũng sẽ hoạt động, phải không? Nó bao gồm các thuật toán di truyền.
Christoph

1
Hãy để tôi thêm một nhận xét tầm thường: vì việc hoán đổi màu sắc trong cùng một tuyến đường sẽ không thay đổi chức năng tập thể dục, bạn có thể tạo một bảng gồm tất cả các kết hợp màu có thể "n chọn k" cho một khu vực duy nhất và lưu trữ thay vì chỉ mục màu đến một hàng trong bảng này. Bằng cách làm như vậy, với hai tuyến đường, các tính toán tương thích màu sắc giảm xuống một tra cứu đơn giản thành một ma trận tam giác nhỏ (diag là công đức của sự kết hợp màu sắc mỗi se.)
Stefano M

1
Tôi sẽ chấp nhận câu trả lời này vì tôi đã có thể triển khai GA cho vấn đề này với ParadisEO trong hai ngày. Nó vẫn đang được tiến hành, nhưng nó dường như chạy tốt và tôi sẽ phải tinh chỉnh một số thứ. Có thích hợp để đăng một số chi tiết về việc thực hiện của tôi như là một câu trả lời thêm không?
Christoph

0

Dưới đây là một tổng quan ngắn gọn về việc triển khai hiện tại của tôi, tôi sẽ cố gắng bám sát các khái niệm và không đi sâu vào chi tiết ngôn ngữ. Tôi đã sử dụng ParadisEO Framework là thư viện mẫu C ++ cho các thuật toán di truyền và đã thêm một số boost ở đây và đó.

Leo giữ màu sắc

Các màu giữ được lưu trữ trong một tệp XML dưới dạng một cặp tên và số lượng màu. Số lượng tìm thấy trong một tập tin được thêm vào và chuẩn hóa. Điều này cho phép thể hiện số tiền bằng tổng số tuyến đường có thể được đặt bằng màu này hoặc theo tỷ lệ phần trăm. ID được gán cho mỗi màu, bắt đầu bằng 1. Không được dành riêng cho tuyến đường "trống".

Hình phạt kết hợp màu

Một số màu không kết hợp tốt trong một lĩnh vực hoặc trong các lĩnh vực liền kề. Mọi sự kết hợp màu sắc không tốt được mô tả bởi hai tên màu (như trong tệp XML trước đó, xem ở trên) và một "tính xấu" tùy ý. Trong nội bộ, các giá trị xấu được lưu trữ trong một ma trận được lập chỉ mục bằng ID màu.

Bức tường

Bức tường là một lớp xuất phát từ lớp đại diện bộ gen của ParadisEO để ParadisEO có thể thao tác và đánh giá nó, nhưng một số chức năng khác được thêm vào. Mỗi gen đại diện cho một màu đường theo ID (bao gồm 0 hoặc trống). Các ngành được đại diện bởi một cặp chỉ số cho các gen, để mỗi khu vực có một khởi đầu và kết thúc. Tôi đã sử dụng các trình vòng lặp cho các gen trước tiên, nhưng đối tượng Wall phải được sao chép có thể xây dựng được, điều này sẽ làm mất hiệu lực các trình vòng lặp mà không cần làm việc thêm. Hiện tại, tất cả các lĩnh vực có 4 tuyến, nhưng đó sẽ là cấu hình trong tương lai.

Bức tường cũng có một cái xô màu. Nhóm này chứa một bộ đếm cho mỗi màu, được phân phối như được mô tả trong tệp XML màu. Tổng số màu cộng với tổng số tuyến đường trong Tường. Một màu có thể được chọn từ xô, giảm bộ đếm, và nó cũng có thể được đặt lại, tăng bộ đếm.

Một màu chỉ có thể được thêm vào một khu vực nếu khu vực đó không chứa màu đó (khu vực đó phải duy trì "hợp pháp" khi màu được thêm vào).

Nhà điều hành đánh giá

Toán tử đánh giá tổng hợp tất cả các giá trị xấu trong một khu vực bằng cách sử dụng ma trận độ xấu được mô tả ở trên. Giá trị của mỗi khu vực được lưu trữ trong vectơ thể dục (cũng là một phần của lớp Wall), vì vậy đây là GA đa mục tiêu. Tôi có thể thay đổi nếu cần thiết.

Toán tử giao nhau hai điểm

Toán tử chéo có hai cha mẹ, tạo một bản sao của mỗi (các giá trị bù) và sau đó thực hiện giao thoa hai điểm bằng cách kết hợp lại toàn bộ các lĩnh vực . Ưu điểm của việc này là các lĩnh vực vẫn hợp pháp (không có màu kép). Nhược điểm của bất kỳ hoạt động chéo nào (đối với vấn đề này) là kết quả bù có thể chứa màu thừa nếu màu được phân cụm trong bố mẹ. Một chức năng sửa chữa đã được thêm vào để loại bỏ các tuyến dư thừa (màu 0) một cách ngẫu nhiên. Do đó, sự bù đắp có ít tuyến đường hơn cha mẹ của việc sửa chữa đã thay đổi con cái.

Đột biến 1: Thêm tuyến

Sự suy giảm tiềm năng trong các tuyến đường trong phạm vi được tính bởi một nhà điều hành "thêm tuyến". Nó lấy một màu từ xô của Bức tường và thêm nó vào đâu đó. Nếu đó không phải là một hoạt động hợp pháp, nó không làm gì cả (đôi khi không có chỗ hợp pháp cho một màu còn lại).

Đột biến 2: Trao đổi ngẫu nhiên

Hai tuyến ngẫu nhiên của hai lĩnh vực ngẫu nhiên được hoán đổi. Cặp trao đổi này được tạo cho đến khi các thành phần kết quả là hợp pháp, sau đó trao đổi được thực hiện.

Đột biến 3: Ca

Một số lĩnh vực được dịch chuyển một nơi sang trái.

Bây giờ tôi đã hết thời gian, nhưng tôi có thể thêm thông tin sau. Đặc biệt là việc đánh giá khá đơn giản và các thành phần đã được lập trình như một bằng chứng về conecpt. GA thực sự tối ưu hóa Tường ở một mức độ nào đó, nhưng kết quả không sẵn sàng để sử dụng thực sự. Tôi chắc chắn rằng điều này sẽ cải thiện khi tôi nói chuyện với các setters tuyến và có nhiều quy tắc đánh giá hơn. Hình ảnh cũng sẽ đến khi chúng có sẵn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.