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.
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
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.
Các phương thức quan trọng của lớp Road gồm:
- 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:
- 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
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.