Algoritmo per ridurre al minimo la durata

0

Ho orari per l'avvio e l'interruzione e la data del servizio, come questa:

2000-01-01 23:00 23:20
2000-01-01 23:50 00:10
2000-01-01 00:20 00:30

L'ora di fine del secondo periodo e il terzo periodo devono essere spostati al giorno successivo, quindi il risultato sarebbe:

2000-01-01 23:00 2000-01-01 23:20
2000-01-01 23:50 2000-01- 02 00:10
2000-01- 02 00:20 2000-01- 02 00:30

Posso non assumere che le voci siano state inserite nell'ordine in cui i record sono inseriti (quindi la voce 2000-01-01 00:20 00:30 potrebbe non apparire dopo gli altri due, 00:20 potrebbe significare 2000-01-01 00:20 o %codice%). Invece, il mio criterio sarà:
Ridurre al minimo la durata tra il tempo minimo di inizio e il tempo massimo di arresto in ogni giorno.

In questo esempio:

Se supponevo che tutti i tempi siano nel 2000-01-01, la durata tra l'ora di inizio minima e l'ora di fine massima sarebbe di 23 ore (dalle 00:20 alle 23:20). Se sposto il secondo e il terzo periodo come nel mio esempio, la durata tra l'ora di inizio minima e l'ora di fine corsa massima è 1:30 (dalle 23:00 del 01/01 alle 00:30 del 01/02).

Esiste una classe di algoritmi, che coprirebbe questo tipo di ottimizzazione, se non qualche idea da cui partire?

    
posta Giedrius 20.09.2016 - 08:55
fonte

3 risposte

1

Ci sono due parti del tuo problema. Il primo è che è necessario determinare la durata di ciascun periodo. L'unica vera complicazione esiste quando il periodo attraversa il confine della data. Per farlo, prendi la data e inseriscila in entrambe le volte. Se l'ora di fine è inferiore all'avvio, incrementa la data sull'ora di fine di un giorno.

La seconda parte del problema è l'operazione di minimizzazione. Essenzialmente, stai vedendo quale ordine dei periodi crea il più piccolo intervallo dall'inizio del primo periodo fino alla fine dell'ultimo periodo. Questo probabilmente si associa al problema dell'imballaggio dei contenitori e ci sono molti algoritmi disponibili. Suggerirei la forza bruta provando ogni ordine se non si hanno molti periodi (meno di una dozzina di tentativi) da affrontare.

Una volta determinato l'ordine, le date di inizio e di fine dovrebbero seguire facilmente.

    
risposta data 20.09.2016 - 16:53
fonte
0

Ho dovuto fare un compito simile prima.

La 'data' era in realtà un 'giorno lavorativo' che era solo una raccolta di tutte le cose che volevi rendere conto in un particolare giorno e le cose registrate dal sistema di cassa registrano solo il tempo.

Quindi ti rimanevano alcune situazioni strane con giorni di oltre 24 ore, l'ora legale ecc.

Ma non è proprio una "ottimizzazione" da programmare nelle regole aziendali necessarie per cambiare l'ora in un datetime.

Nel tuo caso sembra una semplice dichiarazione di:

è l'ora di fine prima dell'ora di inizio? Aggiungi un giorno alla fine del tempo.

    
risposta data 20.09.2016 - 14:39
fonte
-1
  1. ordinali
  2. iterare una volta
    se tempo questo al prossimo delta > ultimo a (ora questo + 1 giorno)
    quindi aggiungi un giorno a questo
risposta data 20.09.2016 - 14:33
fonte

Leggi altre domande sui tag