Phần này xin trình bầy các thành phần chính của hệ thống, chủ yếu phục vụ cho công việc mô phỏng. Các thành phân này được thiết kế theo hướng đối tượng, nên sẽ được mô tả dưới dạng lớp. Biểu đồ UML sau sẽ mô tả các các thuộc tính, các phương thức của các lớp và mối quan hệ giữa chúng.
25
Hình 3-7: Biểu đồ mô tả các thành phần của hệ thống và mối quan hệ của chúng
Dưới đây là mô tả chi tiết các thuộc tính và các phương thức của từng lớp:
• Lớp Gate
Đây là lớp dùng để mô tả một lối vào và một lối ra, gọi chung là cổng. Mỗi cổng được chỉ ra bởi hai điểm là leftPoint – điểm bên trái và rightPoint – điểm bên phải. Thuộc tính area dùng để lưu vùng đường mà cổng này liên thông tới.
• Lớp Area
Đây là lớp mô tả vùng đường đã được nêu ra ở mục 3.2.1. Các thuộc tính của lớp này gồm có:
- entries: Danh sách các lối vào - exits: Danh sách các lối ra
-roads: Danh sách các đoạn đường giữa các lối vào và các lối ra
-vehicles: Danh sách các xe (agent) đang di chuyển trong vùng. Như đã đề cập, việc phân chia hệ thống đường xá không chỉ nhằm mục đích tạo ra các hệ thống đường tùy ý, mà còn giúp nâng cao hiệu quả xử lý tránh xe của các agent. Khi di chuyển trong một vùng, các agent chỉ cần quan tâm đến các agent ở vùng hiện
26
thời và một số vùng liên quan chứ không cần xem xét mọi agent trong toàn bộ hệ thống giao thông. Danh sách này phục vụ cho mục đích đó và nó giúp nâng cao hiệu quả xử lý tránh xe đáng kể. Chẳng hạn có khoảng vài nghìn agent trong hệ thống giao, nhưng khi xử lý việc di chuyển, mỗi agent chỉ xem cần xem xét va chạm với vài chục agent khác mà vẫn có thể di chuyển một cách hợp lý.
Các phương thức quan trọng của lớp Area gồm:
- getVihicles():Vehicle[]: Trả lại danh sách các xe di chuyển trong vùng. -connectArea(area:Area): Giúp kết nối 2 vùng với nhau. Việc kết nối sẽ dựa
vào thông tin các lối vào và các lối ra giữa của 2 vùng. Kết nối sẽđược thực hiện chỉ khi tọa độ của lối vào của vùng này khớp với tọa độ lối ra của vùng kia hoặc ngược lại.
- route(): Phương thức sẽ tìm và này trả vềđoạn đường đầu tiên của tuyến đường đi từ lối vào của một vùng đến lối ra của một vùng khác. Phương thức này giúp xác định các tuyến đường giữa các lối vào và các lối ra của hệ thống giao thông.
• Lớp Road
Lớp này mô tả một đoạn đường như trong mô tả ở mục 3.2.1. Mối đoạn đường đơn giản được mô tả bởi 2 đoạn thẳng đóng vai trò lềở hai bên đường. Ngoài ra nó có thêm một số thông tin khác để phục vụ cho việc tính toán di chuyển của các agent. Các thuộc tính của lớp này gồm:
-leftPave:Đoạn thẳng mô tả bởi 2 điểm, chỉ ra lề bên trái của đoạn đường. -rightPave: Cũng như vậy, đây là đoạn thẳng chỉ ra lề bên phải của đoạn đường. -next: Đây là đoạn đường tiếp theo đoạn đường hiện thời. Một tuyến đường sẽ
gồm một dẫy nối tiếp nhau của các đoạn đường. Nhờ thuộc tính này, một tuyến đường sẽ xác định khi biết được đoạn đường đầu tiên của tuyến đường.
-direction: Vector chỉ hướng đi của đường. Thuộc tính này sẽ định hướng cho các agent khi di chuyển.
-area: Khu vực chứa đoạn đường. Mỗi đoạn đường đều phải nằm trong một vùng đường nào đó. Thuộc tính này giúp các agent biết chúng đang di chuyển trên vùng nào.
27
- getDirection():Vector: Trả lại vector chỉ hướng của đường.
- getDistanceToLeftPave(p:Point): Trả lại khoảng cách từ một điểm đến lề trái. - getDistanceToRightPave(p:Point): Trả lại khoảng cách từ một điểm đến lề phải. - getDistanceToEnd(p:Point): Trả lại khoảng cách từ một điểm đến vạch cuối của đoạn đường.
- getNext():Road: Trả lại đoạn đường tiếp theo. - getArea():Area: Trả lại vùng chứa đoạn đường.
Các phương thức này đều phục vụ cho xử lý sự di chuyển của các agent.
• Lớp DriverAttributes
Lớp này mô tả các thuộc tính đặc trưng của người lái, đây chính là các thuộc tính mà chúng tôi đã trình bầy trong phần ý tưởng về xây dựng agent đóng vai trò người tham gia giao thông (phần 3.2.2.2). Các thuộc tính của lớp này gồm:
- gender: Chỉ ra giới tính của agent. Thuộc tính này sẽ tác động đến giá trị của một số thuộc tính khác mô tả bên dưới
- age: Tuổi tác của agent. Cũng như vây, thuộc tính này sẽ có ảnh hưởng tới một số thuộc tính mang tính đặc trưng của mỗi agent.
- maxSpeed: Tốc độ tối đa của agent. Giá trị này sẽ khác nhau với các giá trị khác nhau của thuộc tính gender và age.
-incSpeed: Mức độ tăng tốc của agent. Giá trị này thường cao ở nam giới và thanh niên.
-safeSpeed: Tốc độ an toàn chỉ ra tốc độ cần giảm xuống trước khi thực hiện việc đánh lái để tránh xe. Agent sẽ không bao giờđánh lái để tránh xe nếu tốc độ hiện thời cao hơn tốc độ an toàn.
- planTime: Tại mỗi thời điểm, mỗi agent cần xây dựng đượng chiến thuật lái xe tốt nhất cho mình trong khoảng thời gian planTime sắp tới.
• Lớp Vehicle
Đây chính là lớp mô tả agent đóng vai trò người tham gia giao thông. Các thuộc tính của lớp này gồm:
28 - position: Vị trí hiện tại của agent.
- road:Đoạn đường hiện tại mà agent đang di chuyển
-velocity: Vector vận tốc của agent, bao gồm cả hướng và độ lớn của vận tốc. -length, width: Mỗi xe được coi như một hình chữ nhât. Giá trị của hai thuộc
tính này chỉ ra chỉ chiều dài, và chiều rộng của hình chữ nhật đó. -attributes: Các thuộc tính đặc trưng của người lái
Các phương thức của lớp này chủ yếu phục vụ cho việc tính toán di chuyển của agent, chúng bao gồm:
- distance(vehicle:Vehicle):float: Tính toán và trả về khoảng cách giữa 2 agent. Khoảng cách giữa 2 agent sẽ phụ thuộc vào vị trí, hướng và kích thước của mỗi agent.
- updatePosition(): Cập nhật vị trí hiện tại của agent. Vị trí mới của agent sẽ phụ thuộc vào vector vận tốc. Sau khi thay đổi vị trí, agent cần xác định đoạn đường mà nó đang đứng ở vị trí mới. Nếu là đoạn đường khác với đoạn đường vị trí cũ và đoạn đường mới này cũng nằm ở vùng đường mới, khác với vùng đường cũ, thì cần cập nhật danh sách các agent đang di chuyển trong các vùng.
-checkAvoidChoice(): Đây là phương thức kiểm tra lựa chọn đánh lái để tránh xe. Phương thức này được gọi từ trong phương thức drive() mô tả bên dưới và nó chỉđược gọi khi vận tốc hiện thời nhỏ hơn vận tốc an toàn (safeSpeed). - drive(): Đây là phương thức thực hiện toàn bộ việc tính toán di chuyển của
agent. Nó thể hiện được các tính chất của agent. Phương thức này sẽđược mô tả chi tiết trong phần mô tả các giải thuật tiếp theo.
Các giải thuật được cài đặt trong các phương thức checkAvoidChoice() và phương thức drive() sẽđược chúng tôi mô tả chi tiết trong phần tiếp theo.
3.3.2. Các thuật toán được sử dụng
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.
29
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
Sau đây chúng tôi xin đi vào trình bầy chi tiết từng thuật toán này.
30
Đâ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 planTime củ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à:
31
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ỳ
32
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 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-12: Agent cảm nhận được va chạm với agent khác
33
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à giảm tốc độ hoặc đánh lái để tránh va chạm. Nếu tốc độ hiện thời của agent cao hơn tốc độ 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.
34
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