Do tính chất của câu hỏi, tôi phải bao gồm nhiều thông tin cơ bản (vì câu hỏi của tôi là: làm thế nào để thu hẹp điều này?) Điều đó nói rằng, nó có thể được tóm tắt (theo hiểu biết tốt nhất của tôi) như:
Phương pháp nào tồn tại để tìm tối ưu cục bộ trên các không gian tìm kiếm kết hợp cực lớn?
Lý lịch
Trong cộng đồng superplay được hỗ trợ bởi công cụ, chúng tôi mong muốn cung cấp đầu vào được chế tạo đặc biệt (không được tạo trong thời gian thực) cho bảng điều khiển hoặc trình giả lập trò chơi video để giảm thiểu chi phí (thường là hoàn thành thời gian). Cách này hiện đang được thực hiện là bằng cách chơi các trò chơi frame-by-frame và xác định đầu vào cho mỗi khung hình, thường làm lại các bộ phận của chạy nhiều lần (ví dụ, công bố gần đây chạy cho The Legend of Zelda: Ocarina of Time có tổng cộng 198.590 lần thử lại).
Làm cho các hoạt động này có được mục tiêu của họ thường đi xuống hai yếu tố chính: lập kế hoạch tuyến đường và đi qua. Cái trước là "sáng tạo" hơn nhiều so với cái trước.
Lập kế hoạch lộ trình là xác định cách người chơi nên điều hướng tổng thể để hoàn thành trò chơi và thường là phần quan trọng nhất của hoạt động. Điều này tương tự với việc chọn phương pháp sắp xếp nào sẽ sử dụng, ví dụ. Loại bong bóng tốt nhất trên thế giới đơn giản là sẽ không vượt trội hơn loại sắp xếp nhanh trên 1 triệu yếu tố.
Tuy nhiên, trong mong muốn cho sự hoàn hảo, việc đi qua (cách thức thực hiện tuyến đường) cũng là một yếu tố rất lớn. Tiếp tục tương tự, đây là cách thuật toán sắp xếp được thực hiện. Một số tuyến thậm chí không thể được thực hiện mà không có khung đầu vào rất cụ thể. Đây là quá trình hỗ trợ công cụ tẻ nhạt nhất và là điều khiến cho việc sản xuất một hoạt động hoàn thành phải mất hàng tháng hoặc thậm chí nhiều năm. Đó không phải là một quá trình khó khăn (với con người) vì phải thử các biến thể khác nhau của cùng một ý tưởng cho đến khi một ý tưởng được coi là tốt nhất, nhưng con người chỉ có thể thử rất nhiều biến thể trong khoảng chú ý của họ. Việc áp dụng máy móc cho nhiệm vụ này có vẻ thích hợp ở đây.
Mục tiêu của tôi bây giờ là cố gắng tự động hóa quá trình truyền tải nói chung cho hệ thống Nintendo 64 . Không gian tìm kiếm cho vấn đề này là xa quá lớn để tấn công với một cách tiếp cận brute-force. Một phân đoạn khung n của một lần chạy N64 có 2 30n đầu vào có thể, nghĩa là chỉ 30 khung hình đầu vào (một giây ở 30FPS) có 2 900 đầu vào có thể; sẽ không thể kiểm tra các giải pháp tiềm năng này, chứ đừng nói đến những giải pháp đó trong hai giờ.
Tuy nhiên, tôi không quan tâm đến việc thử (hay đúng hơn, thậm chí sẽ không cố gắng) tổng tối ưu hóa toàn cầu của một hoạt động đầy đủ. Thay vào đó, tôi muốn, đưa ra một đầu vào ban đầu, xấp xỉ tối ưu cục bộ cho một phân đoạn cụ thể của hoạt động (hoặc tối ưu n địa phương gần nhất , cho một loại tối ưu hóa toàn cầu) . Đó là, đưa ra một tuyến đường và một tuyến đường ban đầu của tuyến đường đó: tìm kiếm các hàng xóm của tuyến đường đó để giảm thiểu chi phí, nhưng không suy thoái trong việc thử tất cả các trường hợp có thể giải quyết vấn đề.
Do đó, chương trình của tôi nên có trạng thái bắt đầu, luồng đầu vào, chức năng đánh giá và xuất tối ưu cục bộ bằng cách giảm thiểu kết quả đánh giá.
Tình trạng hiện tại
Hiện tại tôi có tất cả các khung chăm sóc. Điều này bao gồm đánh giá một luồng đầu vào thông qua thao tác của trình giả lập, thiết lập và phá vỡ, cấu hình, v.v. Và như một trình giữ chỗ của các loại, trình tối ưu hóa là một thuật toán di truyền rất cơ bản. Nó chỉ đơn giản là đánh giá một quần thể các luồng đầu vào, lưu trữ / thay thế người chiến thắng và tạo ra một quần thể mới bằng cách thay đổi luồng chiến thắng. Quá trình này tiếp tục cho đến khi một số tiêu chí tùy ý được đáp ứng, như thời gian hoặc số thế hệ.
Lưu ý rằng phần chậm nhất của chương trình này sẽ là đánh giá luồng đầu vào . Điều này là do điều này liên quan đến việc mô phỏng trò chơi cho n khung hình. (Nếu tôi có thời gian tôi sẽ viết trình giả lập của riêng mình, cung cấp các hook cho loại công cụ này, nhưng bây giờ tôi còn lại để tổng hợp tin nhắn và sửa đổi bộ nhớ cho trình giả lập hiện có từ một quy trình khác.) là khá hiện đại, đánh giá 200 khung hình mất khoảng 14 giây. Như vậy, tôi thích một thuật toán (được lựa chọn) để giảm thiểu số lượng đánh giá hàm.
Tôi đã tạo một hệ thống trong khung quản lý đồng thời các trình giả lập. Như vậy tôi có thể đánh giá một số luồng cùng một lúc theo thang hiệu suất tuyến tính, nhưng thực tế, số lượng trình giả lập đang chạy chỉ có thể là 8 đến 32 (và 32 thực sự đang đẩy nó) trước khi hiệu năng hệ thống suy giảm. Điều này có nghĩa (được đưa ra lựa chọn), một thuật toán có thể xử lý trong khi đánh giá đang diễn ra sẽ rất có lợi, bởi vì trình tối ưu hóa có thể thực hiện một số công việc nặng trong khi chờ đánh giá.
Như một thử nghiệm, chức năng đánh giá của tôi (đối với trò chơi Banjo Kazooie ) là tính tổng, trên mỗi khung hình, khoảng cách từ người chơi đến điểm mục tiêu. Điều này có nghĩa là giải pháp tối ưu là đến càng gần điểm đó càng nhanh càng tốt. Hạn chế đột biến chỉ với thanh analog, phải mất một ngày để có được một giải pháp ổn . (Đây là trước khi tôi triển khai đồng thời.)
Sau khi thêm đồng thời, tôi kích hoạt tính năng đột biến của nút A và thực hiện chức năng đánh giá tương tự tại một khu vực yêu cầu nhảy. Với 24 trình giả lập đang chạy, mất khoảng 1 giờ để đạt được mục tiêu từ luồng đầu vào trống ban đầu, nhưng có lẽ sẽ cần phải chạy trong nhiều ngày để đạt được bất cứ điều gì gần với tối ưu.
Vấn đề
Vấn đề tôi gặp phải là tôi không biết đủ về lĩnh vực tối ưu hóa toán học để biết cách mô hình hóa đúng vấn đề tối ưu hóa của mình ! Ví dụ, tôi có thể theo ý tưởng khái niệm của nhiều thuật toán như được mô tả trên Wikipedia, nhưng tôi không biết cách phân loại vấn đề của mình hoặc chọn thuật toán tiên tiến cho danh mục đó.
Từ những gì tôi có thể nói, tôi có một vấn đề kết hợp với một khu phố cực kỳ lớn . Trên hết, chức năng đánh giá cực kỳ không liên tục, không có độ dốc và có nhiều cao nguyên . Ngoài ra, không có nhiều ràng buộc, mặc dù tôi sẵn sàng thêm khả năng diễn đạt nếu điều đó giúp giải quyết vấn đề; Tôi muốn cho phép chỉ định rằng nút Start không nên được sử dụng, ví dụ, nhưng đây không phải là trường hợp chung.
Câu hỏi
Vì vậy, câu hỏi của tôi là: làm thế nào để tôi mô hình này? Tôi đang cố gắng giải quyết vấn đề tối ưu hóa nào? Tôi nên sử dụng thuật toán nào? Tôi không sợ đọc các tài liệu nghiên cứu vì vậy hãy cho tôi biết những gì tôi nên đọc!
Theo trực giác, một thuật toán di truyền không thể là tốt nhất, bởi vì nó dường như không thực sự học được. Ví dụ: nếu nhấn Start dường như luôn làm cho việc đánh giá trở nên tồi tệ hơn (vì nó tạm dừng trò chơi), cần có một số nhà thiết kế hoặc bộ não học được: "nhấn Bắt đầu tại bất kỳ thời điểm nào là vô ích." Nhưng ngay cả mục tiêu này cũng không tầm thường như âm thanh của nó, bởi vì đôi khi nhấn bắt đầu là tối ưu, chẳng hạn như trong cái gọi là "tạm dừng nhảy lùi dài" trong Super Mario 64 ! Ở đây bộ não sẽ phải học một mô hình phức tạp hơn nhiều: "nhấn Bắt đầu là vô ích trừ khi người chơi ở trạng thái rất cụ thể này và sẽ tiếp tục với một số lần nhấn nút ."
Có vẻ như tôi nên (hoặc máy có thể học) thể hiện đầu vào theo một số cách khác phù hợp hơn với sửa đổi. Đầu vào trên mỗi khung hình có vẻ quá chi tiết, bởi vì những gì thực sự cần là "hành động", có thể trải rộng trên nhiều khung hình ... nhưng nhiều khám phá được thực hiện trên cơ sở từng khung hình, vì vậy tôi không thể loại trừ hoàn toàn ( tạm dừng nói trên nhảy lùi đòi hỏi độ chính xác ở mức khung hình). Có vẻ như thực tế là đầu vào được xử lý theo kiểu huyết thanh nên là thứ có thể được viết hoa, nhưng tôi không biết làm thế nào.
Hiện tại tôi đang đọc về Tìm kiếm Tabu (Phản ứng), Tìm kiếm hàng xóm quy mô rất lớn, Tối ưu hóa dựa trên việc dạy học và Tối ưu hóa thuộc địa.
Có phải vấn đề này đơn giản là quá khó để giải quyết với bất cứ điều gì khác ngoài thuật toán di truyền ngẫu nhiên? Hay nó thực sự là một vấn đề tầm thường đã được giải quyết từ lâu? Cảm ơn đã đọc và cảm ơn trước cho bất kỳ câu trả lời.