# este programa calcula la mejor disposici'on que se puede dar a una carga
# en la bodega de un avion, asumiendo que la bodega tiene un largo long_bodega
# la carga est'a pre almacenada en contenedores de longitud ancho_cont, de manera tal que se pued considerar 
# concentrada en su punto medio. Ademas la distancia al centro de sustentacion medida desde el inicio d ela bodega 
# es dist_cg.
# se asume como hipotesis de mejor solucion, a aquella que minimiza el momento de la carga total respecto del centro de sutentacion
# para ello se asume que el menor momento se obtenrdra cargando a partir de la posicion de cg en forma alternada a cada lado
# las cargas de mayor a menor

from time import time
 
start=time()

#w=[300.,200.,310.,390.,290.,300.,305.,250.,300.]
w=[300.,200.,310.,390.,290.,300.,305.,250.,300.,287,130.0,330.0,287.0]  # lista de cargas
d=[]                                                    # lista d edistancias de loscontenedores
w_orden=[]                                                #lista donde iran los pesos una vez destrminada su posicion

long_bodega=28.0                                        # longitud bodega
ancho_cont=2.0                                          # abcho de contenedor
dist_cg=10.5                                            # distancia del centro de sustentacion

# se llena la lista de distancias de los baricentros de contenedores
for i in range(len(w)):
    d.append(-dist_cg+(i*ancho_cont)+ancho_cont/2)
    w_orden.append([0])   # agrego esta lista donde voy a poner los pesos 

#   se ordena la lista de carga de menor a mayor
w.sort()
print "Lista de cargas ordenadas de menor a mayor"
print w

#busco cual es la posicion del CG en las pociones de la lista de distancias "d"
# y la guardo en puntero
puntero=0
i=0
while d[i]<0:
        puntero=i
        i=i+1
print "Lista de distancias de bodegas relativas al CG"
print d
print "Posicion en la que se encuentra el CG"
print puntero
        
# planteo dos punteros una que desciende desde puntero y otro que asciende

desp_d=puntero                  # puntero descendente
desp_u=desp_d+1                 # puntero ascendente
flag_d=1                        # pongo bandera inferior en on
flag_u=1                        # pongo bandera superior en on
j=len(w)-1                      # me posiciono en la carga mas pesada
while flag_d==1 or flag_u==1:   # mientras cualquier bandera esta on
    if desp_d>=0:               
        w_orden[desp_d]=w[j]    # lleno la posicion con la carga
        desp_d=desp_d-1         # reduzco la posicion del puntero descendente
        j=j-1                   # me corro una carga para abajo
    else:
        flag_d=0                # se acabaron alas bodegas descendiendo
        
    if desp_u<=len(w_orden)-1:
        w_orden[desp_u]=w[j]    # lleno la posicion con la carga
        desp_u=desp_u+1         # aumento el puntero ascendente
        j=j-1                   # paso a lacarga anterior
    else:
        flag_u=0                # se acabo la bodega ascendiendo
      

for i in range(len(d)):
    if i==puntero+1:
        print "------------"
    print 'Posicion({0})  {1:>6.2f},  {2:>5.2f},  {3:>6.2f}'.format(i,w[i],d[i],w_orden[i])
    #print w[i],d[i],w_orden[i]
mom=0.0
for i in range(len(w_orden)):
    mom=mom+d[i]*w_orden[i]
print mom
