2015-11-11 14 views
5

Ich versuche die Entfernung eines Punktes (in 4 Dimensionen, hier sind nur 2 gezeigt) (beliebige farbige Kreuze in der Abbildung) zu einer angenommenen Pareto-Grenze (schwarze Linie) zu finden. Diese Linie repräsentiert die beste Pareto-Grenzdarstellung während eines Optimierungsprozesses.Abstand zu geglätteter Linie berechnen

Pareto = [[0.3875575798354123, -2.4122340425531914], [0.37707675586149786, -2.398936170212766], [0.38176077842761763, -2.4069148936170213], [0.4080534133844003, -2.4914285714285715], [0.35963459448268725, -2.3631532329495126], [0.34395217638838566, -2.3579931972789114], [0.32203302106516224, -2.344858156028369], [0.36742404637441123, -2.3886054421768708], [0.40461156254852226, -2.4141156462585034], [0.36387868122767975, -2.375], [0.3393199109776927, -2.348404255319149]] 

Gerade jetzt, berechne ich den Abstand von einem beliebigen Punkt auf der Pareto Grenze wie folgt aus:

def dominates(row, rowCandidate): 
return all(r >= rc for r, rc in zip(row, rowCandidate)) 

def dist2Pareto(pareto,candidate): 
    listDist = [] 

    dominateN = 0 
    dominatePoss = 0 
    if len(pareto) >= 2: 
     for i in pareto: 
      if i != candidate: 
       dominatePoss += 1 
       dominate = dominates(candidate,i) 
       if dominate == True: 
        dominateN += 1 
       listDist.append(np.linalg.norm(np.array(i)-np.array(candidate))) 

     listDist.sort() 

     if dominateN == len(pareto): 
      print "beyond"    
      return listDist[0] 
     else: 
      return listDist[0] 

Wo ich den Abstand zu jedem Punkt der schwarzen Linie zu berechnen, und rufen Sie den kürzesten Abstand (Entfernung zum nächsten Punkt des bekannten Frontier).

Allerdings glaube ich, ich sollte stattdessen die Entfernung zum nächsten Liniensegment berechnen. Wie würde ich das erreichen?

enter image description here

+1

Dies ist eine Algorithmusfrage und würde wahrscheinlich besser auf eine der anderen SE-Seiten migriert werden ... aber welche? Math.SE hat viele Treffer für "Punkt-Spline-Abstand". – smci

+1

Nun, wenn Sie in der Lage sind, die zwei nächsten Punkte auf der Pareto-Grenze zu finden, ist die lineare Verbindung zwischen diesen beiden Punkten wahrscheinlich das nächste Linienelement, oder? So können Sie als zweiten Schritt den Abstand zwischen der Linie und dem Punkt berechnen. – jkalden

+0

Nehmen wir dies eine stückweise lineare Approximation, nicht einen tatsächlichen Spline? – smci

Antwort

1

Die Formel für die Koordinaten des nächstgelegenen Punkt auf der Linie wird here gegeben. Speziell interessiert Sie die "Linie, die durch zwei Punkte definiert wird". Für die Nachwelt der Formel:

Formula for distance between a line defined by two points, and a third point

Da die Grenze relativ einfach ist, können Sie eine Schleife durch jedes Zweipunktliniensegment in der Grenze, und die Berechnung die kürzeste Distanz für jeden, die kleinste zu halten. Sie könnten andere Einschränkungen/Vorberechnungen einführen, um die Anzahl der erforderlichen Berechnungen zu begrenzen.

+0

Ihre Formel ist ein wenig schwierig zu höheren Dimensionen zu extrapolieren, aber die Ableitung kann verwendet werden, um es in Bezug auf Punktprodukte wieder auszudrücken, die es 100% für die ursprüngliche Frage anwendbar machen würde. –

+0

@ Mad Physicist: Ja, das habe ich in der ursprünglichen Frage verpasst. Es gibt eine gute Formulierung hier: http://programmers.stackexchange.com/a/168577 – Benjamin

+0

Dies ist auch der Abstand zu der gesamten Linie, nicht das Liniensegment. Sehen Sie diese SO Post für einige Beispielberechnungen in verschiedenen Sprachen: http://StackOverflow.com/Questions/849211/Shortest-distance-between-a-point-and-a-line-Segment –

Verwandte Themen