2015-11-11 17 views
5

Sto cercando di trovare la distanza di un punto (in 4 dimensioni, solo 2 sono mostrate qui) (qualsiasi croce colorata nella figura) a una presunta frontiera di Pareto (linea nera). Questa linea rappresenta la migliore rappresentazione di frontiera di Pareto durante un processo di ottimizzazione.Calcola la distanza dalla linea smussata

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

In questo momento, ho calcolare la distanza da un qualsiasi punto della frontiera di Pareto come questo:

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] 

Dove posso calcolare la distanza da ogni punto della linea nera, e recuperare la distanza più breve (distanza dal punto più vicino della nota Frontiera).

Tuttavia, penso che dovrei calcolare la distanza dal segmento di linea più vicino. Come potrei fare per raggiungere questo?

enter image description here

+1

Questa è una domanda sull'algoritmo e probabilmente sarebbe meglio migrare verso uno degli altri siti SE ... ma quale? Math.SE ha molti successi per "spline point distance". – smci

+1

Bene, quando si è in grado di trovare i due punti più vicini sulla frontiera di pareto, la connessione lineare tra questi due punti è probabilmente l'elemento di linea più vicino, non è vero? Quindi, come secondo passo puoi calcolare la distanza tra la linea e il punto. – jkalden

+0

La consideriamo un'approssimazione lineare-parziale, non una spline effettiva? – smci

risposta

1

La formula per le coordinate del punto più vicino della linea è data here. In particolare, sei interessato a quello chiamato "linea definita da due punti". Ai posteri, la formula è:

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

Perché la frontiera è relativamente semplice, è possibile scorrere ogni segmento di linea a due punti nella frontiera, e calcolare la distanza minima per ciascuno, mantenendo il più piccolo. È possibile introdurre altri vincoli/pre-computazioni per limitare il numero di calcoli richiesti.

+0

La formula è un po 'difficile da estrapolare a dimensioni superiori, ma la derivazione può essere utilizzata per ri-esprimerla in termini di prodotti punto, il che renderebbe il 100% applicabile alla domanda originale. –

+0

@ Mad Physicist: Sì, l'ho perso nella domanda originale. C'è una buona formulazione qui: http://programmers.stackexchange.com/a/168577 – Benjamin

+0

Inoltre, questa è la distanza dall'intera linea, non dal segmento di linea. Vedi questo post in SO per alcuni calcoli di esempio in diverse lingue: http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment –

Problemi correlati