Thuật toán điều khiển đèn giao thông dựa trên hàng xe (queue-based actuated control)

Các nút giao thông hiện đại không chỉ bật đèn theo chu kỳ cố định mà còn có thể “nhìn” vào thực tế xem mỗi hướng đang đông hay vắng xe. Một trong những cách tiếp cận thực tế và dễ hiểu nhất là điều khiển đèn dựa trên độ dài hàng xe (queue-based actuated control): hướng nào đang đông, chờ lâu thì được ưu tiên xanh; hướng nào vắng thì không cần giữ xanh quá lâu.

Thuật toán điều khiển đèn giao thông dựa trên hàng xe (queue-based actuated control)

Bài viết này đi sâu vào ý tưởng của thuật toán điều khiển theo hàng xe, cách nó hoạt động và kèm theo một demo trực quan bằng JavaScript + UIkit để mô phỏng hai hướng giao nhau và cách đèn tự động chuyển đổi pha dựa trên số lượng xe trong hàng.

Bài toán: Điều khiển đèn cho hai hướng giao nhau

Ta xét một nút giao đơn giản với hai hướng chính:

  • Hướng Bắc – Nam (NS).
  • Hướng Đông – Tây (EW).

Giả sử:

  • Mỗi hướng có một hàng xe đang chờ (queue).
  • Lưu lượng xe đến mỗi giây là ngẫu nhiên (ví dụ xe ít – nhiều tuỳ thời điểm).
  • Hệ thống cần quyết định: giữ đèn xanh cho hướng hiện tại bao lâu, khi nào thì chuyển sang cho hướng còn lại.

Mục tiêu:

  • Giảm thời gian chờ trung bình của xe.
  • Không để một hướng “chết đói” vì chờ quá lâu.
  • Vẫn đảm bảo có thời gian tối thiểu để xe bắt đầu di chuyển sau khi đèn chuyển sang xanh.

Ý tưởng chính của thuật toán điều khiển theo hàng xe

Ta không dùng chu kỳ cố định, mà cho đèn “phản ứng theo dữ liệu thực tế”:

  1. Mỗi hướng có biến queueNSqueueEW biểu diễn số xe đang chờ.
  2. Mỗi “tick” thời gian (ví dụ 1 giây) có một số xe mới xuất hiện ngẫu nhiên ở mỗi hướng.
  3. Hướng nào đang xanh sẽ cho xe đi qua, giảm dần độ dài hàng xe.
  4. Hệ thống theo dõi:
    • greenTime: thời gian đã giữ xanh cho hướng hiện tại.
    • minGreen: thời gian xanh tối thiểu (đảm bảo xe có đủ thời gian bắt đầu di chuyển).
    • maxGreen: thời gian xanh tối đa (tránh giữ một hướng quá lâu).
  5. Sau minGreen, nếu hướng hiện tại gần hết xe trong khi hướng kia rất đông → xem xét chuyển pha.
  6. Nếu đã chạm maxGreen, buộc phải chuyển để tránh “bất công” cho hướng còn lại.

Tóm lại: thay vì chạy theo đồng hồ, đèn chạy theo hàng xe nhưng vẫn có các ràng buộc an toàn về thời gian tối thiểu/tối đa.

Ví dụ minh họa ý tưởng thuật toán

Giả sử các tham số:

  • minGreen = 8s – mỗi lần bật xanh ít nhất 8 giây.
  • maxGreen = 25s – không bật xanh quá 25 giây cho một hướng.

Quy tắc đơn giản có thể là:

  • Nếu greenTime < minGreen → tiếp tục giữ xanh.
  • Nếu greenTime ≥ minGreen:
    • Nếu hàng xe hướng hiện tại đã rất ít (ví dụ ≤ 1 xe) và hướng kia ≥ 3–4 xe → chuyển pha.
    • Ngược lại, nếu hàng xe cả hai bên tương đương → có thể giữ thêm cho tới khi chạm maxGreen.
  • Nếu greenTime ≥ maxGreen → bắt buộc chuyển pha.

