Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Con la quattordicesima generazione Lenovo ridisegna il suo ThinkPad più iconico attorno al nuovo Space Frame e ai processori Intel Core Ultra Series 3. Resta sotto 1Kg, è molto più semplice da riparare e si rivolge al professionista che lavora in mobilità, con un prezzo da prodotto di vertice.
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Le Jabra Evolve3 85 non sono semplicemente cuffie Bluetooth con cancellazione del rumore. Sono un dispositivo professionale pensato per chi trascorre gran parte della giornata in riunione, al telefono o davanti a un assistente basato sull'intelligenza artificiale
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
Abbiamo provato MSI PRO MAX EDGE AI+, un mini-PC professionale progettato per eseguire modelli di intelligenza artificiale in locale, senza dipendere dal cloud. Il sistema abbina il processore AMD Ryzen AI Max+ 395, 128 GB di memoria unificata e un telaio in alluminio da appena 4 litri, con l'obiettivo di offrire capacità di elaborazione elevate in un formato compatto.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-05-2012, 13:07   #1
postgres
Member
 
Iscritto dal: Apr 2008
Messaggi: 120
[PYTHON] Calcolare il percorso con il più alto costo

Non riesco a risolvere un esercizio dove il professore chiede che vengano usate ricorsione/iterazione comprensioni di lista e elementi di programmazione funzionale come filter map e reduce.
Ecco il testo in inglese:

Everyday we have to face some choices and each of these choices will provide a different profit (or a drawback) for us and sometimes the profit we get from a choice depends on the choices we have done before and so on. It is a really common situation to desire to get the maximum benefit from any choice we do but in everyday situation is quite impossible since we only know the past and not where our choices address us.

Let us suppose to be in an ideal situation where both past, present and future possibilities, all their interdependencies and the cost/benefit of each choice are known. Such a base of knowledge can be represented as a direct acyclic graph (for simplicity we suppose that every choice originates only and always two scenarios and each scenario can be reached by two adjacent choices) where the nodes are the choices and the edges represent the different scenarios the choice originates; the cost/benefit of the choice is absolute, independent of the choice we do and associated to the node in the tree. The next figure represents an example of such a representation.

The goal of the exercise is to write a function (maxpath) that computes and returns the maximum benefit we can achieve from a base of knowledge as the one described above. To simplify the exercise the base of knowledge is stored per levels in a list of lists (each list contains all the nodes in a level, note that the length of the lists in adjacent levels always differs of one).

qui l'immagine:
http://cazzola.dico.unimi.it/didatti...nzata/tree.jpg

Codice:
if __name__ == "__main__":
  l0 = [[7], [3,8], [8,1,0], [2,7,4,4], [4,5,2,6,5]]
  l1 = [[11], [7,32], [14,14,14], [0,1,2,3], [5,99,1,2,7], [0,25,9,45, 54,1],   [99,88,77,66,55,44,33]]
  l2 = [[-3],[-7,1], [-14,-2,-10], [7,0,0, -7], [-1,1,0,1,-1], [5,-5,25,-25,-7,7]]
  l3 = [[1.2], [-1.2,3.14], [1,-1,0], [-3.14,5.7,-1,.23], [.1,-.2,.3,-.4,.5]]
  print(l0, ":-",end=’ ’) 
  print(maxpath(l0))
  print(l1, ":-",end=’ ’)
  print(maxpath(l1))
  print(l2, ":-",end=’ ’)
  print(maxpath(l2))
  print(l3, ":-",end=’ ’)
  print(maxpath(l3))
e deve restituire questo:

[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]] :- 30
[[11], [7, 32], [14, 14, 14], [0, 1, 2, 3], [5, 99, 1, 2, 7], [0, 25, 9, 45, 54, 1], [99, 88, 77, 66, 55, 44, 33]] :- 270
[[-3], [-7, 1], [-14, -2, -10], [7, 0, 0, -7], [-1, 1, 0, 1, -1], [5, -5, 25, -25, -7, 7]] :- 22
[[1.2], [-1.2, 3.14], [1, -1, 0], [-3.14, 5.7, -1, 0.23], [0.1, -0.2, 0.3, -0.4, 0.5]] :- 9.34


Io ho provato con scarsi risultati:

La mia idea era di fare un doppio for e dirgli di sommare gli elementi di una lista con quella successiva seguendo lo schema: somma quello nella tua stessa posizione e in quella successiva.

Codice:
def maxpath(ll):

  listaris = list()
  #caso base sommo
  ris = ll[0][0]  + ll[1][0] 
  ris2 = ll[0][0]  + ll[1][1]   
  ll[1][0] = ris
  ll[1][1] = ris2            
  for i in range(0,len(ll)-1): 
    for j in range(0,len(ll[i])-1):      
      ris = ll[i][j]  + ll[i+1][j]          #i = lista successiva ma nella stessa posizione "0"
      ris2 = ll[i][j]  + ll[i+1][j+1]        #i = lista successiva ma anche posizione successiva "1"
      listaris.append(ris)  #appendo il risultato della somma alla lista finale 
      listaris.append(ris2)
      ll[i] = listaris
 
  print ("listaris {0}".format(listaris))
Non capisco perchè con un doppio for non mi faccia tutti i casi possibili.
Se vi vengono in mente altre possibilità più veloci, più compatte, più sensate ditemelo pure, non voglio risolverlo per forza in questa maniera!

Ultima modifica di postgres : 10-05-2012 alle 16:26.
postgres è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2012, 11:46   #2
postgres
Member
 
Iscritto dal: Apr 2008
Messaggi: 120
qualche consiglio?
postgres è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2012, 17:19   #3
ingframin
Senior Member
 
L'Avatar di ingframin
 
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
Il tuo grafo lo puoi rappresentare/pensare come un albero e quindi lo puoi scorrere anche con un algoritmo tipo http://it.wikipedia.org/wiki/Breadth-first_search
Per ogni figlio che trovi sommi il peso del ramo al rispettivo cammino, ovviamente aggiungendo un cammino per ogni biforcazione.

Quando arrivi alla fine dell'albero avrai una lista di camminicol relativo peso, basta che in questa lista cerchi il massimo ed e' fatta.

Il tuo for comunque contiene un errore, se fai range(0,len(ll)-1) salti ogni volta l'ultimo elemento. Devi usare range(len(ll)) e range(ll[i]) e vedi che te li prende tutti.
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
ingframin è offline   Rispondi citando il messaggio o parte di esso
Old 26-05-2012, 10:48   #4
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
L'immagine e' su un sito protetto da user+pwd

Comunque io costruirei prima la matrice delle adiacenze,
aggiungerei un nodo fittizio raggiungibile da tutti i nodi finali
e poi userei Dijkstra per calcolare il percorso piu' efficiente.

Partendo dal primo esempio
[[7], [3,8], [8,1,0], [2,7,4,4], [4,5,2,6,5]]

Avremo 15 nodi

tolgo il peso della prima transizione, che e' 7 ed di base per tutti i percorsi, e aggiungo un nodo finale.

[3,8], [8,1,0], [2,7,4,4], [4,5,2,6,5]
[1,2], [3,4,5], [6,7,8,9], [A,B,C,D,E]

Codice:
    0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
0=> x,3,8,x,x,x,x,x,x,x,x,x,x,x,x,x
1=> x,x,x,8,1,x,x,x,x,x,x,x,x,x,x,x
2=> x,x,x,x,1,0,x,x,x,x,x,x,x,x,x,x
3=> x,x,x,x,x,x,2,7,x,x,x,x,x,x,x,x
4=> x,x,x,x,x,x,x,7,8,x,x,x,x,x,x,x
5=> x,x,x,x,x,x,x,x,8,9,x,x,x,x,x,x
6=> x,x,x,x,x,x,x,x,x,x,4,5,x,x,x,x
7=> x,x,x,x,x,x,x,x,x,x,x,5,2,x,x,x
8=> x,x,x,x,x,x,x,x,x,x,x,x,2,6,x,x
9=> x,x,x,x,x,x,x,x,x,x,x,x,x,6,5,x
A=> x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,0
B=> x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,0
C=> x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,0
D=> x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,0
E=> x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,0
F=> x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x
Ovvero, dal nodo 0 posso andare ai nodi 1 e 2, con peso rispettivamente di 3 e 8
dal nodo 1 posso andare ai nodi 2 e 4, con peso rispettivamente di 8 e 1
...
dal nodo E posso andare solo al nodo F, ed e' gratis.
dal nodo F non vado da nessuna parte.

Dove x significa non connessione, e che sarebbe infinito nel Dijkstra normale che serve per cercare il percorso piu' breve.
Ma per noi si tratta di cercare il percorso piu' lungo.
Il Dijkstra modificato per cercare il percorso piu' lungo prevede che ad ogni passo nel calcolare il potenziale di un nodo si scelga il valore piu' alto invece che quello piu' basso.
occorre quindi che la X valga -infinito (o semplicemente non usare l'arco corrispondente durante la realizzazione dell'algoritmo)

Il gioco quindi sarebbe trovare il percorso piu' lungo tra il nodo 0 e il nodo F

Quando ci fossero pesi negativi su qualche arco dovrebbe essere sufficiente sommare un offset a tutti gli archi per farli tornare tutti positivi, e poi ricordarsi di sottrarli tutti alla fine per il calcolo del percorso finale.

Diciamo che per un esercizio con quei pochi valori dati Dijkstra e' un po' overkilling, ma in teoria dovrebbe dare un'ottima soluzione.
E' probabile che inoltre Dijkstra applicato qui non faccia altro che cercare tutti i percorsi, data la geometria del grafo.
Ma ti proporrei comunque di scrivere un algoritmo Dijkstra generico in Python, che userai tante altre volte nella tua carriera.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.

Ultima modifica di gugoXX : 26-05-2012 alle 11:27.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2012, 00:17   #5
postgres
Member
 
Iscritto dal: Apr 2008
Messaggi: 120
ma dikstra si scrive più o meno nelllo stesso numero di righe con cui ho scritto io la mia soluzione?
postgres è offline   Rispondi citando il messaggio o parte di esso
Old 02-06-2012, 09:21   #6
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Indipendentemente da Dijkstra e Python, la complessita' di ogni algoritmo ha una suo ordine, ed e' quello che occorre confrontare.
E non dipende dal numero di righe.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB...
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
I satelliti spia russi Kosmos 2613 e Kos...
GTA VI: online la nuova mega galleria co...
Edits, l'app di Instagram, sbarca gratis...
Claude Code: il bug che ha spedito l'ema...
Perplexity lancia Teammates, gli agenti ...
Niente più datacenter? Gli eletto...
La Cina avrebbe approvato lo sviluppo de...
Epson EF-72 alla prova: Google TV, audio...
AST SpaceMobile annuncia il razzo spazia...
Apple taglia il budget AI dei dipendenti...
Fisco e intelligenza artificiale, come c...
Synology BC510 e CC410W, la videosorvegl...
600.000 chip NVIDIA fermi a Hong Kong: l...
La Cina punta tutto sull'allunaggio con ...
LG Italia compie 30 anni: gli italiani v...
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: 21:13.


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