logo

총 거리를 최소화하는 최적의 지점 위치

GfG Practice에서 사용해 보세요. 총 거리를 최소화하는 최적의 지점 위치' title= #practiceLinkDiv { 표시: 없음 !중요; }

점 집합과 ax+by+c = 0인 선이 주어지면 주어진 점 집합으로부터의 거리 합이 최소가 되는 주어진 선에서 점을 찾아야 합니다. 

예:  



C의 표준 입력
In above figure optimum location of point of x - y - 3 = 0 line is (2 -1) whose total distance with other points is 20.77 which is minimum obtainable total distance.
Recommended Practice 총 거리를 최소화하는 최적의 지점 위치 시도해 보세요!

무한 거리에서 주어진 선의 한 점을 취하면 이제 이 점을 주어진 점 쪽으로 이동하면 총 거리 비용은 무한해집니다. 총 거리 비용은 감소하기 시작하고 얼마 후 다시 증가하기 시작하여 선의 다른 무한 끝에서 무한에 도달하므로 거리 비용 곡선은 U-곡선처럼 보이고 이 U-곡선의 최저 값을 찾아야 합니다. 

U-곡선은 단조롭게 증가하거나 감소하지 않으므로 여기서는 최하위 지점을 찾기 위해 이진 검색을 사용할 수 없습니다. 삼항 검색은 각 반복에서 검색 공간의 1/3을 건너뜁니다. 삼항 검색에 대해 자세히 읽을 수 있습니다. 여기

따라서 솔루션은 다음과 같이 진행됩니다. 각각 가장 작은 값과 가장 큰 값으로 초기화된 low 및 high로 시작한 다음 각 반복에서 반복을 시작합니다. 검색 공간에서 1/3 및 2/3 위치를 나타내는 두 개의 mid mid1 및 mid2를 계산합니다. mid1 및 mid2가 있는 모든 점의 총 거리를 계산하고 이러한 거리 비용을 비교하여 low 또는 high를 업데이트합니다. 이 반복은 low와 high가 대략 같아질 때까지 계속됩니다. 

