Giới thiệu
Các Boids Thuật toán là một cuộc biểu tình tương đối đơn giản về hành vi nổi trong một nhóm. Nó có ba quy tắc chính, như được mô tả bởi người tạo ra nó, Craig Reynold:
Mô hình đổ xô cơ bản bao gồm ba hành vi lái đơn giản mô tả cách thức một cá nhân điều khiển cơ động dựa trên các vị trí và vận tốc của các bầy gần đó:
- Tách biệt : chỉ đạo để tránh đông đúc đàn chiên địa phương.
- Sắp xếp : chỉ đạo hướng tới tiêu đề trung bình của các đàn chiên địa phương.
- Sự gắn kết : chỉ đạo để di chuyển đến vị trí trung bình của các đàn chiên địa phương.
Mỗi boid có quyền truy cập trực tiếp vào mô tả hình học của toàn cảnh, nhưng việc đổ xô yêu cầu nó chỉ phản ứng với những người bạn trong một khu phố nhỏ nhất định xung quanh nó. Vùng lân cận được đặc trưng bởi một khoảng cách (được đo từ tâm của boid) và một góc , được đo từ hướng bay của boid. Flockmate bên ngoài khu phố địa phương này được bỏ qua. Vùng lân cận có thể được coi là một mô hình về nhận thức hạn chế (như cá trong nước đục) nhưng có lẽ đúng hơn khi nghĩ về nó như xác định khu vực trong đó các bầy đồng ảnh hưởng đến việc chèo lái.
Tôi không hoàn hảo khi giải thích mọi thứ, vì vậy tôi khuyên bạn nên kiểm tra nguồn . Ông cũng có một số hình ảnh siêu thông tin trên trang web của mình.
Thử thách
Cho số lượng boids (thực thể mô phỏng) và số lượng khung hình, xuất ra hình ảnh động của mô phỏng.
- Các boid phải được hiển thị dưới dạng một vòng tròn màu đỏ, với một đường bên trong vòng tròn hiển thị tiêu đề của nó, đó là hướng mà boid đang chỉ vào:
- Góc của mỗi boid (như được mô tả bởi Reynold) phải là 300 độ. (không phải 360)
- Tiêu đề và vị trí bắt đầu của mỗi boid phải là ngẫu nhiên đồng nhất (nhưng được gieo hạt, sao cho đầu ra vẫn là xác định), cũng như vị trí.
- Nếu bán kính của boid là 1, thì bán kính của vùng lân cận phải là 3.
- Số lượng boids sẽ ở bất cứ đâu từ 2-20.
- Số lượng khung hình sẽ ở bất cứ đâu từ 1-5000
- Hoạt hình nên được phát với tối thiểu 10 mili giây trên mỗi khung hình và tối đa là 1 giây so với số lượng boids. (2 boids = 2 giây mỗi khung hình tối đa, 3 boids = 3 giây mỗi khung hình tối đa, et cetera)
- Hoạt hình đầu ra phải có ít nhất 5 boid-radii bằng 5 boid-radii, gấp rưỡi số lượng boids. Vì vậy, kích thước tối thiểu cho 2 boid sẽ là 10 boid-radii bằng 10 boid-radii, tối thiểu cho 3 boid sẽ là 15 boid-radii bởi 15 boid-radii, et cetera.
- Bán kính của mỗi boid phải tối thiểu là 5 pixel và tối đa là 50 pixel.
- Tốc độ của mỗi boid cần phải được giới hạn để nó không di chuyển hơn 1/5 bán kính của nó trong một khung.
- Đầu ra cần phải được xác định, sao cho cùng một đầu vào sẽ tạo ra cùng một đầu ra nếu chạy nhiều lần.
- Nếu một con boid đạt đến một biên giới, nó sẽ quấn lại phía bên kia. Tương tự như vậy, các khu phố xung quanh mỗi boid cũng nên bao quanh các biên giới.
Quy tắc cho thuật toán
Trong trường hợp này, mỗi boid có một khu vực xung quanh nó kéo dài 300 độ, tập trung vào tiêu đề của boid. Bất kỳ những kẻ thù nào khác trong "khu phố" này đều được coi là "hàng xóm" hoặc (sử dụng thuật ngữ của Reynold) "bầy bạn".
Mỗi boid nên điều chỉnh tiêu đề của nó để tránh va chạm và duy trì khoảng cách thoải mái của một bán kính boid với các nước láng giềng. (Đây là khía cạnh "Tách" của thuật toán. Bán kính bo có thể được bỏ qua, nhưng nó phải giống như một dải cao su, chụp lại đúng vị trí.)
Mỗi boid nên điều chỉnh bổ sung tiêu đề của nó để gần với tiêu đề trung bình của các nhóm khác trong khu vực lân cận, miễn là nó không can thiệp vào quy tắc đầu tiên. (Đây là khía cạnh "Sắp xếp" của thuật toán)
Mỗi con nhím nên tự quay về vị trí trung bình của các bầy của nó, miễn là điều này không gây ra va chạm hoặc can thiệp đáng kể vào quy tắc thứ hai.
Trong bài viết của mình về chủ đề này , ông giải thích điều này như sau:
Để xây dựng một đàn mô phỏng, chúng tôi bắt đầu với một mô hình boid hỗ trợ bay hình học. Chúng tôi thêm các hành vi tương ứng với các lực lượng đối lập tránh va chạm và mong muốn gia nhập đàn. Nói ngắn gọn là các quy tắc và theo thứ tự giảm dần quyền ưu tiên, các hành vi dẫn đến đổ xô mô phỏng là:
- Tránh va chạm: tránh va chạm với những người bạn gần đó
- Kết hợp vận tốc: cố gắng khớp vận tốc với những người bạn gần đó
- Flock Centering: cố gắng ở gần những người bạn gần đó
Mô tả chi tiết hơn về phong trào:
- Việc thực hiện chuẩn của Thuật toán Boids thường thực hiện một phép tính cho từng quy tắc và hợp nhất nó lại với nhau.
- Đối với quy tắc đầu tiên, boid đi qua danh sách các boong lân cận trong vùng lân cận của nó và nếu khoảng cách giữa nó và hàng xóm nhỏ hơn một giá trị nhất định, một vectơ đẩy boid ra khỏi là hàng xóm được áp dụng cho tiêu đề của boid.
- Đối với quy tắc thứ hai, boid tính toán tiêu đề trung bình của các nước láng giềng và thêm một phần nhỏ (chúng ta sẽ sử dụng 1/10 trong thử thách này) về sự khác biệt giữa tiêu đề hiện tại và tiêu đề trung bình so với tiêu đề hiện tại.
- Đối với quy tắc thứ ba và cuối cùng, boid tính trung bình các vị trí của các lân cận, tính toán một vectơ chỉ về vị trí này. Vectơ này được nhân với một số thậm chí nhỏ hơn so với số được sử dụng cho quy tắc 2 (đối với thử thách này, 1/50 sẽ được sử dụng) và được áp dụng cho tiêu đề.
- Các boid sau đó được di chuyển theo hướng của tiêu đề của nó
Dưới đây là một triển khai mã giả hữu ích của Thuật toán Boids.
Ví dụ đầu vào và đầu ra
Đầu vào:Đầu ra:5, 190 (5 boids, 190 khung hình)
Tiêu chí chiến thắng
Đây là mã golf , vì vậy giải pháp nhỏ nhất trong byte sẽ thắng.