Questo è stato pubblicato originariamente su StackOverflow sebbene suggerito di postare qui.
Sto cercando di creare una soluzione VBA di Excel che creerà una rotazione / pianificazione che alloca il personale per servire gli utenti utilizzando un algoritmo. Credo che esistano già nomi esistenti per questo tipo di problemi / algoritmi ma non sono del tutto sicuro di cosa riferirsi ad esso.
Ecco il mio scenario:
Un collega mi ha contattato con un problema di pianificazione dello staff rispetto alle visite richieste. Attualmente questo è un processo manuale fatto ogni settimana ed è laborioso. I set di dati sono piccoli, in media ci sarebbero 20 utenti del servizio che richiedono ciascuno 2 visite al giorno con 5 membri dello staff disponibili ogni giorno.
Ho un foglio di lavoro che contiene l'elenco del personale disponibile per la settimana successiva. Ogni riga di dati contiene il loro nome, genere, livello di competenza, codice postale di casa, giorno di lavoro, ora di inizio e ora di fine. Un membro del personale può essere elencato più di una volta nello stesso giorno in cui potrebbe essere disponibile per ore al mattino e anche di sera.
Un altro foglio di lavoro contiene l'elenco degli utenti del servizio e le visite richieste per la settimana successiva. Ogni riga di dati contiene il nome, il codice postale, il giorno di visita, l'orario di visita, la durata della visita, il genere richiesto (cioè deve essere visto da un maschio / femmina), il livello di abilità richiesto (cioè qualsiasi, certificato) e il numero di personale richiesto per quella visita (cioè 1 o 2). Anche in questo caso un utente di servizio può apparire più di una volta nello stesso giorno in cui potrebbe richiedere più visite in momenti diversi della giornata (cioè mattina e sera)
Ho già creato alcune funzioni VBA per gestire la gestione dei codici postali e ottenere le coordinate di latitudine / longitudine insieme a una funzione per calcolare la distanza tra due punti in linea d'aria. Allo stato attuale i valori distinti dei codici postali con le loro coordinate sono memorizzati su un foglio di supporto per il riferimento di VBA.
Quello che cerco davvero è una guida su come persino la creazione di una procedura / algoritmo che produrrà una rotazione / pianificazione suggerita, questa potrebbe essere una semplice tabella con accoppiamenti tra il personale e le visite. Il processo deve sempre effettuare abbinamenti adeguati basati su:
- Livello di abilità richiesto
- Sesso richiesto
- Disponibilità dello staff
Meno importante è che le partite tengano in considerazione la distanza necessaria per viaggiare tra una visita e l'altra. Credo che questo sia chiamato Algoritmo Genetico?
Potrebbero esserci casi in cui ci sono troppi utenti del servizio per il personale disponibile e viceversa. L'utilizzo di tutto il personale non è necessario a condizione che tutte le visite siano gestite, se tutte le visite non possono essere abbinate a causa della mancanza di disponibilità del personale, allora questo deve essere elencato come non soddisfatto.
Posso utilizzare SQL Server se necessario, ma alla fine la soluzione deve essere presentata in Excel all'utente finale, in quanto questo è ciò che è più familiare.
Penso che la procedura / processo debba andare in questo modo:
- Per ogni giorno, ordina le visite per orario di inizio
- Per ogni visita, determinare quali membri dello staff incontrano il genere e requisito di livello di abilità ed è disponibile in quel giorno
- Per ogni membro del personale sopra determinato, sono disponibili a il tempo richiesto?
- Per ogni membro dello staff che è disponibile calcola la distanza da la loro posizione attuale dove devono essere
- Classifica in ordine di preferenza in base alla distanza richiesta per viaggiare
- Una volta che questo è stato fatto per ogni giorno, trovare un suggerimento assegnazione del personale alle visite utilizzando una sorta di metodo di punteggio
Non sono un esperto VBA e gestisco SQL Server come lavoro giornaliero, ma sono disposto a provare a trovare una soluzione adeguata, ho solo bisogno di alcune indicazioni su come iniziare al meglio.