Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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