Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76

    Ricostruzione incolonnamento corretto matrice orari

    Ciao a tutti,
    ho un problema e non riesco a trovare un algoritmo per risolverlo.

    Ho una matrice contenente degli orari (data e ora) strutturata in questo modo:

    Matrice Orari.JPG

    Ogni riga rappresenta un giorno della settimana

    Le colonne sono divise in 4 fasce orarie ed ogni fascia ha un orario di Inizio ed uno di Fine:

    -Ogni fascia può andare da 00:00 a 23:59
    -le fasce sono ordinate in modo crescente
    -le fasce non possono sovrapporsi ed ovviamente l'orario di inizio deve essere minore a quello di fine, Escluso il caso orario vuoto (00:00 To 00:00).

    La matrice però viene "salvata" eliminado le fasce vuote ed allineata a sinistra:

    E.G. la riga F1(00:00 To 00:00); F2(11:00 To 12:00); F3(00:00 To 00:00); F4(16:00 To 17:00)
    Viene salvata come:F1(11:00 To 12:00); F2(16:00 To 17:00) F3(00:00 To 00:00); F4(00:00 To 00:00);

    Avrei bisogno di creare una finzione "inversa" a quella di salvataggio che prenda la matrice salvata e ripristini le fasce vuote visualizzandole incolonnate al posto "giusto":

    Ad esempio tutte le fasce 11:00 To 12:00 nella stessa colonna per ogni giorno della settimana

    Casi particolari:
    - Essendo "ordinate" in modo crescente il valore 00:00 sarà ammesso in una fascia non vuota solamante come valore di inizio

    - Le fasce non uguali andrebbero "centrate" secondo la fascia più logica
    Es:
    --> Ho tutti i giorni (Spesso) la fascia 2 11:00 To 12:00, Un giorno "trovo" una fascia 11:00 To 12:30 la incolonno in fascia 2

    --> Ho tutti i giorni (Spesso) la fascia 2 11:00 To 12:00, Un giorno "trovo" una fascia 10:30 To 12:00 la incolonno in fascia 2

    Non è indispensabile che l'algoritmo sia ottimo, basta che funzioni.

    Ho un paio di spunti che mi sono venuti in mente:

    - Se la fascia è completa (No fasce vuote) è già a posto e posso usarla come base/riferimento per le altre

    - Altrimenti cerco la fascia più "completa" possibile

    - inizio ad incolonnare le fasce Identiche a quella di riferimento

    - passo a cercare le fasce con solo l'inizio o la fine uguali a quelle già ordinate

    - Come gestisco eventuali conflitti??? (Più ipotesi "plausibili" possibili)

    - Una fascia con inizio 00:00 non vuota è sicuramente la "non Vuota" più a sinistra, ma non è' necessariamente la fascia1 (ad esempio se l'orario di fine "matcha" con l'orario di fine di una fascia diversa dalla prima nella "riga di riferimento")
    Considerazione analoga per una fascia con fine alle 23:59

    Un algoritmo realizzato con queste considerazioni, farebbe computazionalmente "schifo" perchè precorrerrebbe sqriate volte la matrice ed in più non è sicuro/dimostrabile che riesca ad incolonnare tutte le righe.

    N.B. non sono interesato al fatto che ricostruisca l'incolonnamento originale, ma quello più logico:
    E.G. se la riga di origine fosse incolonnata male la "ricostruzione" mi restituirebbe un incolonnamento diverso, ma più logico.


    Vi ringrazio in anticipo per l'aiuto.

    P.S. Anche se scrivete in pseudocodice va benissimo.

    P.S.2 altra idea, ma che non so come utilizzare di preciso potrebbe essere il tenere traccia di tutte le fasce differenti presenti nella matrice ordinate in ordine crescente per trovare le "simili".
    Ultima modifica di Mrk31; 23-06-2015 a 12:15

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Crei una matrice giorno*fasce, ordinata secondo l'ora di inizio delle fasce con le fasce disponibili 1 se la fascia è presente nel tal giorno 0 altrimenti.
    codice:
         9:45-12:00 10:50-13:00 14:00-18:30 16:30-18:30 19:00-20:15
    LUN 1           0           1           0           1          
    MAR 0           1           0           1           1          
    MER 1           0           0           1           1          
    ...
    se alla fine hai <=4 colonne hai vinto, basta al più aggiungere colonne vuote.

    Se alla fine hai più di 4 colonne cerchi fra le colonne adiacenti quelle che si sovrappongono e le unisci.
    Unisci a destra o a sinistra a seconda che oraFinePrecedente-oraInizio sia maggiore da una parte o dall'altra.

    Se non ci sono colonne che si sovrappongono vedi tu.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    76
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Crei una matrice giorno*fasce, ordinata secondo l'ora di inizio delle fasce con le fasce disponibili 1 se la fascia è presente nel tal giorno 0 altrimenti.
    codice:
         9:45-12:00 10:50-13:00 14:00-18:30 16:30-18:30 19:00-20:15
    LUN 1           0           1           0           1          
    MAR 0           1           0           1           1          
    MER 1           0           0           1           1          
    ...
    se alla fine hai <=4 colonne hai vinto, basta al più aggiungere colonne vuote.

    Se alla fine hai più di 4 colonne cerchi fra le colonne adiacenti quelle che si sovrappongono e le unisci.
    Unisci a destra o a sinistra a seconda che oraFinePrecedente-oraInizio sia maggiore da una parte o dall'altra.

    Se non ci sono colonne che si sovrappongono vedi tu.
    Grazie mille per il suggerimento non mi è chiaro come scelgo in caso di "parità" la colonna più probabile?

    Nel tuo esempio devo fermarmi a 4 colonne???...in teoria potrei arrivare ad averne 3...
    Ultima modifica di Mrk31; 23-06-2015 a 13:50

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    La costruisci con i dati che prendi in input.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.