Sử dụng ngôn ngữ nào để lập trình di truyền


15

Là một phần của bài tập, tôi sẽ phải viết một thuật toán lập trình di truyền để dự đoán mức độ ô nhiễm trong khí quyển. Vì tôi không có kinh nghiệm, bất cứ ai cũng có thể chỉ cho tôi con trỏ đến các đề xuất của ngôn ngữ lập trình trong đó các chương trình phát triển sẽ được viết .

Làm rõ: Tôi không hỏi ngôn ngữ nào sẽ là ngôn ngữ tôi sẽ tự viết thuật toán di truyền (vì tôi sẽ có thể tự đưa ra quyết định), tôi đang hỏi ngôn ngữ lập trình nào nên tạo ra các chương trình phát triển.

Người hướng dẫn của tôi đã đề xuất Lisp, nhưng tôi không thích ý tưởng này --- đầu tiên tôi sẽ phải làm việc với một loại Cây Cú pháp Trừu tượng, thứ hai đáng tin cậy khi thực hiện giao thoa trên cấu trúc cây có thể là một mớ hỗn độn.

Tôi muốn sử dụng cái gì đó là dành riêng cho chương trình di truyền như dấu gạch chéo / A . SlashA không yêu cầu làm việc trên AST --- các chương trình trong mã byte chỉ là một mảng int có thể thay đổi trong bất kỳ sự hợp nhất nào vì mỗi mảng int đại diện cho một số chương trình gạch chéo / A.

Nhận xét bổ sung:

  • Tôi muốn tránh thao túng AST!
  • Vấn đề này là khó (có thể không khó như dự đoán giá trị cổ phiếu). Điều này là do thực tế là (rất có thể) chúng tôi không có đủ thông tin đầu vào (có một số tham số ẩn). Tạo một mô hình có hiệu suất tốt hơn mà mô hình trả về có nghĩa là một thách thức (mô hình trung bình có 35% MAPE), hầu hết các mô hình có MAPE khoảng 25%, tốt nhất có 20%.
  • Tôi muốn có một ngôn ngữ quản lý bộ dữ liệu với nhiều tính năng với giả định rằng tôi không chắc cái nào quan trọng. (Dấu gạch chéo / A có nhược điểm ở đây --- trong các tính năng nhập ngôn ngữ này được đọc tuần tự --- vì vậy một số tính năng sẽ được sử dụng với xác suất lớn hơn).
  • Tôi muốn có thể lập trình cái này trong Python, vì vậy lib python sẽ rất tuyệt --- nhưng tôi có thể thực hiện các ràng buộc cho C / C ++ (không Java, không Matlab, v.v.).

Tôi ý thức đây là một câu hỏi khảo sát, vì vậy nếu nó là sớm cho câu hỏi như vậy xin vui lòng đóng nó, nhưng tôi cảm thấy nó là đủ cụ thể.

Câu trả lời:


14

Vấn đề ô nhiễm của bạn có lẽ không cần nhiều ngôn ngữ. Nó trông giống như một hồi quy tượng trưng chứ không phải là một vấn đề kiểm soát, trong trường hợp đó bạn chỉ có thể sử dụng GP cây tiêu chuẩn, với các tính năng và một vài hằng số hữu ích như bộ thiết bị đầu cuối và các toán tử có liên quan trong bộ chức năng. Hệ thống GP sẽ loại bỏ các tính năng không liên quan và có các kỹ thuật để xử lý các bộ dữ liệu rất lớn. Nói chung, chỉ định bộ hàm nhỏ nhất mà bạn ước tính có thể giải quyết vấn đề và cẩn thận mở rộng nó nếu cần.

