def unisci_stanze_oversegmentate(plan_o): ''' se esistono due spazi diversi che sono collegati tramite un edge di una cella che ha un peso basso allora unisco quegli spazi ''' spazi = plan_o.spazi #per ogni spazio guardo se esiste un altro spazio che ha una cella che ha a sua volta un edge in comune con il primo spazio stanze_da_unire = [] c = 0 for s1 in spazi: for s2 in spazi: for c1 in s1.cells: for c2 in s2.cells: if fc.adiacenti(c1.c, c2.c): if fc.edge_comune( c1.c, c2.c )[0].weight < 0.25 and s1 != s2 and s1.out == False and s2.out == False: # se hanno un peso basso #dovrei unire i due spazi coppia = [s1, s2] if (coppia not in stanze_da_unire) and ( [coppia[1], coppia[0]] not in stanze_da_unire ): #mi interessa anche il senso contrario. Li voglio unire solo una volta stanze_da_unire.append(coppia) c += 1 for ele in stanze_da_unire: print ele print "\n" #ora che ho le coppie di spazi devo unire tutte le coppie che hanno almeno un elemento in comune poiche' fanno parte della stessa stanza. l = stanze_da_unire out = [] while len(l) > 0: first, rest = l[0], l[1:] first = set(first) lf = -1 while len(first) > lf: lf = len(first) rest2 = [] for r in rest: if len(first.intersection(set(r))) > 0: first |= set(r) else: rest2.append(r) rest = rest2 out.append(first) l = rest #lista di elementi comuni (appartenenti alla stessa stanza) elementi_comuni = [] for s in out: elementi_comuni.append(list(s)) ''' elementi_comuni=[] for index1,coppia1 in enumerate(stanze_da_unire): da_unire = [coppia1[0],coppia1[1]] for index2,coppia2 in enumerate(stanze_da_unire): if index2>index1: if coppia1 != coppia2:#aggiungo in cascata tutti quelli che dovrebbero essere uniti if coppia1[1] == coppia2[0]: da_unire.append(coppia2[1]) if len(elementi_comuni) >0: for e in elementi_comuni: if (coppia1[0] in e) and (coppia1[1] in e): da_unire = e #ricorda che potrebbe non essere necessariamente coppia2[1], devi selezionare quello diverso if coppia2[0] in e: da_unire.append(coppia2[1]) else: da_unire.append(coppia2[0]) elementi_comuni.remove(e)# in teoria dovrebbe andare bene dato che ce ne dovrebbe essere solo uno di elemento da eliminare #da aggiungere anche gli altri controlli elementi_comuni.append(da_unire) for ele in elementi_comuni: print ele ''' for e in elementi_comuni: prima_coppia = [e[0], e[1]] count = 2 spazio_risultante = sp.unisci_spazi(prima_coppia[0], prima_coppia[1]) #elimino i vecchi spazi(che ormai ho unito ) print "gli spazi sono: ", len(plan_o.spazi) elimina_spazio(prima_coppia[0], plan_o) elimina_spazio(prima_coppia[1], plan_o) print "gli spazi sono: ", len(plan_o.spazi) #aggiungo alla lista degli spazi di un Plan la stanza che ho appena creato aggiungi_spazio(spazio_risultante, plan_o) print "gli spazi sono, ora che ho aggiunto: ", len(plan_o.spazi) while count < len(e): seconda_coppia = [spazio_risultante, e[count]] count += 1 spazio_risultante = sp.unisci_spazi(spazio_risultante, seconda_coppia[1]) #elimino i vecchi spazi(che ormai ho unito ) print "gli spazi sono: ", len(plan_o.spazi) elimina_spazio(seconda_coppia[0], plan_o) elimina_spazio(seconda_coppia[1], plan_o) print "gli spazi sono: ", len(plan_o.spazi) #aggiungo alla lista degli spazi di un Plan la stanza che ho appena creato aggiungi_spazio(spazio_risultante, plan_o) print "gli spazi sono, ora che ho aggiunto: ", len(plan_o.spazi) print "il numero di cellette adiacenti con basso peso sono", c
def postprocessing(plan_o, parametri_obj): ''' unisco stanze che dovrebbero essere unite, lo faccio epr coppia di spazi. 1) trovo gli edge adiacenti tra spazi. 2) e calcolo l'affinita' pesato su tutti gli edge in comune ''' spazi = plan_o.spazi #per ogni spazio guardo se esiste un altro spazio che ha una cella che ha a sua volta un edge in comune con il primo spazio stanze_da_unire = [] c = 0 s2_temp = spazi[0] edge_in_comune = [] for s1 in spazi: for s2 in spazi: edge_in_comune = [] s2_temp = s2 for c1 in s1.cells: for c2 in s2.cells: if fc.adiacenti(c1.c, c2.c): edge_com = fc.edge_comune(c1.c, c2.c) for ele in edge_com: edge_in_comune.append( ele) #colleziono tutti gli edge in comune if len(edge_in_comune) > 0 and Q_split( edge_in_comune ) < parametri_obj.soglia_q_split and s1 != s2_temp and s1.out == False and s2_temp.out == False: # se hanno un peso basso #if fc.edge_comune(c1.c, c2.c)[0].weight < 0.25 and s1!= s2 and s1.out == False and s2.out == False: # se hanno un peso basso #dovrei unire i due spazi coppia = [s1, s2_temp] if (coppia not in stanze_da_unire) and ( [coppia[1], coppia[0]] not in stanze_da_unire ): #mi interessa anche il senso contrario. Li voglio unire solo una volta stanze_da_unire.append(coppia) c += 1 for ele in stanze_da_unire: print ele print "\n" #ora che ho le coppie di spazi devo unire tutte le coppie che hanno almeno un elemento in comune poiche' fanno parte della stessa stanza. l = stanze_da_unire out = [] while len(l) > 0: first, rest = l[0], l[1:] first = set(first) lf = -1 while len(first) > lf: lf = len(first) rest2 = [] for r in rest: if len(first.intersection(set(r))) > 0: first |= set(r) else: rest2.append(r) rest = rest2 out.append(first) l = rest #lista di elementi comuni (appartenenti alla stessa stanza) elementi_comuni = [] for s in out: elementi_comuni.append(list(s)) #li stanpo solo per vedere se sono corretti for ele in elementi_comuni: print ele for e in elementi_comuni: prima_coppia = [e[0], e[1]] count = 2 spazio_risultante = sp.unisci_spazi(prima_coppia[0], prima_coppia[1]) #elimino i vecchi spazi(che ormai ho unito ) print "gli spazi sono: ", len(plan_o.spazi) elimina_spazio(prima_coppia[0], plan_o) elimina_spazio(prima_coppia[1], plan_o) print "gli spazi sono: ", len(plan_o.spazi) #aggiungo alla lista degli spazi di un Plan la stanza che ho appena creato aggiungi_spazio(spazio_risultante, plan_o) print "gli spazi sono, ora che ho aggiunto: ", len(plan_o.spazi) while count < len(e): seconda_coppia = [spazio_risultante, e[count]] count += 1 spazio_risultante = sp.unisci_spazi(spazio_risultante, seconda_coppia[1]) #elimino i vecchi spazi(che ormai ho unito ) print "gli spazi sono: ", len(plan_o.spazi) elimina_spazio(seconda_coppia[0], plan_o) elimina_spazio(seconda_coppia[1], plan_o) print "gli spazi sono: ", len(plan_o.spazi) #aggiungo alla lista degli spazi di un Plan la stanza che ho appena creato aggiungi_spazio(spazio_risultante, plan_o) print "gli spazi sono, ora che ho aggiunto: ", len(plan_o.spazi) print "il numero di cellette adiacenti con basso peso sono", c