Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
ASUS Expertbook PM3: il notebook robusto per le aziende
ASUS Expertbook PM3: il notebook robusto per le aziende
Pensato per le necessità del pubblico d'azienda, ASUS Expertbook PM3 abbina uno chassis particolrmente robusto ad un pannello da 16 pollici di diagonale che avantaggia la produttività personale. Sotto la scocca troviamo un processore AMD Ryzen AI 7 350, che grazie alla certificazione Copilot+ PC permette di sfruttare al meglio l'accelerazione degli ambiti di intelligenza artificiale
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo
Abbiamo provato per diversi giorni una new entry del mercato italiano, la Gowow Ori, una moto elettrica da off-road, omologata anche per la strada, che sfrutta una pendrive USB per cambiare radicalmente le sue prestazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-11-2011, 12:53   #1
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
[haskell] Visita di un grafo

Salve,
ho realizzato la struttura di un grafo in haskell per l'università, il problema è che mi viene richiesto di sviluppare anche un algoritmo di visita (e mi è stato caldamente consigliato di sviluppare il dfs) ma non so davvero da dove cominciare.
Fare la struttura è stato abbastanza facile ma per la visita ad ogni passo dell'algoritmo mi blocco, forse perchè l'algoritmo che ho studiato io era orientato ai linguaggi imperativi (i vari marcalo come visitato, come faccio a marcarlo come visitato se non ho variabili?) e non a quelli funzionali.

Il tipo grafo l'ho dichiarato in questa maniera, vi allego anche la "firma" dei metodi realizzati:

Codice:
type Nodo = Int
type Arco = (Nodo,Nodo)
type Grafo = ([Nodo],[Arco])

esisteArco :: Arco -> Grafo -> Bool
inserisciArco :: Arco -> Grafo -> Grafo
cancellaArco :: Arco -> Grafo -> Grafo	  
adiacente :: Nodo -> Grafo -> [Nodo]			
esisteNodo :: Nodo -> Grafo -> Bool						 
grafoVuoto :: Grafo -> Bool
voi come la realizzereste la dfs?

Vi ringrazio in anticipo,
guylmaster.
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 27-11-2011, 19:56   #2
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
La cosa piu' semplice che mi viene in mente e' usare un Diff array dove tieni nota del colore e indicizzato sul numero del nodo... non molto diverso da come faresti in un linguaggio piu' tradizionale

qualcosa tipo
Codice:
dfs :: Grafo -> Nodo -> [Nodo]
dfs graph initial = 
   fst $ dfs' graph initial visited
   where
      minNode = minimum (nodes graph)
      maxNode = maximum (nodes graph)
      visited :: DiffArray Bool
      visited = listArray (minNode,maxNode) (repeat False)

dfs' :: Grafo -> Nodo -> DiffArray Bool -> ([Nodo],DiffArray Bool)
E poi in dfs' non fai che controllare: se visited ! initial e' True, hai gia' visitato e ritorni la lista vuota, altrimenti aggiorni l'array ponendo il valore a true e per ogni vicino ripeti l'operazione... di scomodo c'e' che devi passarti in giro l'array aggiornato man mano che fai gli update, e quindi anche ritornarlo dalle chiamate. Ci sono altre tecniche, ma questa mi sembra la piu' semplice.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2011, 22:09   #3
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Non riesco a capire queste tre istruzioni:


Codice:
   fst $ dfs' graph initial visited
      minNode = minimum (nodes graph)
      visited :: DiffArray Bool
      visited = listArray (minNode,maxNode) (repeat False)

ovvero quell'istruzione cos'è? non la capisco per nulla, non so nemmeno cosa si intende per il dollaro;
graph poi da dove esce? e repeat False?

Se ti chiedessi il codice completo per capirci meglio qualcosa ti starei chiedendo troppo? Conta che parliamo di haskell a livello didattico quindi programmando con hugs.
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 28-11-2011, 23:09   #4
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
[quote=guylmaster;36445733]Non riesco a capire queste tre istruzioni:


