Trong phần này, chúng tôi sẽ trình bầy chi tiết về thuật toán thuật được sử dụng để điều khiển sự di chuyển của các agent. Đây là một thuật toán sử dụng một số các thuật toán khác đơn giản hơn.
Hình 3-8: Thuật toán tính toán di chuyển của agent
Hình 3-8 là biểu đồ của thuật toán tính toán sự di chuyển của agent. Thuật toán này được cài đặt trong phương thức drive() của lớp Vehicle. Trong các thuật toán được sử dụng bên trong phương thức này, thì các thuật toán quan trọng nhất bao gồm:
(1) Thuật toán xây dựng kế hoạch lái xe lý tưởng của agent
(2) Thuật toán kiểm tra va chạm với agent khác nếu đi theo một kế hoạch lý tưởng (3) Thuật toán kiểm tra lựa chọn tránh xe khi có agent khác đang di chuyển phía trước
Đây là bước đầu tiên cần thực hiện trong giải thuật tính toán sự di chuyển của các agent và nó thể hiện được khả năng lập kế hoạch của các agent tham gia giao thông. Ở đây, kế hoạch lái xe lý tưởng là kế hoạch lái xe của agent nhằm đi đến đích trong thời gian ngắn nhất, nhưng đây là kế hoạch lái xe khi agent coi như không có bất cứ agent nào khác trên đường (vì thế nó được gọi là lý tưởng).
Đây thực chất là một vòng lặp lần lượt xác định các vị trí tiếp theo của xe trên đường. Ở mỗi lần lặp, agent sẽ “tưởng tượng” vị trí tiếp theo của mình bằng cách lấy tọa độ hiện tại dịch lên phía trước một khoảng nào đó. Độ dài mỗi lần dịch chuyển sẽ được xác định tùy thuộc vào vận tốc hiện tại, nhưng luôn phải nhỏ hơn chiều dài của xe để đảm bảo việc tính toán va chạm với agent khác một cách chính xác (thực hiện ở thuật toán (2)).
Hình 3-9: Agent lập kế hoạch lý tưởng trên đường dài và thẳng
Hình 3-9 minh họa một agent lập một kế hoạch lái xe lý tưởng trên đường thẳng dài. Nếu không có agent nào khác, agent cứ đi theo kế hoạch này sẽ đến đích nhanh nhất. Hình ảnh này cho ta thấy mối liên hệ giữa số lần dịch chuyển và thuộc tính planTimecủa agent. Hay nói đúng hơn planTime sẽ xác định số lần dịch chuyển trong kế hoạch. Gọi ∆l là độ dài mỗi lần dịch chuyển, do đó thời gian mỗi lần dịch chuyển là:
∆t = ∆l/v
Với v là vận tốc hiện thời của xe, khi đó số lần dịch chuyển (số lần lặp) sẽ là:
Với đoạn đường thẳng dài như hình 3-9, hướng dịch chuyển cho mỗi lần dịch chuyển luôn trung với hướng đường. Tuy nhiên, với hệ thống đường phức tạp, có nhiều lối rẽ, nhiều đoạn đường đổi hướng, ta cần phải có cách xác định được hướng dịch chuyển nào đó. Ta thấy ở mỗi thời điểm dịch chuyển, agent có 3 lựa chọn là: tiếp tục dịch chuyển thẳng về phía trước, dịch chuyển về phía trái, dịch chuyển về phía phải. Trong 3 hướng này, ta chỉ cần chọn hướng làm cho độ dài còn lại trên toàn bộ tuyến đường là ngắn nhất.
Hình 3-10: Thuật toán xây dựng kế hoạch di chuyển lý tưởng của agent
Từ những cơ sở tính toán ở trên, chúng tôi xin đưa ra biểu đồ mô tả thuật toán xây dựng lế hoạch di chuyển lý tưởng của agent trên hệ thống đường bất kỳ trong hình 3-10.
Hình 3-11 mô tả một agent lập kế hoạch lý tưởng trên một đoạn đường bất kỳ. Vận tốc hiện thời của agent là 30km/h và thời gian của kế hoạch dự tính là 600ms tức là độ dài của quảng đường dự tính là 5m. Khoảng cách dịch chuyển mỗi lần là 1m, nên kế hoạch sẽ được xây dựng qua 5 lần dịch chuyển. Các điểm ở đầu mút ở mỗi mũi tên in đậm chính là các điểm mà agent sẽ hướng tới để thực hiện việc di chuyển lý tưởng.
Hình 3-11: Agent lập kế hoạch di chuyển lý tưởng trên hệ thống đường bất kỳ
Agent sẽ di chuyển theo kế hoạch lý tưởng nếu nhận thấy không va chạm với bất cứ agent nào khác. Nhưng nếu nhận thấy sẽ va chạm với agent khác, agent sẽ xem xét việc tránh va chạm hoặc giảm tốc nếu bắt buộc. Thuật toán kiểm tra va chạm với các agent khác nếu di chuyển theo kế hoạch lý tưởng sẽ được mô tả ở mục tiếp theo.
3.3.2.2. Kiểm tra va chạm với agent khác nếu di chuyển theo kế hoạch lý tưởng
Bược tiếp theo trong thuật toán tính toán sự di chuyển của agent là kiểm tra va chạm với các agent khác nếu đi theo hành trình lý tưởng đã định ra. Trong một môi trường có nhiều agent, mỗi agent đều có cảm nhận về các agent xung quanh trong một phạm vi nào đó.
Trong hệ thống giao thông, mỗi agent đóng vai trò người tham gia giao thông đều có thông tin các agent đang di chuyển ở phía trước và ở hai bên trong một phạm vi giới hạn. Các thông tin này bao gồm vị trí, hướng, và tốc độ của các agent. Nhờ thông tin này mà agent có thể cảm nhận được sẽ va chạm với agent khác hay không khi đi theo một hành trình nào đó.
Hình 3-12 minh họa một agent cảm nhận được sự va chạm với agent khác nếu đi theo lộ trình của kế hoạch lý tưởng. Nhờ nhận biết được vị trí, hướng, và tốc độ hiện thời của agent B, agent A sẽ cảm nhận được các vị trí tiếp theo của agent B ở mỗi lần dịch chuyển. Nhờ đó agent A có thể dự tính được khoảng cách giữa nó và agent B ở các thời điểm này và nếu khoảng cách ấy là đủ nhỏ, nó có thể kết luận va chạm có thể sẽ xảy ra.
Ở hình 3-13, agent A nhận thấy trong các thời điểm khi dịch chuyển đến vị trí thứ nhất, thứ hai và thứ ba trên lộ trình của kế hoạch lý tưởng, nó sẽ không va chạm với bất cứ agent nào. Nhưng ở thời điểm khi dịch chuyển đến vị trí thứ tư, agent A đã cảm nhận được
Hình 3-12: Agent cảm nhận được va chạm với agent khác
sẽ xảy ra va chạm với agent B. Do đó, agent A cần hủy bỏ việc đi theo lộ trình này và phải xem xét các lựa chọn khác.
Hình 3-13: Agent hình dung vị trí của agent khác ở các thời điểm dịch chuyển
Từ những nhận xét trên, chúng tôi xin đưa ra biểu đồ mô tả thuật toán kiểm tra va chạm của agent với các agent khác nếu thực hiện kế hoạch di chuyển lý tưởng.
Hình 3-14: Thuật toán kiểm tra va chạm nếu di theo chuyển theo kế hoạch lý tưởng
Sau khi kiểm tra, nếu nhận thấy sẽ không va chạm với agent nào, agent sẽ đi theo kế hoạch lý tưởng. Nhưng nếu cho rằng va chạm sẽ xảy ra, agent có một trong các lựa chọn là
an toàn, thì giảm tốc là bắt buộc. Nếu không, agent có thể xem xét việc đánh lái. Việc xem xét đánh lái để tránh va chạm sẽ được thực hiện ở giải thuật mô tả ở mục tiếp theo.
3.3.2.3. Kiểm tra các trường hợp đánh lái để tránh va chạm
Đây chính là giải thuật được cài đặt trong phương thức checkAvoidChoice() của lớp Vehicle và sẽ được thực hiện chỉ khi tốc độ hiện tại của agent thấp hơn tốc độ an toàn (safeSpeed). Thuật toán này thực chất chỉ kiểm tra va chạm của agent với các agent khác khi đi theo các lộ trình song song với lộ trình của kế hoạch lý tưởng.
Đầu tiên agent sẽ xem xét các hướng có thể đánh lái. Tiếp theo, nó sẽ thực hiện kiểm tra va chạm khi đi trên lộ trình song với lộ trình của kế hoạch lý tưởng. Agent trong hình 3- 15 chỉ có thể xem xét việc đánh lái sang bên trái rồi thực hiện kiểm tra va chạm trên lộ trình song song với lộ trình của kế hoạch lý tưởng. Kết thúc quá trình kiểm tra, agent này nhận thấy sẽ không va chạm với agent nào nên quyết định đánh lái về phía bên trái.
Hình 3-15: Agent kiểm tra lựa chọn đánh lái để tránh va chạm
Thuật toán này tương tự như thuật toán kiểm tra va chạm khi đi theo kế hoạch lý tưởng. Đó là cứ mỗi lần dịch chuyển, agent sẽ tính toán vị trí tương ứng của các agent khác. Nếu nhận thấy có agent nào tiến đến đủ gần vị trí dịch chuyển, nó sẽ kết luận va chạm sẽ xảy ra.
Trên đây, chúng tôi đã trình bầy toàn bộ về thiết kế của hệ thống gồm các thành phần vùng đường, đoạn đường, xe cộ và mối liên hệ giữa chúng cùng với các giải thuật được sử dụng. Ở phần tiếp theo, chúng tôi xin mô tả sơ lược về việc cài đặt hệ thống dựa vào những thiết kế này.