Như vậy, thuật toán luôn cố gắng ưu tiên hướng đang đông, nhưng không “bỏ quên” hướng còn lại quá lâu.

Demo điều khiển đèn giao thông theo hàng xe (UIkit + JavaScript)

Demo dưới đây mô phỏng:

  • Hai hướng NS và EW với số xe ngẫu nhiên xuất hiện theo thời gian.
  • Đèn sẽ tự động cho một hướng xanh, một hướng đỏ và chuyển pha dựa trên:
    • Thời gian đã giữ xanh (greenTime).
    • Độ dài hàng xe hiện tại và đối diện.
  • UI hiển thị:
    • Đèn của từng hướng (Xanh/Đỏ).
    • Số xe trong hàng.
    • Log lại các quyết định của thuật toán.

Demo: Điều khiển đèn giao thông dựa trên hàng xe

Mô phỏng hai hướng giao nhau (Bắc – Nam và Đông – Tây). Đèn tự động quyết định giữ xanh hay chuyển pha dựa trên số lượng xe trong hàng và thời gian đã giữ xanh.

Hướng Bắc – Nam (NS)

Đèn:ĐỎ
Số xe trong hàng:0

Hướng Đông – Tây (EW)

Đèn:ĐỎ
Số xe trong hàng:0

Thông tin trạng thái

Pha hiện tại:NS_GREEN
Thời gian giữ xanh hiện tại:0s
Thời gian mô phỏng:0s

Log quyết định của thuật toán

Sẵn sàng mô phỏng.

Phân tích đoạn code thuật toán điều khiển

1. Các tham số chính

Trong phần <script>, ta định nghĩa:

var MIN_GREEN = 8;   // thời gian xanh tối thiểu (giây)
var MAX_GREEN = 25;  // thời gian xanh tối đa (giây)
var TICK_MS   = 800; // chu kỳ mô phỏng ~0.8s mỗi tick

Ý nghĩa:

  • MIN_GREEN: tránh việc đèn nhảy liên tục, xe chưa kịp chạy đã chuyển đỏ.
  • MAX_GREEN: tránh một hướng xanh mãi, hướng kia chờ quá lâu.
  • TICK_MS: điều chỉnh “tốc độ” mô phỏng cho người xem dễ theo dõi.

2. Trạng thái quan trọng của hệ thống

Các biến đại diện cho trạng thái hiện tại:

var queueNS = 0;
var queueEW = 0;
var phase = "NS_GREEN"; // hoặc "EW_GREEN"
var greenTime = 0;
var simTime = 0;

Trong đó:

  • queueNS / queueEW: số xe đang chờ ở mỗi hướng.
  • phase: hướng nào đang được bật đèn xanh.
  • greenTime: đã giữ đèn xanh cho hướng hiện tại bao lâu.
  • simTime: tổng thời gian mô phỏng.

3. Hàm sinh xe và cho xe đi qua

Chi tiết hai bước “đến” và “đi”:

function spawnCars() {
    var newNS = Math.random() < 0.7 ? Math.floor(Math.random() * 2) : 0;
    var newEW = Math.random() < 0.7 ? Math.floor(Math.random() * 2) : 0;

    queueNS += newNS;
    queueEW += newEW;
}

function releaseCars() {
    var releaseCount = 0;
    if (phase === "NS_GREEN" && queueNS > 0) {
        releaseCount = Math.min(queueNS, 2);
        queueNS -= releaseCount;
    } else if (phase === "EW_GREEN" && queueEW > 0) {
        releaseCount = Math.min(queueEW, 2);
        queueEW -= releaseCount;
    }
}

Ý tưởng:

  • Mỗi tick có một số xe ngẫu nhiên đến (0–2 xe cho mỗi hướng).
  • Khi một hướng đang xanh, tối đa 2 xe trong hàng được cho đi mỗi tick.

Bạn có thể điều chỉnh số lượng xe mới và số xe đi qua để mô phỏng giờ cao điểm hoặc đường đông/đường vắng.

4. Logic quyết định khi nào chuyển pha

Phần cốt lõi của thuật toán nằm trong shouldSwitchPhase():

function shouldSwitchPhase() {
    if (greenTime < MIN_GREEN) {
        return false;
    }

    if (greenTime >= MAX_GREEN) {
        return true;
    }

    if (phase === "NS_GREEN") {
        if (queueNS <= 1 && queueEW >= 3) {
            return true;
        }
    } else {
        if (queueEW <= 1 && queueNS >= 3) {
            return true;
        }
    }

    return false;
}

Tóm tắt quy tắc:

  • Chưa đủ MIN_GREEN → cố định không chuyển.
  • Vượt MAX_GREEN → buộc phải chuyển.
  • Sau MIN_GREEN, nếu hướng đang xanh gần hết xe mà hướng kia rất đông → chủ động chuyển pha để giảm chờ cho hướng kia.

Khi trả về true, hàm switchPhase() sẽ được gọi để đổi pha:

function switchPhase() {
    if (phase === "NS_GREEN") {
        phase = "EW_GREEN";
    } else {
        phase = "NS_GREEN";
    }
    greenTime = 0;
    updateLights();
}

5. Vòng lặp mô phỏng

Hàm tick() đóng vai trò là “trái tim” mô phỏng, được gọi đều đặn qua setInterval:

function tick() {
    simTime += 1;
    greenTime += 1;

    spawnCars();
    releaseCars();

    if (shouldSwitchPhase()) {
        switchPhase();
    }

    renderQueues();
    updateInfo();
}

Mỗi tick:

  • Tăng thời gian mô phỏng và thời gian giữ xanh.
  • Sinh thêm xe mới và cho xe đi qua hướng đang xanh.
  • Xem xét có cần chuyển pha không.
  • Cập nhật giao diện: đèn, hàng xe, log.

Khi nào nên dùng thuật toán điều khiển theo hàng xe?

Chiến lược điều khiển dựa trên hàng xe (queue-based actuated control) rất phù hợp với:

  • Các nút giao có lưu lượng biến động mạnh theo thời gian.
  • Trường hợp có thể lắp cảm biến đếm xe, camera hoặc radar.
  • Các hệ thống cần phản ứng theo thực tế thay vì chỉ chạy theo lịch cố định.

Trong thực tế, người ta thường kết hợp mô hình này với các kỹ thuật tối ưu cao hơn (SCOOT, SCATS, Reinforcement Learning) để:

  • Tối ưu không chỉ một nút giao, mà cả mạng lưới đường.
  • Ưu tiên xe buýt, xe cứu thương, tuyến chính.
  • Giảm tổng thời gian chờ và chiều dài hàng xe trong giờ cao điểm.

Kết luận

Thuật toán điều khiển đèn giao thông dựa trên hàng xe là một ví dụ rất thực tế, đơn giản nhưng hiệu quả cho việc đưa dữ liệu thời gian thực vào điều khiển hệ thống. Thay vì “cứng nhắc” theo đồng hồ, đèn có thể linh hoạt ưu tiên hướng đang đông, nhưng vẫn tôn trọng các ràng buộc an toàn như thời gian xanh tối thiểu/tối đa.

Với demo trực quan bằng JavaScript và UIkit ở trên, bạn có thể “nhìn thấy” thuật toán quyết định như thế nào: xe đến – xe đi, hàng xe dài – ngắn, khi nào đèn giữ nguyên, khi nào chuyển pha. Từ nền tảng này, việc bước lên các mô hình điều khiển thông minh hơn (adaptive control, AI, Reinforcement Learning) sẽ trở nên dễ hình dung và gần gũi hơn với bài toán thực tế trong đô thị.

Bình luận


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...