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

โปรแกรมหาตำแหน่งที่ดีที่สุดสำหรับศูนย์บริการใน Python


สมมติว่าเรามีรายชื่อตำแหน่ง ซึ่งมีรายการจุดพิกัดที่มีบ้านบางหลังตั้งอยู่ หากคุณต้องการสร้างศูนย์บริการที่ (xc, yc) เพื่อให้ผลรวมของระยะทางแบบยุคลิดจากจุดใดก็ตามที่กำหนดถึง (xc, yc) มีค่าน้อยที่สุด เราจึงต้องหาผลรวมของระยะทางขั้นต่ำ

ดังนั้น หากอินพุตเหมือนกับตำแหน่ง =[(10,11),(11,10),(11,12),(12,11)] ผลลัพธ์จะเป็น 4.0

โปรแกรมหาตำแหน่งที่ดีที่สุดสำหรับศูนย์บริการใน Python

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

  • numIter :=50

  • กำหนดฟังก์ชัน total() นี่จะใช้เวลา cx, cy, ตำแหน่ง

  • รวม :=0.0

  • สำหรับแต่ละ p ในตำแหน่ง ทำ

    • x, y :=p

    • รวม :=ทั้งหมด + ระยะห่างแบบยุคลิดระหว่าง (cx, cy) และ (x, y)

  • ผลตอบแทนรวม

  • กำหนดฟังก์ชัน fy() นี่จะใช้เวลา x ตำแหน่ง

  • l :=0, r :=101

  • res :=0

  • สำหรับฉันอยู่ในช่วง 0 ถึง numIter ทำ

    • y1 :=l + (r - l) / 3

    • y2 :=r - (r - l) / 3

    • t1 :=รวม (x, y1, ตำแหน่ง)

    • t2 :=รวม (x, y2, ตำแหน่ง)

    • res :=ขั้นต่ำ t1 และ t2

    • ถ้า t1

      • r :=y2

    • มิฉะนั้น

      • ล :=y1

    • ผลตอบแทน

    • กำหนดฟังก์ชัน fx() ซึ่งจะเข้ารับตำแหน่ง

    • l :=0, r :=101

    • res :=0

    • สำหรับฉันอยู่ในช่วง 0 ถึง numIter ทำ

      • x1 :=l + (r - l) / 3

      • x2 :=r - (r - l) / 3

      • t1 :=fy(x1, ตำแหน่ง)

      • t2 :=fy(x2, ตำแหน่ง)

      • res :=ขั้นต่ำ t1 และ t2

      • ถ้า t1

        • r :=x2

      • มิฉะนั้น

        • l :=x1

    • ผลตอบแทน

จากวิธีหลัก คืนค่า fx(ตำแหน่ง)

ตัวอย่าง

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

from math import sqrt
def solve(points):
   numIter = 50

   def total(cx, cy, positions):
      total = 0.0
      for p in positions:
         x, y = p
         total += sqrt((cx - x) * (cx - x) + (cy - y) * (cy - y))
      return total

   def fy(x, positions):
      l, r = 0, 101
      res = 0
      for i in range(numIter):
         y1 = l + (r - l) / 3
         y2 = r - (r - l) / 3
         t1 = total(x, y1, positions)
         t2 = total(x, y2, positions)
         res = min(t1, t2)
         if t1 < t2:
            r = y2
         else:
            l = y1
      return res

   def fx(positions):
      l, r = 0, 101
      res = 0
      for i in range(numIter):
         x1 = l + (r - l) / 3
         x2 = r - (r - l) / 3
         t1 = fy(x1, positions)
         t2 = fy(x2, positions)
         res = min(t1, t2)
         if t1 < t2:
            r = x2
         else:
            l = x1
      return res

   return fx(positions)

positions = [(10,11),(11,10),(11,12),(12,11)]
print(solve(positions))

อินพุต

[(10,11),(11,10),(11,12),(12,11)]

ผลลัพธ์

4.0