Codice:
   fst $ dfs' graph initial visited
      minNode = minimum (nodes graph)
      visited :: DiffArray Bool
      visited = listArray (minNode,maxNode) (repeat False)

ovvero quell'istruzione cos'è? non la capisco per nulla, non so nemmeno cosa si intende per il dollaro;
graph poi da dove esce? e repeat False?
[/code]
fst e' una delle istruzioni del preluidio, ritorna il primo argomento di una coppia
Codice:
fst (x,y) = x
il $ server per scrivere meno parentesi .
f $ g x e' equivalente a f (g x)
graph e' uno degli argomenti della funzione, c' e' scritto nella riga sopra
minimum e' la funzione che ritorna il valore minimo di una lista
l'ultima riga invece costruisce un array partendo dai limiti inferiore e superiore dello stesso e la lista dei valori. Qualcuno di questo punti non li avete ancora studiati ?

Quote:
Se ti chiedessi il codice completo per capirci meglio qualcosa ti starei chiedendo troppo? Conta che parliamo di haskell a livello didattico quindi programmando con hugs.
Per ora niente da fare che non faccio in tempo. intanto tu pero' prova a vedere sopra e dimmi cos'altro non ti torna
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2011, 09:15   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Ciao guylmaster, provo anche io ad aiutarti, ma fornendoti indicazioni su dove reperire le info che ti mancano.
Quote:
Codice:
   
fst $ dfs' graph initial visited
      minNode = minimum (nodes graph)
      visited :: DiffArray Bool
      visited = listArray (minNode,maxNode) (repeat False)
ovvero quell'istruzione cos'è? non la capisco per nulla, non so nemmeno cosa si intende per il dollaro;
graph poi da dove esce? e repeat False?
Se fai riferimento al tutorial che ti avevo indicato in questo post, puoi tovare una spiegazione sulla "function application" ($), qui.
Guardati anche il paragrafo immediatamente seguente, sulla "function composition" (.)

Quote:
graph poi da dove esce? e repeat False?
Quello è pattern matching, dubito che tu non sappia cos'è, ma in caso lo trovi spiegato qui.

Invece "minimum" e "listArray" sono delle funzioni che fanno parte delle librerie di Haskell (io uso GHC, tu mi pare Hugs, immagino che le librerie base siano le stesse).

