Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình tìm vị trí tốt nhất cho trung tâm dịch vụ bằng Python

Giả sử chúng ta có một danh sách các vị trí, trong đó có một danh sách các điểm tọa độ nơi có một số ngôi nhà. Nếu bạn muốn tạo một trung tâm dịch vụ tại (xc, yc) sao cho tổng khoảng cách Euclide từ bất kỳ điểm đã cho nào đến (xc, yc) là nhỏ nhất. Vì vậy, chúng ta phải tìm tổng khoảng cách tối thiểu.

Vì vậy, nếu đầu vào giống như các vị trí =[(10,11), (11,10), (11,12), (12,11)], thì đầu ra sẽ là 4,0

Chương trình tìm vị trí tốt nhất cho trung tâm dịch vụ bằng Python

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • numIter:=50

  • Xác định một hàm tổng (). Điều này sẽ chiếm cx, cy, vị trí

  • tổng:=0,0

  • đối với mỗi p trong các vị trí, hãy thực hiện

    • x, y:=p

    • tổng:=tổng + Khoảng cách Euclide giữa (cx, cy) và (x, y)

  • tổng trả lại

  • Định nghĩa một hàm fy (). Điều này sẽ lấy x, vị trí

  • l:=0, r:=101

  • res:=0

  • đối với tôi trong phạm vi từ 0 đến numIter, thực hiện

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

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

    • t1:=tổng (x, y1, vị trí)

    • t2:=tổng (x, y2, vị trí)

    • res:=tối thiểu của t1 và t2

    • nếu t1

      • r:=y2

    • nếu không,

      • l:=y1

    • trả lại res

    • Định nghĩa một hàm fx (). Điều này sẽ có các vị trí

    • l:=0, r:=101

    • res:=0

    • đối với tôi trong phạm vi từ 0 đến numIter, thực hiện

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

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

      • t1:=fy (x1, vị trí)

      • t2:=fy (x2, vị trí)

      • res:=tối thiểu của t1 và t2

      • nếu t1

        • r:=x2

      • nếu không,

        • l:=x1

    • trả lại res

Từ phương thức chính, trả về fx (vị trí)

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau đây để hiểu rõ hơn

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))

Đầu vào

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

Đầu ra

4.0