Vòng lặp — chuỗi Markov
Giải hệ nᵀ(I − P) = e₀ᵀ thay vì cắt vòng.
Đây là phần lõi mà công cụ làm khác với hầu hết bảng tính: vòng lặp được giải chính xác bằng đại số tuyến tính, không phải bằng cách chạy thử vài vòng rồi dừng.
Ý tưởng
Coi quy trình là một chuỗi Markov hấp thụ: mỗi bước là một trạng thái, mỗi luồng là một xác suất chuyển, các điểm kết thúc là trạng thái hấp thụ. Câu hỏi “bước v chạy trung bình bao nhiêu lần trong một lượt hồ sơ” chính là câu hỏi kinh điển về số lần ghé thăm kỳ vọng.
Công thức
Viết gọn dưới dạng ma trận:
Đọc bằng lời: “số lần ghé thăm bước v bằng 1 nếu v là điểm bắt đầu, cộng với tổng số lần các bước khác chuyển sang v”. Đây là một hệ phương trình tuyến tính — giải một lần là ra tất cả, và nghiệm đã bao gồm vô hạn số vòng lặp.
Trường hợp một vòng rework đơn
Với vòng lặp đơn giản, hệ (5) rút gọn về công thức tổng cấp số nhân:
Ví dụ tính tay
Bước Đối chiếu (35 phút) → cổng Khớp? → 22% sang Xử lý sai lệch (90 phút) rồi quay lại đối chiếu; 78% đi tiếp sang Thanh toán.
Gọi nđối chiếu là số lần chạy bước đối chiếu:
Bước xử lý sai lệch chạy ít hơn, đúng bằng phần bị trả về:
Thời gian đóng góp của cụm này:
So sánh: nếu bỏ qua rework thì chỉ tính 35 phút. Nếu ngây thơ “cộng thêm 22%” thì ra 42,7 phút. Con số đúng là 70,25 phút — gấp đôi ước lượng thô.
Cách công cụ giải bài toán này
def expected_visits(node_ids, transitions, start):
# Dựng (I - P^T), vế phải là e_0
matrix = [[1.0 if r == c else 0.0 for c in range(size)] for r in range(size)]
for source, targets in transitions.items():
for target, probability in targets.items():
matrix[index[target]][index[source]] -= probability
vector = [0.0] * size
vector[index[start]] = 1.0
return solve(matrix, vector) # khử Gauss có chọn trục
Nếu tồn tại một vòng lặp mà mọi bước trong vòng đều không có nhánh thoát, ma trận suy biến — về mặt toán học thời gian kỳ vọng là vô hạn. Công cụ báo lỗi rõ ràng thay vì trả về một con số hữu hạn sai. Lưu ý: luồng quay lui có xác suất 100% là bình thường, miễn là ở đâu đó trong vòng có nhánh thoát ra.