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

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

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

예:  

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     =     -  1  e6  ;      double     high     =     1  e6  ;      // 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  (  x    y  )      {      this  .  x  =  x  ;      this  .  y  =  y  ;      }   }   // structure defining a line of ax + by + c = 0 form   class     line   {      constructor  (  a    b    c  )      {      this  .  a     =     a  ;      this  .  b     =     b  ;      this  .  c     =     c  ;      }       }   // method to get distance of point (x y) from point p   function     dist  (  x    y    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 */   function     compute  (  p    n    l    X  )   {      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  (  p    n    l  )   {      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  (  points    l  )   {      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
보조 공간: 에)


 

퀴즈 만들기