Aiuto per comprendere e risolvere un problema

di il
6 risposte

Aiuto per comprendere e risolvere un problema

Salve sono un nuovo utente,
devo risolvere il seguente problema:
scrivere un programma in C che ricevuta in ingresso la lunghezza di un percorso videosorvegliato, il numero delle telecamere poste, e il segmento su cui ognuna è operativa, calcolare
il numero minimo di telecamere necessarie per controllare tutto il percorso.
es. il percorso va da 0 a 7
le telecamere poste sono 5
i segmenti sono (3,5) (1,3) (0,2) (5,6) (4,7)

Chiedo aiuto nel comprendere il problema, individuare quali strutture dati mi servono per impostare una soluzione possibile.
grazie

6 Risposte

  • Re: Aiuto per comprendere e risolvere un problema

    Ciao
    per risolvere il problema ti serve anche il raggio minimo della telecamera cioè ogni quanti metri deve essere posta una telecamera.
  • Re: Aiuto per comprendere e risolvere un problema

    Ho riportato la traccia del problema, e i dati a disposizione sono solo quelli, perchè tra le telecamere poste e i segmenti indicati e dati in input, si deve verificare se ogni segmento è coperto e quindi dare in output il numero minimo necessario e sufficiente a coprire il percorso. Per un percorso pari a 7, si assumono i seguenti segmenti : 0,1,2,3,4,..7.
  • Re: Aiuto per comprendere e risolvere un problema

    E' il classico problema dello zaino (Knapsack problem). E' un problema NP-Difficile e normalmente viene risolto facendo uso di tecniche di programmazione dinamica. Non so se stai facendo l'università e se hai già fatto lezioni di informatica teorica dove di solito questi tipi di problemi vengono affrontati e trattati. Ti invito comunque a leggerti qualcosa al riguardo, anche solo da wikipedia, ma senza un'adeguata introduzione, l'argomento potrebbe risultare un po' ostico. Per un approccio più pragmatico puoi sempre cercare in rete algoritmi per il knapsack, ne trovi millemila.
  • Re: Aiuto per comprendere e risolvere un problema

    In effetti lezioni di informatica dinamica sono state affrontate in epoca universitaria. In seguito mai più affrontati, ora mi trovo davanti a questo problema ed ho difficoltà ad affrontarlo. Avrei voluto codice di esempio di problemi del tipo per ragionare e lavorare al contrario per rinfrescarmi le idee.
  • Re: Aiuto per comprendere e risolvere un problema

    Non e' un knapsack problem. Il problema da risolvere non ha le caratteristiche adatte almeno per un motivo: ogni telecamera ha un ben specifico range d'azione la cui cosa implica un ordine.

    Mi vengono in mente almeno 2 possibili approcci:

    1) il classico brute force Si mettono in ordine le telecamere in base alla posizione di inizio del segmento di pertinenza e poi in base alla lunghezza. Quindi si procede per tentativi, iniziando con 1,2,... telecamere. E' combinatoriale, ma se non si devono mettere in ordine non piu' di 10 telecamere (10! e' gia' bello grosso, ma ancora gestibile da un pc moderno), non e' un problema

    2) uso del backtracking, piu' efficiente del precedente, ma piu' complesso da implementare: si inizia con una telecamera, e si aggiungono le altre. Una telecamera non viene inserita se ricopre un intervallo gia' coperto da quelle gia' inserite

    Comunque, un po' di spirito di iniziativa, suvvia.
    Non e' possibile non avere nemmeno un'idea di come risolvere un problema del genere.
    Anche una soluzione innefficiente, e' una soluzione!

    Toh, mentre scrivo mi e' venuto in mente una 3^a soluzione. Sara' sciocca, banale, stupida, ma comunque e' una soluzione!


    E questo e' un classico esempio di quello che dico sempre: saper programmare non e' saper usare un linguaggio di programnazione, qualunque esso sia, ma sapere, dato un problema come rappresentarlo e trovare un algoritmo per ridolverlo.
    E questo e' indipendente da li guaggio di programmazione!

    Quindi, non ti servono esempi di codice, ma ti servono NEURONI
    E studiare sui libri
  • Re: Aiuto per comprendere e risolvere un problema

    Migliorabile ha ragione, non si tratta di un knapsack problem, ho risposto un po' in fretta, scusatemi.

    Per quanto riguarda una possibile soluzione aggiungo a quelle di migliorabile anche questa:

    1. ogni telecamera è identificata da due valori (l, r) che rappresentano il limite sinistro e quello destro del raggio di azione

    2. si definisce una funzione con i seguenti parametri low, upper che avrà il compito di trovare la telecamera che abbia l <= low e il massimo tra gli r. upper è sempre uguale al valore finale del segmento da coprire

    3. la funzione richiama se stessa con low = r della chiamata precedente

    4. la funzione si ferma quando r supera o eguaglia upper

    Ha una complessità, nel caso pessimo pari a n alla n.
    Probabilmente nel caso medio potrebbe dare risultati interessanti
Devi accedere o registrarti per scrivere nel forum
6 risposte