Sto cercando di capire un algoritmo per la risoluzione dei tempi degli appuntamenti.
Al momento ho un algoritmo ingenuo che abbatte ripetutamente gli appuntamenti in conflitto, fino a quando non ci sono più appuntamenti.
# The appointment list is always sorted on start time
appointment_list = [
<Appointment: 10:00 -> 12:00>,
<Appointment: 11:00 -> 12:30>,
<Appointment: 13:00 -> 14:00>,
<Appointment: 13:30 -> 14:30>,
]
I vincoli sono quegli appuntamenti:
- non può essere dopo le 15:00
- non può essere prima delle 9:00
Questo è l'algoritmo ingenuo
for i, app in enumerate(appointment_list):
for possible_conflict in appointment_list[i+1:]:
if possible_conflict.start < app.end:
difference = app.end - possible_conflict.start
possible_conflict.end += difference
possible_conflict.start += difference
else:
break
Ciò comporta la seguente risoluzione, che ovviamente rompe quei vincoli e l'ultimo appuntamento dovrà essere spinto al giorno successivo.
appointment_list = [
<Appointment: 10:00 -> 12:00>,
<Appointment: 12:00 -> 13:30>,
<Appointment: 13:30 -> 14:30>,
<Appointment: 14:30 -> 15:30>,
]
Ovviamente questo non è ottimale, esegue 3 movimenti di appuntamento quando il conflitto potrebbe essere risolto con uno: se siamo stati in grado di spingere indietro il primo appuntamento, potremmo evitare di spostare tutti gli appuntamenti successivi verso il basso.
Penso che dovrebbe esserci una sorta di approccio a distanza che calcola il numero minimo di appuntamenti da spostare per risolvere il conflitto di scheduling , ma non posso ottenere un controllo sulla metodologia. Dovrebbe essere la ricerca della prima soluzione in profondità o in profondità. Quando so se la soluzione è "abbastanza buona"?