Non so se esiste un algoritmo del tempo polinomiale (sembra che potrebbe essere NP-difficile), ma qui ci sono alcuni approcci algoritmici plausibili che potresti prendere in considerazione, se devi risolverlo in pratica:
Euristico
Un algoritmo ben esplorato è Furthest Point First (FPF). Ad ogni iterazione, sceglie un punto più lontano dall'insieme di punti selezionato finora. iterateKvolte. Poiché si tratta di una strategia avida, non c'è motivo di aspettarsi che ciò dia una risposta ottimale o addirittura vicina all'ottimale, ed è stato progettato per ottimizzare una funzione obiettivo leggermente diversa ... ma in alcuni contesti fornisce una ragionevole approssimazione, quindi potrebbe valere la pena provare.
FPF esce dalla letteratura sul clustering basato su grafici ed è stato introdotto nel seguente documento di ricerca:
Teofilo F. Gonzalez. Clustering per ridurre al minimo la distanza massima dell'intercluster . Theoretical Computer Science, vol 38, pagg. 293-306, 1985.
Potresti provare ad esplorare la letteratura sul clustering basato su grafici per vedere se qualcuno ha studiato il tuo problema specifico.
Algoritmi esatti
Se hai questo problema in pratica e hai bisogno di una soluzione ottimale esatta, potresti provare a risolverlo usando un risolutore ILP.
Ecco come. Introdurre variabili 0-o-1xio, dove xio indica se il ioè stato selezionato il vertice e variabili 0 o 1 yio , j, con il significato previsto che yio , j= 1 solo se Xio= 1 e Xj= 1. Ora massimizza la funzione obiettivoΣio , jd( i , j )yio , j, soggetto ai vincoli ΣXio≤ k e Xio≥yio , j e Xj≥yio , j. Ora risolvi questo ILP con un solutore ILP standard. Poiché l'ILP è NP-difficile, non vi è alcuna garanzia che questo sia efficiente, ma potrebbe funzionare su alcune istanze problematiche.
Un altro approccio consiste nell'utilizzare MAX-SAT ponderato . In particolare, introdurre variabili booleaneXio, dove Xio è vero se il ioè stato selezionato il vertice e le variabili yio , j. La formula èϕ ∧∧io , jyio , j, dove φ deve essere vero (le sue clausole hanno un peso W per alcuni molto grandi W) e ogni clausola yio , j è dato peso d( i , j ). Definisci la formulaφ per essere vero se al massimo K del Xiosono vere (vedi qui per i dettagli su come farlo) e seyio , j=Xio∧Xj per tutti io , j. Ora la soluzione a questo problema MAX-SAT ponderato è la soluzione al problema originale, quindi puoi provare a lanciare un solutore MAX-SAT ponderato sul problema. Si applicano gli stessi avvertimenti.