III. Xây dựng bộ công cụ hỗ trợ mô phỏng các giao thức định tuyến địa lý
3.3.3. Thuật toán BoundHole
Giả sử nút t0 là một nút tắc và góc ∠pt0t1 là góc tắc, thuật toán BoundHole sẽ đƣợc sử
56
có dạng một vòng khép kín. Thuật toán BoundHole đƣợc thực hiện tại mỗi nút cụ thể nhƣ sau :
1. Giả sử nút hiện tại là ti, thuật toán sẽ có nhiệm vụ tìm ra nút ti+1 mà gói tin sẽ đƣợc gửi đến tiếp theo. Xét trƣờng hợp nút hiện tại là ti với i = 1, nút trƣớc t1 là t0 và nút trƣớc t0 là p.
Đầu tiên ta cần xác định vùng cấm của nút ti nhƣ trong hình dƣới (vùng kẻ sọc). Nếu góc ∠ti−2ti−1ti ≥ π, vùng cấm của nút ti sẽ rỗng. Nếu ∠ti−2ti−1ti < π, ta kẻ tia l tại ti theo hƣớng titi-1, tia này sẽ cắt bán kính phủ sóng của ti tại ̅̅̅̅̅ . Khi đó vùng cấm của ti sẽ là phần giao của vùng bán kính phủ sóng của ti với hình nón ∠̅̅̅̅̅ ti−1ti−2 có đỉnh tại ti-1.
Nút tiếp theo ti+1 của ti sẽ không thể nằm trong vùng cấm này.
Hình 42: Vùng cấm của nút ti và xác định nút ti+1
Nút ti+1 đƣợc xác định theo quy tắc tay phải xuất phát từ ti: kẻ tia l tại ti theo hƣớng titi-1 và xoay tia l này theo chiều ngƣợc chiều kim đồng hồ. ti+1 là nút láng giềng đầu tiên của ti nằm ngoài vùng cấm đƣợc l quét tới. Nếu ti+1 ≠ p, ti+1 sẽ tiếp tục thực hiện quá trình này.
Quá trình này đƣợc thực hiện trong OMNeT++ bởi hàm findNextHop. Hàm có đầu vào là bảng chứa thông tin các nút láng giềng đã đƣợc sắp xếp theo chiều ngƣợc chiều kim
57
đồng hồ, thông tin nút hiện tại và 2 nút trƣớc đó. Đầu ra của hàm sẽ trả về thông tin của nút tiếp theo cần gửi gói tin đến.
Hình 43: Xác định nút tiếp theo cần truyền gói tin đến
2. Trong quá trình thực hiện thuật toán BoundHole, ta cần xử lý loại bỏ trƣờng hợp có các cạnh giao nhau. Nếu cạnh tjtj+1 cắt cạnh titi+1 với j > i, chỉ có 2 trƣờng hợp có thể xảy ra [9]:
• Trƣờng hợp 1: node tj không nằm trong vùng truyền tin của cả 2 node ti và ti+1. Đối với trƣờng hợp này, ta sẽ bỏ các node ti+1ti+2…tjtj+1 và tiếp tục theo hƣớng t0t1…ti- tj+1tj
58
Hình 44: Trường hợp 1: node tj không nằm trong vùng truyền tin của cả 2 node ti và ti+1
• Trƣờng hợp 2: node ti không nằm trong vùng truyền tin của cả 2 node tj và tj+1. Trƣờng hợp này ta chỉ cần lấy ti+1 làm node tiếp theo sau node tj và tiếp tục thực hiện với t0…tjti+1ti
Hình 45: Trường hợp 2: node ti không nằm trong vùng truyền tin của cả 2 node tj và tj+1.
Quá trình xác định và loại bỏ các cạnh giao nhau trong hố mạng đƣợc thực hiện trong OMNeT++ nhờ hàm checkIntersection. Đầu vào của hàm là thông tin về vị trí nút hiện tại, vị trí nút dự kiến sẽ gửi tin đến và thông tin về hố mạng. Hàm trả về một trong 3 giá trị 0, 1, 2 tƣơng ứng với các trƣờng hợp hố mạng không có cạnh giao nhau, hố mạng có các cạnh giao nhau theo trƣờng hợp 1 và hố mạng có các cạnh giao nhau theo trƣờng hợp 2.
59
Hình 46: Hàm checkIntersection giúp xác định và loại bỏ các cạnh giao nhau trong hố mạng
3. Quá trình này sẽ đƣợc tiếp tục thực hiện cho đến khi thu đƣợc 1 vòng khép kín t0t1t2…tk.