멍청한 점
C++
// C/C++ program to find optimum location and total cost #include    using namespace std; #define sq(x) ((x) * (x)) #define EPS 1e-6 #define N 5 // structure defining a point struct point {  int x y;  point() {}  point(int x int y)  : x(x)   y(y)  {  } }; // structure defining a line of ax + by + c = 0 form struct line {  int a b c;  line(int a int b int c)  : a(a)   b(b)   c(c)  {  } }; // method to get distance of point (x y) from point p double dist(double x double y point p) {  return sqrt(sq(x - p.x) + sq(y - p.y)); } /* Utility method to compute total distance all points  when choose point on given line has x-coordinate  value as X */ double compute(point p[] int n line l double X) {  double res = 0;  // calculating Y of chosen point by line equation  double Y = -1 * (l.c + l.a * X) / l.b;  for (int i = 0; i < n; i++)  res += dist(X Y p[i]);  return res; } // Utility method to find minimum total distance double findOptimumCostUtil(point p[] int n line l) {  double low = -1e6;  double high = 1e6;  // loop until difference between low and high  // become less than EPS  while ((high - low) > EPS) {  // mid1 and mid2 are representative x co-ordiantes  // of search space  double mid1 = low + (high - low) / 3;  double mid2 = high - (high - low) / 3;  //  double dist1 = compute(p n l mid1);  double dist2 = compute(p n l mid2);  // if mid2 point gives more total distance  // skip third part  if (dist1 < dist2)  high = mid2;  // if mid1 point gives more total distance  // skip first part  else  low = mid1;  }  // compute optimum distance cost by sending average  // of low and high as X  return compute(p n l (low + high) / 2); } // method to find optimum cost double findOptimumCost(int points[N][2] line l) {  point p[N];  // converting 2D array input to point array  for (int i = 0; i < N; i++)  p[i] = point(points[i][0] points[i][1]);  return findOptimumCostUtil(p N l); } // Driver code to test above method int main() {  line l(1 -1 -3);  int points[N][2] = {  { -3 -2 } { -1 0 } { -1 2 } { 1 2 } { 3 4 }  };  cout << findOptimumCost(points l) << endl;  return 0; } 
Java
// A Java program to find optimum location // and total cost class GFG {  static double sq(double x) { return ((x) * (x)); }  static int EPS = (int)(1e-6) + 1;  static int N = 5;  // structure defining a point  static class point {  int x y;  point() {}  public point(int x int y)  {  this.x = x;  this.y = y;  }  };  // structure defining a line of ax + by + c = 0 form  static class line {  int a b c;  public line(int a int b int c)  {  this.a = a;  this.b = b;  this.c = c;  }  };  // method to get distance of point (x y) from point p  static double dist(double x double y point p)  {  return Math.sqrt(sq(x - p.x) + sq(y - p.y));  }  /* Utility method to compute total distance all points  when choose point on given line has x-coordinate  value as X */  static double compute(point p[] int n line l  double X)  {  double res = 0;  // calculating Y of chosen point by line equation  double Y = -1 * (l.c + l.a * X) / l.b;  for (int i = 0; i < n; i++)  res += dist(X Y p[i]);  return res;  }  // Utility method to find minimum total distance  static double findOptimumCostUtil(point p[] int n  line l)  {  double low = -1e6;  double high = 1e6;  // loop until difference between low and high  // become less than EPS  while ((high - low) > EPS) {  // mid1 and mid2 are representative x  // co-ordiantes of search space  double mid1 = low + (high - low) / 3;  double mid2 = high - (high - low) / 3;  double dist1 = compute(p n l mid1);  double dist2 = compute(p n l mid2);  // if mid2 point gives more total distance  // skip third part  if (dist1 < dist2)  high = mid2;  // if mid1 point gives more total distance  // skip first part  else  low = mid1;  }  // compute optimum distance cost by sending average  // of low and high as X  return compute(p n l (low + high) / 2);  }  // method to find optimum cost  static double findOptimumCost(int points[][] line l)  {  point[] p = new point[N];  // converting 2D array input to point array  for (int i = 0; i < N; i++)  p[i] = new point(points[i][0] points[i][1]);  return findOptimumCostUtil(p N l);  }  // Driver Code  public static void main(String[] args)  {  line l = new line(1 -1 -3);  int points[][] = { { -3 -2 }  { -1 0 }  { -1 2 }  { 1 2 }  { 3 4 } };  System.out.println(findOptimumCost(points l));  } } // This code is contributed by Rajput-Ji 
Python3
# A Python3 program to find optimum location # and total cost import math class Optimum_distance: # Class defining a point class Point: def __init__(self x y): self.x = x self.y = y # Class defining a line of ax + by + c = 0 form class Line: def __init__(self a b c): self.a = a self.b = b self.c = c # Method to get distance of point  # (x y) from point p def dist(self x y p): return math.sqrt((x - p.x) ** 2 + (y - p.y) ** 2) # Utility method to compute total distance # all points when choose point on given # line has x-coordinate value as X def compute(self p n l x): res = 0 y = -1 * (l.a*x + l.c) / l.b # Calculating Y of chosen point # by line equation for i in range(n): res += self.dist(x y p[i]) return res # Utility method to find minimum total distance def find_Optimum_cost_untill(self p n l): low = -1e6 high = 1e6 eps = 1e-6 + 1 # Loop until difference between low # and high become less than EPS while((high - low) > eps): # mid1 and mid2 are representative x # co-ordiantes of search space mid1 = low + (high - low) / 3 mid2 = high - (high - low) / 3 dist1 = self.compute(p n l mid1) dist2 = self.compute(p n l mid2) # If mid2 point gives more total  # distance skip third part if (dist1 < dist2): high = mid2 # If mid1 point gives more total # distance skip first part else: low = mid1 # Compute optimum distance cost by  # sending average of low and high as X return self.compute(p n l (low + high) / 2) # Method to find optimum cost def find_Optimum_cost(self p l): n = len(p) p_arr = [None] * n # Converting 2D array input to point array for i in range(n): p_obj = self.Point(p[i][0] p[i][1]) p_arr[i] = p_obj return self.find_Optimum_cost_untill(p_arr n l) # Driver Code if __name__ == '__main__': obj = Optimum_distance() l = obj.Line(1 -1 -3) p = [ [ -3 -2 ] [ -1 0 ] [ -1 2 ] [ 1 2 ] [ 3 4 ] ] print(obj.find_Optimum_cost(p l)) # This code is contributed by Sulu_mufi 
C#
// C# program to find optimum location // and total cost using System; class GFG {  static double sq(double x) { return ((x) * (x)); }  static int EPS = (int)(1e-6) + 1;  static int N = 5;  // structure defining a point  public class point {  public int x y;  public point() {}  public point(int x int y)  {  this.x = x;  this.y = y;  }  };  // structure defining a line  // of ax + by + c = 0 form  public class line {  public int a b c;  public line(int a int b int c)  {  this.a = a;  this.b = b;  this.c = c;  }  };  // method to get distance of  // point (x y) from point p  static double dist(double x double y point p)  {  return Math.Sqrt(sq(x - p.x) + sq(y - p.y));  }  /* Utility method to compute total distance  of all points when choose point on  given line has x-coordinate value as X */  static double compute(point[] p int n line l  double X)  {  double res = 0;  // calculating Y of chosen point  // by line equation  double Y = -1 * (l.c + l.a * X) / l.b;  for (int i = 0; i < n; i++)  res += dist(X Y p[i]);  return res;  }  // Utility method to find minimum total distance  static double findOptimumCostUtil(point[] p int n  line l)  {  double low = -1e6;  double high = 1e6;  // loop until difference between  // low and high become less than EPS  while ((high - low) > EPS) {  // mid1 and mid2 are representative  // x co-ordiantes of search space  double mid1 = low + (high - low) / 3;  double mid2 = high - (high - low) / 3;  double dist1 = compute(p n l mid1);  double dist2 = compute(p n l mid2);  // if mid2 point gives more total distance  // skip third part  if (dist1 < dist2)  high = mid2;  // if mid1 point gives more total distance  // skip first part  else  low = mid1;  }  // compute optimum distance cost by  // sending average of low and high as X  return compute(p n l (low + high) / 2);  }  // method to find optimum cost  static double findOptimumCost(int[ ] points line l)  {  point[] p = new point[N];  // converting 2D array input to point array  for (int i = 0; i < N; i++)  p[i] = new point(points[i 0] points[i 1]);  return findOptimumCostUtil(p N l);  }  // Driver Code  public static void Main(String[] args)  {  line l = new line(1 -1 -3);  int[ ] points = { { -3 -2 }  { -1 0 }  { -1 2 }  { 1 2 }  { 3 4 } };  Console.WriteLine(findOptimumCost(points l));  } } // This code is contributed by 29AjayKumar 
JavaScript
<script> // A JavaScript program to find optimum location // and total cost function sq(x) {  return x*x; } let EPS = (1e-6) + 1; let N = 5; // structure defining a point class point {  constructor(xy)  {  this.x=x;  this.y=y;  } } // structure defining a line of ax + by + c = 0 form class line {  constructor(abc)  {  this.a = a;  this.b = b;  this.c = c;  }   } // method to get distance of point (x y) from point p function dist(xyp) {  return Math.sqrt(sq(x - p.x) + sq(y - p.y)); } /* Utility method to compute total distance all points  when choose point on given line has x-coordinate  value as X */ function compute(pnlX) {  let res = 0;    // calculating Y of chosen point by line equation  let Y = -1 * (l.c + l.a * X) / l.b;  for (let i = 0; i < n; i++)  res += dist(X Y p[i]);    return res; } // Utility method to find minimum total distance function findOptimumCostUtil(pnl) {  let low = -1e6;  let high = 1e6;    // loop until difference between low and high  // become less than EPS  while ((high - low) > EPS) {  // mid1 and mid2 are representative x  // co-ordiantes of search space  let mid1 = low + (high - low) / 3;  let mid2 = high - (high - low) / 3;    let dist1 = compute(p n l mid1);  let dist2 = compute(p n l mid2);    // if mid2 point gives more total distance  // skip third part  if (dist1 < dist2)  high = mid2;    // if mid1 point gives more total distance  // skip first part  else  low = mid1;  }    // compute optimum distance cost by sending average  // of low and high as X  return compute(p n l (low + high) / 2); } // method to find optimum cost function findOptimumCost(pointsl) {  let p = new Array(N);    // converting 2D array input to point array  for (let i = 0; i < N; i++)  p[i] = new point(points[i][0] points[i][1]);    return findOptimumCostUtil(p N l); } // Driver Code let l = new line(1 -1 -3); let points= [[ -3 -2 ]  [ -1 0 ]  [ -1 2 ]  [ 1 2 ]  [ 3 4 ]]; document.write(findOptimumCost(points l)); // This code is contributed by rag2127 </script> 

산출
20.7652

시간 복잡도:2
보조 공간: 에)