กลับไปยังโจทย์
ง่าย 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

การแจกแจงสถานะของห่วงโซ่มาร์คอฟ

ส่งการแจกแจงความน่าจะเป็นผ่านเมทริกซ์การเปลี่ยนสถานะของห่วงโซ่มาร์คอฟตามจำนวนก้าวที่กำหนด

สิ่งที่คุณจะได้เรียนรู้

  • ส่งต่อการแจกแจงความน่าจะเป็น
  • คูณด้วยเมทริกซ์การเปลี่ยนสถานะ
  • เห็นพฤติกรรมระยะยาวที่เกิดขึ้น

โจทย์

ห่วงโซ่มาร์คอฟ เปลี่ยนสถานะแบบสุ่ม และสถานะถัดไปขึ้นกับสถานะปัจจุบันเท่านั้น transition[i][j] คือความน่าจะเป็นที่จะย้ายจากสถานะ i ไปสถานะ j ดังนั้นผลรวมของแต่ละแถวเท่ากับ 1

ถ้า p คือความน่าจะเป็นที่จะอยู่ในแต่ละสถานะตอนนี้ การแจกแจงหลังจากหนึ่งก้าวคือ:

p_next[j] = Σ เหนือ i ของ p[i] × transition[i][j]

จง implement markov_distribution(transition, start, steps) และใช้การอัปเดตนี้ steps ครั้ง

อินพุต

transition: เมทริกซ์ n × n ที่ผลรวมแต่ละแถวเท่ากับ 1

start: การแจกแจงเริ่มต้น (n ค่าที่รวมกันได้ 1)

steps: จำนวนก้าวที่จะเดิน

เอาต์พุต

คืนการแจกแจงหลังจาก steps ก้าว

เงื่อนไข

1 ≤ n ≤ 50, 0 ≤ steps ≤ 1,000

0 ≤ แต่ละความน่าจะเป็น ≤ 1

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
start = [1.0, 0.0]
steps = 2
transition = [
    [0.9, 0.1],
    [0.5, 0.5]
]

ผลลัพธ์ที่คาดหวัง:
expected = [0.86, 0.14]
อินพุต:
std::vector<double> start = {1.0, 0.0};
long long steps = 2;
std::vector<std::vector<double>> transition = {
    {0.9, 0.1},
    {0.5, 0.5}
};

ผลลัพธ์ที่คาดหวัง:
std::vector<double> expected = {0.86, 0.14};
อินพุต:
double[] start = new double[] {1.0, 0.0};
long steps = 2;
double[][] transition = new double[][] {
    new double[] {0.9, 0.1},
    new double[] {0.5, 0.5}
};

ผลลัพธ์ที่คาดหวัง:
double[] expected = new double[] {0.86, 0.14};

คำอธิบาย

ลองนึกถึงวันแดดออก (0) และวันฝนตก (1) โดยเริ่มจากวันแดดออก หลังหนึ่งก้าว: [0.9, 0.1] หลังสองก้าว: แดดออก = 0.9 × 0.9 + 0.1 × 0.5 = 0.86 และฝนตก = 0.9 × 0.1 + 0.1 × 0.5 = 0.14

ตัวอย่างที่ 2
อินพุต:
start = [0.25, 0.75]
steps = 3
transition = [
    [0.0, 1.0],
    [1.0, 0.0]
]

ผลลัพธ์ที่คาดหวัง:
expected = [0.75, 0.25]
อินพุต:
std::vector<double> start = {0.25, 0.75};
long long steps = 3;
std::vector<std::vector<double>> transition = {
    {0.0, 1.0},
    {1.0, 0.0}
};

ผลลัพธ์ที่คาดหวัง:
std::vector<double> expected = {0.75, 0.25};
อินพุต:
double[] start = new double[] {0.25, 0.75};
long steps = 3;
double[][] transition = new double[][] {
    new double[] {0.0, 1.0},
    new double[] {1.0, 0.0}
};

ผลลัพธ์ที่คาดหวัง:
double[] expected = new double[] {0.75, 0.25};

คำอธิบาย

ห่วงโซ่นี้เปลี่ยนสถานะทุกครั้ง แต่ละก้าวจึงสลับความน่าจะเป็นทั้งสองค่า หลังสลับ 3 ครั้ง: [0.75, 0.25]

แนวทางการแก้

ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ

คำใบ้ 1

หาการแจกแจงถัดไปโดยส่ง probability mass ผ่านทุก transition จาก distribution ปัจจุบัน

คำใบ้ 2

ให้นึกว่าเป็น matrix-vector multiplication ซ้ำ ๆ ทีละ step

คำใบ้ 3

ถ้า steps เป็น 0 ให้คืนค่า starting distribution เดิมโดยไม่เปลี่ยน

ความซับซ้อนที่คาดหวัง

เวลา O(steps * n^2), หน่วยความจำเพิ่ม O(n)

แหล่งอ้างอิง

โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก