Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมค้นหาเส้นทางที่มีความน่าจะเป็นสูงสุดโดยใช้ Python


สมมติว่าเรามีกราฟการถ่วงน้ำหนักแบบไม่ระบุทิศทางที่มี n โหนด (โหนดจะมีหมายเลขตั้งแต่ 0 เป็นต้นไป) กราฟนี้กำหนดให้เป็นอินพุตโดยใช้รายการขอบ สำหรับแต่ละขอบ e มีความน่าจะเป็นที่จะประสบความสำเร็จในการสำรวจความน่าจะเป็นของขอบนั้น[e] เรายังมีโหนดเริ่มต้นและสิ้นสุด เราต้องหาเส้นทางที่มีความน่าจะเป็นสูงสุดของความสำเร็จตั้งแต่ต้นจนจบและส่งกลับความน่าจะเป็นที่ประสบความสำเร็จ หากเราไม่พบเส้นทางใด ๆ ให้คืนค่า 0

ดังนั้นหากอินพุตเป็นแบบ

โปรแกรมค้นหาเส้นทางที่มีความน่าจะเป็นสูงสุดโดยใช้ Python

ผลลัพธ์จะเป็น 0.24 เนื่องจากมีสองเส้นทางจากโหนด 0 ถึง 2 หนึ่งเส้นทางที่มีความน่าจะเป็น 0.2 อีกเส้นทางผ่านโหนด 1 มีความน่าจะเป็น 0.4*0.6 =0.24 ซึ่งเป็นค่าสูงสุด

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • g :=สร้างกราฟจากรายการขอบที่กำหนดและใช้ค่าความน่าจะเป็นเป็นน้ำหนัก

  • q :=โครงสร้างข้อมูลคิว

  • แทรก (เริ่ม 1) ลงใน q

  • เยี่ยมชม :=แผนที่สำหรับเก็บโหนดที่เยี่ยมชม

  • ในขณะที่ q ไม่ว่างให้ทำ

    • (node, prob) :=รายการแรกของ q และลบออกจาก q

    • ถ้าเข้า[node]> prob แล้ว

      • ไปทำซ้ำต่อไป

    • มิฉะนั้น

      • เยี่ยมชม[โหนด] :=ปัญหา

    • สำหรับแต่ละโหนดที่อยู่ติดกัน adj และความน่าจะเป็น nextProb ใน g[node] ทำ

      • ถ้าเคยไป[adj]

        • แทรก (adj, prob * nextProb) ต่อท้าย q

  • กลับมาเยือน[จบ]

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

from collections import defaultdict, deque
def solve(edges, probability, start, end):
   g = defaultdict(list)
   for i in range(len(edges)):
      src, dst = edges[i][0], edges[i][1]
      prob = probability[i]
      g[src].append((dst, prob))
      g[dst].append((src, prob))
   q = deque()
   q.append((start, 1))
   visited = defaultdict(int)
   while q:
      node, prob = q.popleft()
      if visited[node] > prob:
         continue
      else:
         visited[node] = prob
      for adj, nextProb in g[node]:
         if visited[adj] < prob * nextProb:
            q.append((adj, prob * nextProb))
   return visited[end]
edges = [[0,1],[1,2],[0,2]]
probability = [0.5,0.5,0.2]
start = 0
end = 2
print(solve(edges, probability, start, end))

อินพุต

[[0,1],[1,2],[0,2]], [0.5,0.5,0.2], 0, 2

ผลลัพธ์

0.25