Quando incontri una nuova funzione di libreria che non avevi mai visto prima, oppure se vuoi vedere se nelle librerire esiste una funzione con un dato nome, usa Hoggle: è uno strumento utilissimo (io l'ho aggiunto come uno dei motori di ricerca nella barra apposita per firefox) e ti fa risparmiare un sacco di tempo.

Inoltre, ti permette se vuoi di saltare ai sorgenti dove la definizione da te cercata è definita, così puoi sbirciare come vengono implementate (anche se i sorgenti, se non ho capito male, sono relativi a GHC).
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2011, 19:51   #6
guylmaster
Senior Member
 
L'Avatar di guylmaster
 
Iscritto dal: Aug 2002
Messaggi: 2518
Con le mie mani mi sono ritrovato a scrivere questo che ovviamente è incompleto ed anzi mi sono parecchio bloccato:

Codice:
copia2 :: Grafo -> [(Nodo,Int)]
copia2 ([],[]) = ([])
copia2 ([],ys) = ([])
copia2 (x:xs,ys) = [(x,0)] ++ copia2 (xs,ys)

copia :: Grafo -> ([(Nodo,Int)],[Arco])
copia (xs,ys) = (copia2 (xs,ys), ys)

dfs:: Nodo -> Grafo -> [Nodo]
dfs u g = do xs <- copia g
             return (dfsv u xs)
			 
nododx :: [(Int,Int)] -> [Nodo]
nododx [] = []
nododx ((a,b):xs) = [b] ++ nododx xs 
			 
dfsv:: Nodo -> ([(Nodo,Int)],[Arco]) -> [Nodo] -> [Nodo]
dfsv u (xs,ys) fs = do ks <- [u]
                       os <- nododx (takeWhile (\(o,p) -> o == u) ys)
--INCOMPLETO
                       return ks
Ovvero la funzione dfs tramite copia e quindi di rimbalzo copia2 mi crea una "struttura di lavoro" del tipo ([(Nodo,Int],[Arco]), ovvero aggiungo un flag all'inizio settato a zero da avvalorare con 1 man mano che visito gli archi.
Questa struttura si fatta la passo a dfsv e quello che vorrei fargli fare (ma che non riesco a far fare) è il cuore dell'operazione ovvero visita il nodo u e mettimelo in ks se il flag è a zero, dopo metti in os tutti i suoi adiacenti, reitera l'operazione sugli adiacenti. Ecco questa parte qui non riesco a tradurla in haskell. Ci stiamo provando da più di un giorno in due ma nulla.

Tra l'altro a lezione più di un takeWhile, un pò di list comprension, le istruzioni con la do, e degli if non abbiamo fatto (ed essendo la parte di laboratorio finita non le faremo). Quindi volevo riuscire in qualche modo a farle con gli strumenti che ci sono stati dati, senza dover ricorrere a nuove funzioni che nemmeno conosco.
guylmaster è offline   Rispondi citando il messaggio o parte di esso
Old 29-11-2011, 23:53   #7
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Non avete fatto gli array, ma avete coperto l'uso del do con le liste ?
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 30-11-2011, 00:21   #8
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
L'approccio che avevo proposto si puo' anche adattare ad un uso senza array (ma meno efficiente), provo a delineartelo.
L'idea e' la seguente:
parto con un nodo da cui voglio fare la visita, il grafo
Codice:
dfs :: Grafo -> Nodo -> [Nodo]
dfs graph initial = dfs' graph initial []
dfs' prima cosa fa ?
dfs' avra' tipo
Codice:
dfs' :: Grafo -> Nodo -> [Nodo] -> [Nodo]
dfs' grafo nodoIniziale visitati = ... ?
Ovvero prende come argomento il grafo da analizzare, il prossimo nodo da valutare, e i nodi gia' visitati (cioe' il risultato che sta costruendo).
Cosa deve fare ? Intanto guarda se nodoIniziale e' tra quelli visitati. Se e' cosi' allora non occorre procedere altro, e si "ritorna indietro" ritornando proprio "visitati".
Se invece nodoIniziale e' "nuovo", deve costruirsi una lista di tutti i nodi adiacenti (da grafo), e chiamare su ognuno di questi ricorsivamente dfs'.
Occhio pero' che al primo nodo adiacente devi passare "visitati" piu' il nodo corrente, al secondo il risultato della chiamata di dfs' al nodo precedente e cosi' via (e' piu' facile da scrivere con codice che a parole... ^_^).
Il risultato finale sara' il risultato dell'ultima chiamata a dfs'
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele

Ultima modifica di marco.r : 30-11-2011 alle 00:25.
marco.r è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media AMD Ryzen 5 7500X3D: la nuova CPU da gaming con ...
Crollo del 29% nelle vendite dirette: Ub...
Black Friday anticipato su Amazon: NARWA...
Disastro WhatsApp: esposti 3,5 miliardi ...
Hatsune Miku per tutti: ASUS ROG present...
La Definitive Edition di Tomb Raider sba...
Sicurezza PC: Microsoft punta sui chip d...
Gemini 3 Pro disponibile ora: è i...
Super sconti robot aspirapolvere: ECOVAC...
DOOM: The Dark Ages si espande con Ripat...
EA SPORTS annuncia il futuro della serie...
Tutte le TV già in offerta defini...
Meta non ha un monopolio nel settore dei...
L'amministrazione Trump presta 1 miliard...
Continua la rivoluzione interna in Intel...
Lenovo Legion 5i, gaming senza compromes...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:16.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v