Nota: questa non è una soluzione completa, ma volevo condividere un paio di considerazioni. Si prega di provare e trovare una soluzione migliore.
Quindi, abbiamo n
richiedenti e un insieme di competenze m
S = {s(1),s(2),...,s(m)}
.
Ogni richiedente è, per i nostri scopi, un sottoinsieme A
di S
che caratterizza le sue abilità.
t
è il numero di candidati da scegliere (ad esempio 3 o 6).
Come detto OP, possiamo rappresentare le competenze di ogni richiedente come una stringa di lunghezza m
, dove il carattere nella posizione i
è 1 se s(i)
appartiene A
, e 0 in caso contrario.
Esempio:
S = {Programming, Accounting}
Programming Accounting
Applicant1 0 1
Applicant2 1 1
riduzione del numero di richiedenti
Possiamo definire il seguente ordine alle ricorrenti: dati due ricorrenti a1 e a2, diciamo che a1 <= a2
se e solo se la seguente affermazione è vera: if a1 has a skill, then a2 also has it
. Nell'esempio sopra, abbiamo Applicant1 <= Applicant2
.
Ora possiamo filtrare il set dei nostri richiedenti utilizzando questo ordine: se un richiedente a1 è "sotto" un altro richiedente a2 nel nostro ordine, a1 può essere scartatore, poiché la scelta di a2 produrrà sempre almeno lo stesso risultato. Questo può essere fatto nei passi O(n^2)
.
non ottimali, algoritmo greedy
Una volta che abbiamo finito, vorrei procedere in questo modo:
r = string of lenght m filled with zeros
choose an applicant a
r = skills(a)
best_applicant = null
APPLICANT_LIST = new LIST
APPLICANT_LIST.add(a)
for(counter=0; counter < (t-1); counter ++)
{
foreach applicant b not in APPLICANT_LIST
{
if (count(skills(b) OR r) > count(r))
then
r = (skills(b) OR r)
best_applicant = b
}
APPLICANT_LIST.add(b)
}
In sostanza, avrei scelto un candidato a
e iniziare con la sua/il suo set di abilità r
, e quindi cercare il richiedente b
che aggiungerebbe la maggior parte delle competenze al mio set esistente r
per massimizzarlo. Aggiungerei b
alla mia lista e ripetere la procedura finché non avrò un gruppo di richiedenti t
. Tutto questo viene fatto nei passaggi O(n^2)
(poiché t
è costante, lo ignoro). Questo pseudocodice potrebbe non essere corretto da uno scopo di programmazione (a seconda della lingua, potresti voler controllare le condizioni di uscita, i puntatori nulli, ecc.), Ma sono sicuro che ti verrà l'idea.
Ho paura che questo metodo non produce sempre la soluzione ottimale, come mostra questo esempio:
t = 3
a1 000000001111
a2 000011110000
a3 111100000000
a4 110111001101
se si dovesse cominciare a4
, non avrebbe mai arrivare alla soluzione ottimale {a1,a2,a3}
. Questo è il prezzo che paghiamo per una soluzione ottimale in ogni fase, ma non considera il problema da una visione globale.
Nota: nell'esempio precedente, la scelta di un richiedente di partenza diverso non sarebbe di aiuto, poiché a4 sarebbe comunque incluso. Potrebbe anche essere completamente avido e scegliere il candidato con il maggior numero di competenze come il nostro primo candidato.
Se qualcuno riesce a trovare una soluzione ** ottimale ** che gira anche in n^2, sarò felice di cancellare il mio. – Numbers