Bạn sẽ cần phải chọn giữa cây và GP tuyến tính sớm. Lisp là cây, Slash / A là tuyến tính. Đọc cả hai để hiểu những ưu và nhược điểm, nhưng từ những gì bạn đã viết, tôi đề xuất một hệ thống GP cây đơn giản. Không quá khó để viết riêng của bạn, nhưng đã có các triển khai Python hiện có. Những cái dưới đây là dành cho các thuật toán tiến hóa trong Python nói chung nhưng không phải tất cả đều làm GP và một số không hoạt động:

  1. PyGressionGP (GP cho hồi quy tượng trưng trong Python) - http://code.google.com.vn/p/pyTHERiongp/
  2. PyGene - https://github.com/blaa/PyGene
  3. Một lập trình di truyền đơn giản trong Python - http://zhanggw.wordpress.com/2009/11/08/a-simple-genetic-programming-in-python-4/
  4. Pyevolve - https://github.com/perone/Pyevolve - cũng xem blog - http://blog.christianperone.com - và bài đăng này - http://blog.christianperone.com/?p= 549
  5. esec (Tính toán tiến hóa trong Python) - http://code.google.com.vn/p/esec/
  6. Đào - http://code.google.com.vn/p/peach/
  7. PyBrain (thực hiện rất nhiều, không chỉ NN) - http://pybrain.org/
  8. dione - http://dione.sourceforge.net/
  9. PyGEP (Lập trình biểu hiện di truyền) - http://code.google.com.vn/p/pygep/
  10. deap (Thuật toán tiến hóa phân tán) - http://code.google.com.vn/p/deap/

Ngoài ra, hãy xem cuốn sách giới thiệu (miễn phí) về GP của các tác giả GP nổi tiếng Poli, Langdon và McPhee:

Hướng dẫn thực địa về lập trình di truyền - http://www.gp-field-guide.org.uk/


Bạn có bất cứ tài liệu tham khảo nào về ưu và nhược điểm của cây linar và cây GP không?
jb.

Tôi đã thấy một vài so sánh nhưng không có tài liệu tham khảo cụ thể nào. Bạn có thể nhìn vào những gì Banzhaf và Brameier xuất bản vào những năm 2000 - họ đã làm khá nhiều công việc về GP tuyến tính và xuất bản một cuốn sách về LGP vào năm 2007 tôi nghĩ.
Graham Jones

Hừm ... tại sao những người này không đoàn kết?
vonPetrushev

Tôi không chắc ý của bạn là gì - tại sao người GP và cây tuyến tính không hợp nhất? Không có sự phân chia tôn giáo, chúng chỉ là những hương vị khác nhau của cùng một ý tưởng (và cũng có những thứ khác, như Gene Expression Progamming (GEP) - gen-expression-programming.com ).
Graham Jones

1
Tôi không nói rằng cây GP là ác hay sth. Tôi chỉ muốn thực hiện triển khai của riêng mình, và tuyến tính dễ dàng hơn nhiều. Tôi đã làm việc nguyên mẫu Python trong 4 giờ từ đầu.
jb.

4

Nếu bạn định phát triển một chương trình, dù sao bạn cũng có thể thao tác một cây cú pháp; theo cách đó, bất cứ chương trình nào bạn phát triển sẽ tự động được tổng hợp chính xác.

Có hai điều bạn sẽ muốn ghi nhớ khi chọn ngôn ngữ.

  1. Tránh các cấu trúc cấp thấp có thể khiến chương trình phát triển bị sập trên một số dữ liệu. Ví dụ, số học con trỏ. Nếu bạn định sử dụng C hoặc C ++ làm ngôn ngữ cho các chương trình phát triển của mình, bạn có thể muốn giới hạn nó thành phiên bản không có số học con trỏ.
    Tôi sẽ bỏ phiếu chống lại ngôn ngữ lắp ráp vì những lý do tương tự, mặc dù các máy ảo như JVM và CLR sẽ cung cấp cho bạn một cái gì đó của mạng lưới an toàn.
  2. Thích hợp cho các tập dữ liệu lớn; nếu tôi hiểu chính xác bài tập của bạn, các chương trình đầu ra sẽ phải tự thao tác các tập dữ liệu lớn.

Bạn có thể sẽ muốn sử dụng một ngôn ngữ mục tiêu mà bạn đã quen thuộc. Bản thân tôi không quen thuộc với Python, nhưng AFAIK nó đáp ứng các tiêu chí trên, vì vậy nó sẽ là một lựa chọn tốt cho ngôn ngữ mục tiêu của bạn.


1
Xem github.com/arturadib/slash-a --- trong ngôn ngữ này, bạn không có thao tác AST! Chương trình được lặp lại dưới dạng một mảng của mã byte và vì mỗi mảng là một chương trình chính xác, bạn có thể sử dụng bất kỳ hoạt động di truyền nào bạn muốn.
jb.
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.