Tôi hiện đang viết AI cho trò chơi được viết bằng C++. AI là khái niệm khá đơn giản, nó chỉ chạy qua cây quyết định và chọn các hành động thích hợp. Trước đây tôi đã sử dụng prolog cho công cụ quyết định nhưng do các nhà phát triển khác sử dụng C++ và một số vấn đề với việc tích hợp mã prolog tôi đang cố gắng chuyển nó sang C++.Mẫu thiết kế cho AI dựa trên quyết định lớn trong C++
Hiện tại tôi có một loạt các sự kiện và quy tắc trong prolog (100+). Nhiều người thể hiện những điều trong hình thức, nếu game_state sau đó làm xyz hành động. Hầu hết các quy tắc khá đơn giản với một số ít phức tạp. Tôi nhìn vào một cách tiếp cận máy tính hữu hạn, nhưng điều đó dường như không quy mô đến các tình huống lớn hơn rất tốt. Nỗ lực đầu tiên của tôi trong việc mã hóa điều này trong c + + là một cơn ác mộng lớn nếu có các trường hợp khác. Tôi có loại mã này xuất hiện ở mọi nơi:
if(this->current_game_state->some_condition == true){
if(this->current_game_state->some_other_condition == false){
//some code
}else{
return do_default_action();
}
}else if(this->current_game->another_condition){
//more code
}
Sự phức tạp trở nên nhanh chóng không thể quản lý được.
Nếu có cách nào tốt để mã loại vấn đề này trong C++? Có bất kỳ mẫu thiết kế tốt nào để đối phó với loại tình huống này không? Không có yêu cầu rằng logic phải được chứa trong nguồn, nó chỉ cần có thể truy cập từ C++. Yêu cầu thực sự duy nhất là nó nhanh chóng hợp lý.
Tôi cũng xem xét các công cụ quy tắc và nếu đủ nhanh, chúng có thể phù hợp. Bạn có biết liệu có một cỗ máy quy tắc C++ nguồn mở nào phù hợp không?
Đó là một máy trạng thái hữu hạn, đó chính xác là những gì anh ấy đã nói trước tiên và thổi vào mặt. – Potatoswatter
Nó không phải là quá nhiều mà một máy nhà nước hữu hạn không phải là những gì tôi muốn, nó đã được nhiều hơn rằng việc thực hiện ngây thơ của một máy nhà nước hữu hạn là quá phức tạp để có thể quản lý. Đề xuất này xuất hiện để giúp quản lý sự phức tạp tốt hơn. Việc sử dụng thông dịch viên dường như chỉ là những gì tôi cần nếu tôi làm theo cách tiếp cận này. Tuy nhiên, tôi vẫn chưa hoàn toàn được bán bằng cách sử dụng một phương pháp máy trạng thái hữu hạn – shuttle87
Đoạn đầu tiên là một máy trạng thái, nhưng quan điểm của tôi là bạn có thể thực hiện nó như một thuật toán định hướng bảng chứ không phải là một bó lồng nhau nếu-then- elses hoặc một tuyên bố chuyển đổi khó chịu lớn. Đoạn thứ hai đang cố gắng hiển thị một DSL bằng cách sử dụng cú pháp C++. Điều này có thể nhiều hơn một máy trạng thái đơn giản. Bạn đã làm việc Prolog, vì vậy thay vì cố gắng dịch nó sang C++, tôi nghĩ rằng nó có thể đơn giản và rõ ràng hơn để dạy C++ cách diễn giải mã/dữ liệu hiện có của bạn. Có lẽ bạn có thể đăng một tập hợp con các quy tắc/sự kiện của bạn để chúng tôi có thể xử lý tốt hơn và đưa ra một ví dụ hợp lý. – xscott