Advertisement
elcocodrilotito

práctica 2 goku

Apr 9th, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.39 KB | None | 0 0
  1. #Athenea Beltrán y Daniel Bedialauneta
  2. def suma_costes(c):
  3.     P=[c[0]]
  4.     for i in range(1,len(c)):
  5.         P.append(P[-1]+c[i])
  6.     return P
  7.  
  8. # n: índice de la última tarea considerada
  9. # k: índice del último agente considerado (k se indexa desde 0)
  10. def fuerza_bruta(n,k,c,P):
  11.     if n==k:
  12.         return max(c[0:n+1]),[i for i in range(n+1)]
  13.     elif k==0:
  14.         return P[n],[n]
  15.     else:
  16.         minimo=None
  17.         for i in range(k,n+1):
  18.             c_fb, p_fb = fuerza_bruta(i-1,k-1,c,P)
  19.             if c_fb < P[n]-P[i-1]:
  20.                 c_fb = P[n]-P[i-1]
  21.             if minimo==None or c_fb < minimo:
  22.                 minimo=c_fb
  23.                 arg_min = p_fb + [n]
  24.         return minimo, arg_min
  25.  
  26.  
  27. def fuerza_dinamica(n,k,c,P):
  28.     #Inicialización de F y G. Solo inicializo para las posiciones 00,10 y 11.
  29.     #aunque podría hacerlo para toda la primera columna y para toda la diagonal, y así,
  30.     #ahorrar un poco en los if del segundo for
  31.     F=[[0],[0,0]]
  32.     G=[[0],[0,0]]
  33.     F[0][0]=P[0]
  34.     G[0][0]=None
  35.     F[1][0]=P[1]
  36.     G[1][0]=None
  37.     F[1][1]=max(c[:2])
  38.     G[1][1]=0
  39.     #Ahora, para los demás casos de F y G
  40.     for fila in range(2,n+1):
  41.         F.append([None])
  42.         G.append([None])
  43.         for columna in range(min(n,k)+1):
  44.             if columna==0:
  45.                 F[fila][columna]=P[fila]
  46.             elif fila==columna:
  47.                 F[fila].append(max(c[0:fila+1]))
  48.                 G[fila].append(fila-1)
  49.             else:
  50.                 minimo=None
  51.                 g_minimo=None
  52.                 for i in range(columna-1,fila): # i va de columna-1 hasta fila-1
  53.                     coste_combinacion_parcial=F[i][columna-1]
  54.                     if coste_combinacion_parcial<P[fila]-P[i]:
  55.                         coste_combinacion_parcial=P[fila]-P[i]
  56.                     if minimo==None or coste_combinacion_parcial<minimo:
  57.                         minimo=coste_combinacion_parcial
  58.                         g_minimo=i
  59.                 F[fila].append(minimo)
  60.                 G[fila].append(g_minimo)
  61.     #Una vez creados F y G, calculo la lista que contiene los índices de dónde acaba cada partición
  62.     particiones=[n]
  63.     indice=n
  64.     for columna in range(k,0,-1):
  65.         particiones.insert(0,G[indice][columna])
  66.         indice=G[indice][columna]
  67.     return F[n][k],particiones
  68.  
  69.  
  70.  
  71.  
  72. import time
  73. import random
  74. N=10,20,40,80,100
  75. M=2,3,4,5,6,7
  76. print("="*63)
  77. print("TAREAS"," "*4,"AGENTES"," "*4,"TIEMPO RECURSIVO"," "*4,"TIEMPO ITERATIVO"," "*4)
  78. print("="*63)
  79. for tareas in N:
  80.     for agentes in M:
  81.         c=[random.randint(0,50) for i in range(tareas)]
  82.         P=suma_costes(c)
  83.         t1=time.process_time()
  84.         fuerza_bruta(tareas-1,agentes-1,c,P)
  85.         t2=time.process_time()
  86.         fuerza_dinamica(tareas-1,agentes-1,c,P)
  87.         t3=time.process_time()
  88.         print("{0:6}      {1:7}      {2:16}      {3:16}".format(tareas,agentes,t2-t1,t3-t2))
  89.     print("="*63)
  90.  
  91.  
  92. """
  93. Un ejemplo
  94. ===============================================================
  95. TAREAS      AGENTES      TIEMPO RECURSIVO      TIEMPO ITERATIVO    
  96. ===============================================================
  97.    10            2                   0.0                   0.0
  98.    10            3                   0.0                   0.0
  99.    10            4                   0.0                   0.0
  100.    10            5                   0.0                   0.0
  101.    10            6                   0.0                   0.0
  102.    10            7                   0.0                   0.0
  103. ===============================================================
  104.    20            2                   0.0                   0.0
  105.    20            3                   0.0                   0.0
  106.    20            4                   0.0                   0.0
  107.    20            5                   0.0                   0.0
  108.    20            6              0.015625                   0.0
  109.    20            7               0.03125                   0.0
  110. ===============================================================
  111.    40            2                   0.0                   0.0
  112.    40            3                   0.0                   0.0
  113.    40            4                   0.0                   0.0
  114.    40            5                0.0625                   0.0
  115.    40            6                   0.5                   0.0
  116.    40            7                2.6875                   0.0
  117. ===============================================================
  118.    80            2                   0.0                   0.0
  119.    80            3              0.015625                   0.0
  120.    80            4              0.046875                   0.0
  121.    80            5               1.03125                   0.0
  122.    80            6               15.4375                   0.0
  123.    80            7             196.84375                   0.0
  124. ===============================================================
  125.   100            2                   0.0                   0.0
  126.   100            3                   0.0                   0.0
  127.   100            4              0.109375                   0.0
  128.   100            5               2.40625              0.015625
  129.   100            6             46.890625                   0.0
  130.   100            7            752.796875              0.015625
  131. ===============================================================
  132. """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement