AIToanHoc.comAI Toán Học
Toán ứng dụng và tối ưu

Mô phỏng Monte Carlo là gì: giải bài toán bất định bằng hàng nghìn lần thử ngẫu nhiên

Mô phỏng Monte Carlo qua ví dụ ước lượng số pi và thời gian dự án: sai số giảm theo căn bậc hai số lần thử, cách làm trong bảng tính, khi nào kết quả đáng tin.

Graduate student at a long library desk in Hue tossing dried beans onto a square of graph paper, wooden tables and lamps around, only hands visible, calm afternoon

Mô phỏng Monte Carlo là cách trả lời câu hỏi về một hệ thống có yếu tố ngẫu nhiên bằng cách cho máy tính "chạy thử" hệ thống đó rất nhiều lần với các giá trị ngẫu nhiên, rồi thống kê kết quả. Khi công thức quá phức tạp hoặc không tồn tại, mô phỏng vẫn cho được câu trả lời gần đúng, và độ chính xác tăng khi số lần thử tăng.

Phương pháp được phát triển ở Los Alamos trong thập niên 1940, gắn với tên Stanislaw Ulam và John von Neumann; cái tên Monte Carlo lấy từ sòng bạc nổi tiếng ở Monaco, ám chỉ yếu tố may rủi. Bài này dùng hai ví dụ: ước lượng số pi bằng điểm ngẫu nhiên, và ước lượng thời gian hoàn thành một dự án có ba việc không chắc chắn. Qua đó bạn sẽ thấy vì sao muốn chính xác gấp mười lần phải thử gấp một trăm lần, và khi nào kết quả mô phỏng đáng tin.

Ví dụ một: ước lượng số pi bằng điểm ngẫu nhiên

Vẽ một hình vuông cạnh 1 và một phần tư hình tròn bán kính 1 có tâm ở một góc của hình vuông. Diện tích hình vuông là 1, diện tích phần tư hình tròn là pi chia 4, khoảng 0,785. Nếu rải điểm ngẫu nhiên đều khắp hình vuông, tỉ lệ điểm rơi vào phần tư hình tròn sẽ tiến gần tới pi chia 4. Nhân tỉ lệ đó với 4 là có ước lượng của pi.

Cách làm: chọn hai số ngẫu nhiên x và y trong khoảng từ 0 đến 1, kiểm xem x bình phương cộng y bình phương có nhỏ hơn hoặc bằng 1 không. Lặp lại N lần, đếm số lần thoả, chia cho N, nhân 4. Trong bảng tính, mỗi dòng là một lần thử: hai cột dùng hàm sinh số ngẫu nhiên, một cột kiểm điều kiện, cuối cùng một ô tính tỉ lệ.

Ví dụ này không phải cách tốt để tính pi; có những chuỗi vô hạn cho hàng triệu chữ số nhanh hơn rất nhiều. Giá trị của nó là sư phạm: bạn biết chính xác đáp án đúng nên thấy được sai số của mô phỏng thay đổi thế nào theo N. Với vài trăm điểm, ước lượng thường lệch ở chữ số thập phân thứ nhất hoặc thứ hai; muốn đúng nhiều chữ số hơn cần nhiều điểm hơn hẳn.

Nếu không có máy tính, bạn có thể làm thủ công: rải một nắm hạt đậu lên tờ giấy kẻ ô vuông có vẽ phần tư hình tròn, đếm hạt. Kết quả sẽ thô, nhưng đó là trải nghiệm tốt để hiểu bản chất của phương pháp trước khi giao cho máy.

Sai số giảm theo căn bậc hai: vì sao chính xác hơn lại đắt

Mỗi điểm ngẫu nhiên là một phép thử có hai kết quả, rơi vào trong với xác suất p bằng pi chia 4, hoặc rơi ra ngoài. Tỉ lệ ước lượng có độ lệch chuẩn bằng căn của p nhân (1 trừ p) chia N. Với p khoảng 0,785, căn của p nhân (1 trừ p) khoảng 0,41; nhân 4 để ra ước lượng pi, độ lệch chuẩn của ước lượng là khoảng 1,64 chia căn N.

Thay số: với N bằng 10.000, căn N là 100, sai số chuẩn khoảng 0,016. Với một triệu điểm, căn N là 1.000, sai số chuẩn khoảng 0,0016. Số điểm tăng 100 lần, sai số chỉ giảm 10 lần. Quy luật "sai số tỉ lệ với 1 chia căn N" đúng cho hầu hết mô phỏng Monte Carlo cơ bản, không riêng bài pi.

Hệ quả thực tế có hai mặt. Mặt tốt: tốc độ hội tụ không phụ thuộc số chiều của bài toán, nên Monte Carlo rất mạnh với những bài nhiều biến mà phương pháp lưới truyền thống bất lực. Mặt khó: muốn thêm một chữ số chính xác phải tăng khối lượng tính lên khoảng 100 lần. Vì vậy người làm mô phỏng luôn báo cáo kết quả kèm sai số ước lượng, và dừng ở mức chính xác đủ cho quyết định chứ không chạy vô tận.

Số ngẫu nhiên của máy tính đến từ đâu

Máy tính thông thường không tung đồng xu. Hàm sinh số ngẫu nhiên trong bảng tính hay ngôn ngữ lập trình thực chất là một công thức tất định, gọi là bộ sinh số giả ngẫu nhiên: từ một giá trị khởi đầu (hạt giống), nó tạo ra một dãy số trông như ngẫu nhiên và qua được nhiều phép kiểm thống kê. Cùng hạt giống thì cùng dãy số.

Tính tất định này là một ưu điểm cho người làm mô phỏng: ghi lại hạt giống thì chạy lại được đúng kết quả cũ để kiểm lỗi hoặc cho người khác đối chiếu. Đổi hạt giống thì có một lần chạy độc lập để xem kết quả dao động đến đâu.

Với mô phỏng học tập và phần lớn bài toán kỹ thuật, bộ sinh mặc định của các phần mềm phổ biến là đủ tốt. Chỉ những việc đặc thù như mã hoá mới cần nguồn ngẫu nhiên an toàn hơn, và đó là chuyện của mật mã học chứ không phải của mô phỏng. Điều đáng lưu ý hơn: hàm ngẫu nhiên trong bảng tính thường tính lại mỗi khi bảng thay đổi, nên kết quả nhảy liên tục; muốn giữ một lần chạy, sao chép rồi dán dưới dạng giá trị.

Ví dụ hai: dự án ba việc không chắc chắn

Ví dụ giả định: một dự án gồm ba việc nối tiếp nhau. Mỗi việc có ước lượng thời gian nhanh nhất, khả dĩ nhất và chậm nhất (ngày). Ta mô hình mỗi việc bằng phân phối tam giác dựng từ ba con số đó, một lựa chọn phổ biến khi chỉ có ước lượng của người trong nghề.

ViệcNhanh nhấtKhả dĩ nhấtChậm nhấtTrung bình của phân phối tam giác
Việc 12374
Việc 24596
Việc 31263
Tổng7102213

Trung bình của phân phối tam giác bằng tổng ba con số chia 3; với việc 1 là (2 cộng 3 cộng 7) chia 3 bằng 4. Trung bình của tổng bằng tổng các trung bình, tức 13 ngày, dù cộng các con số khả dĩ nhất chỉ ra 10 ngày. Lý do là cả ba việc đều lệch về phía chậm: có thể chậm hơn nhiều nhưng chỉ nhanh hơn được chút ít.

Phần trung bình tính được bằng công thức. Câu hỏi khó hơn là xác suất xong trong 10 ngày, hay cần hứa bao nhiêu ngày để chắc 80%. Đây là chỗ mô phỏng làm việc: mỗi dòng bảng tính rút ngẫu nhiên thời gian ba việc theo phân phối tam giác, cộng lại, lặp nhiều lần.

Đọc kết quả mô phỏng dự án

Một lần chạy mô phỏng với vài trăm nghìn lượt cho kết quả xấp xỉ như sau: xác suất xong trong 10 ngày, tức đúng như kế hoạch cộng các con số khả dĩ nhất, chỉ khoảng 4%. Xác suất xong trong 13 ngày khoảng một nửa. Mốc thời gian mà 80% số lượt mô phỏng kịp xong nằm quanh 14,6 ngày, mốc 90% quanh 15,5 ngày. Các con số này sẽ dao động nhẹ giữa các lần chạy, đúng như sai số đã bàn ở trên.

Thông điệp cho người lập kế hoạch rất rõ: hứa 10 ngày là hứa một điều gần như chắc chắn trễ. Nếu cần một mốc có độ tin cậy 80%, khoảng 15 ngày là con số trung thực hơn. Bài về phương pháp đường găng trong danh mục này cũng nhắc hiện tượng tương tự, và mô phỏng là cách đo được nó thay vì chỉ cảnh báo chung chung.

Mô phỏng còn cho phép hỏi tiếp những câu khó tính bằng công thức: nếu rút ngắn việc 2 thì xác suất kịp hạn tăng bao nhiêu; nếu hai việc chạy song song thay vì nối tiếp thì sao; nếu việc 1 trễ thì việc 3 cũng hay trễ theo (hai việc phụ thuộc nhau). Câu cuối đặc biệt quan trọng: mô phỏng giả định các việc độc lập sẽ đánh giá thấp rủi ro khi trong thực tế chúng cùng chịu một nguyên nhân, như thời tiết xấu hay thiếu người.

Khi nào kết quả mô phỏng đáng tin

Đầu vào quyết định đầu ra. Mô phỏng chỉ tốt bằng các phân phối bạn đưa vào. Nếu ước lượng "chậm nhất" quá lạc quan, mọi con số phía sau đều lạc quan theo. Bỏ công hỏi người trong nghề về các tình huống xấu đã từng xảy ra thường đáng giá hơn tăng số lượt chạy.

Đủ số lượt. Chạy lại mô phỏng vài lần với hạt giống ngẫu nhiên khác nhau. Nếu con số bạn quan tâm thay đổi đáng kể giữa các lần, cần thêm lượt. Với xác suất hiếm như rủi ro một phần nghìn, cần rất nhiều lượt mới ước lượng ổn định.

Kiểm bằng trường hợp biết đáp án. Trước khi tin mô phỏng phức tạp, chạy nó cho một phiên bản đơn giản có đáp án bằng công thức, như trung bình 13 ngày trong ví dụ. Mô phỏng ra trung bình khác xa 13 thì có lỗi trong cách rút số ngẫu nhiên hoặc cách cộng.

Phụ thuộc giữa các biến. Rút các biến độc lập với nhau khi thực tế chúng đi cùng chiều là lỗi phổ biến nhất trong mô phỏng rủi ro, thường làm đuôi xấu bị thu hẹp. Nếu có lý do tin rằng hai yếu tố liên quan, mô hình hoá mối liên quan đó.

Dùng AI để dựng mô phỏng

Chatbot đặc biệt hữu ích ở phần viết công thức bảng tính hoặc đoạn chương trình ngắn cho mô phỏng, nhưng cần kiểm kỹ:

  • Câu lệnh mẫu: "Hướng dẫn dựng mô phỏng Monte Carlo trong bảng tính cho dự án ba việc nối tiếp, mỗi việc có thời gian theo phân phối tam giác với ba tham số nhanh nhất, khả dĩ nhất, chậm nhất. Viết công thức rút số ngẫu nhiên theo phân phối tam giác bằng phương pháp biến đổi ngược, giải thích từng bước."
  • Kiểm công thức phân phối tam giác: lấy trung bình của một cột rút ngẫu nhiên và so với (a cộng m cộng b) chia 3. Lệch nhiều là công thức sai, lỗi này chatbot mắc khá thường.
  • Yêu cầu chatbot ghi rõ mọi giả định: độc lập, hình dạng phân phối, số lượt. Gạch những giả định không hợp với tình huống của bạn.
  • Báo cáo kết quả kèm số lượt và sai số ước lượng, ví dụ "khoảng 80%, sai lệch vài điểm phần trăm giữa các lần chạy", thay vì một con số trơn.
  • Khi dựng mô phỏng cho dự án hay doanh nghiệp thật, ước lượng thời gian và chi phí có thể là thông tin nội bộ; dùng số đã làm tròn hoặc tỉ lệ khi nhờ chatbot, giữ số thật trong bảng tính của bạn.

Câu hỏi thường gặp

Mô phỏng Monte Carlo dùng để làm gì trong thực tế?

Ước lượng rủi ro tiến độ và chi phí dự án, định giá các sản phẩm tài chính phức tạp, tính tích phân nhiều chiều trong vật lý, đánh giá độ tin cậy hệ thống kỹ thuật. Điểm chung là có nhiều yếu tố bất định và công thức đóng quá khó hoặc không có.

Cần chạy bao nhiêu lượt mô phỏng?

Tuỳ độ chính xác cần thiết. Sai số giảm theo 1 chia căn số lượt, nên muốn chính xác gấp 10 lần cần gấp 100 lần số lượt. Cách thực hành là chạy vài lần với hạt giống khác nhau và tăng lượt đến khi kết quả ổn định ở mức đủ cho quyết định.

Có làm mô phỏng Monte Carlo bằng bảng tính được không?

Được, với bài vừa phải. Mỗi dòng là một lượt, các cột dùng hàm sinh số ngẫu nhiên, cột cuối tính kết quả, rồi dùng hàm thống kê để lấy tỉ lệ và phân vị. Bài lớn hơn thường dùng ngôn ngữ lập trình cho nhanh.

Vì sao cộng các thời gian khả dĩ nhất lại cho kế hoạch quá lạc quan?

Vì nhiều công việc có phân phối lệch, có thể chậm hơn nhiều nhưng chỉ nhanh hơn chút ít. Trung bình của mỗi việc lớn hơn con số khả dĩ nhất, và các khoản lệch đó cộng dồn qua cả chuỗi.

Mô phỏng có thay được công thức chính xác không?

Khi có công thức đóng, công thức nhanh và chính xác hơn. Mô phỏng hữu ích khi công thức quá phức tạp, hoặc để kiểm chéo một công thức mình vừa tự suy ra. Hai cách bổ sung cho nhau.

Chatbot viết công thức mô phỏng có đáng tin không?

Chatbot viết khung nhanh nhưng hay sai chi tiết, nhất là công thức rút số theo phân phối tam giác hay phân phối lệch. Luôn kiểm trung bình và độ lệch của cột rút ngẫu nhiên so với giá trị lý thuyết trước khi dùng kết quả.

Cần tư vấn cụ thể cho trường hợp của bạn?

Chúng tôi sẽ liên hệ trong vòng 24 giờ.

Đăng ký tư vấn ngay

Bài viết liên quan

Bạn cần hỗ trợ thêm?

Để lại thông tin, chúng tôi sẽ liên hệ trong 24 giờ.

hoặc
Gọi ngay 0926 138 138