From ef3025e477e7aad7060bc1f6a45c8792c9becb28 Mon Sep 17 00:00:00 2001 From: Lucas Hernan Bruzzone Rodriguez <lucas.bruzzone@fing.edu.uy> Date: Thu, 6 Sep 2018 23:50:14 -0300 Subject: [PATCH] Upload New File --- malva/rep/GA/generador.py | 143 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 malva/rep/GA/generador.py diff --git a/malva/rep/GA/generador.py b/malva/rep/GA/generador.py new file mode 100644 index 0000000..c699bd6 --- /dev/null +++ b/malva/rep/GA/generador.py @@ -0,0 +1,143 @@ +import sys +import random +import math +from collections import defaultdict + +try: + #Constantes + mayor_duracion_horas_tarea=200 + menor_duracion_horas_tarea=12 + mayor_disponibilidad_diaria_horas_empleado=10 + menor_disponibilidad_diaria_horas_empleado=1 + sueldo_hora_base_empleado_sin_experiencia=110 + sueldo_valor_maximo_bono_por_buen_empleado_hora=23 + deadline_dias=0 + + #Sanity check + if (len(sys.argv)<4): + print "Ejecutar con la siguiente linea: ./generador <cant_tereas> <cant_empleados> <archivo_salida>" + sys.exit(1) + + cantidad_tareas=int(sys.argv[1]) + cantidad_empleados=int(sys.argv[2]) + archivo_salida=sys.argv[3] + + if (cantidad_tareas<1): + print "La cantidad de tareas debe ser mayor o igual a 1." + sys.exit(1) + + + if (cantidad_empleados<1): + print "La cantidad de empleados debe ser mayor o igual a 1." + sys.exit(1) + + if (cantidad_empleados>cantidad_tareas): + print "La cantidad de empleados debe ser menor a la cantidad de tareas." + sys.exit(1) + + + #VARIABLES: + + #habilidades de los empleados valor entre 0 y 1 + habilidad_empleados=[] + sueldo_semanal_empleado=[] + dedicacion_diaria_diponible_empleado=[] + esfuerzo_requerido_tarea=[] + + for i in range(0,cantidad_empleados): + dedicacion_diaria_diponible_empleado.append(random.randint(menor_disponibilidad_diaria_horas_empleado,mayor_disponibilidad_diaria_horas_empleado)) + + for i in range(0,cantidad_empleados): + habilidad_empleados.append(round(random.uniform(0, 1),2)) + + #los empleados cobran un bono (random) de rendimiento + #empleados con habilidad 0 cobran el sueldo de horas base por la cantidad de horas semanales + #empleados con habilidad mayor a 0 cobran un plus por habilidad proporcional a su habilidad + #empleado con habilidad 1 cobra aproximadamente el doble que el de experiencia 0 + for i in range(0,cantidad_empleados): + bono_por_buen_empleado=random.randint(0,sueldo_valor_maximo_bono_por_buen_empleado_hora) + sueldo_base=sueldo_hora_base_empleado_sin_experiencia+bono_por_buen_empleado + plus_por_experiencia=sueldo_hora_base_empleado_sin_experiencia*habilidad_empleados[i] + sueldo_semanal_empleado.append(int(math.ceil((sueldo_base+plus_por_experiencia)*dedicacion_diaria_diponible_empleado[i]))) + + for i in range(0,cantidad_tareas): + esfuerzo_requerido_tarea.append(random.randint(menor_duracion_horas_tarea,mayor_duracion_horas_tarea)) + + ###################### + #calculo del deadline + ###################### + + + tiempo_ocupado_empleado = {} + for indice_empleado in range(0,cantidad_empleados): + tiempo_ocupado_empleado[indice_empleado]=0 + + tiempo_en_horas=0 + tiempo_en_dias_con_decimales=0 + indice_empleado_menor_tiempo=0 + for indice_tarea in range(0,cantidad_tareas): + minimo_tiempo=sys.float_info.max + for indice_empleado in range(0,cantidad_empleados): + tiempo_en_horas=(esfuerzo_requerido_tarea[indice_tarea] / (0.5 + habilidad_empleados[indice_empleado])) + tiempo_en_dias_con_decimales= tiempo_en_horas/dedicacion_diaria_diponible_empleado[indice_empleado] + tiempo_en_el_que_termina_si_se_le_da_esta_tarea=tiempo_ocupado_empleado[indice_empleado]+tiempo_en_dias_con_decimales + if(tiempo_en_el_que_termina_si_se_le_da_esta_tarea < minimo_tiempo): + indice_empleado_menor_tiempo=indice_empleado + minimo_tiempo=tiempo_en_el_que_termina_si_se_le_da_esta_tarea + tiempo_ocupado_empleado[indice_empleado_menor_tiempo]=minimo_tiempo + + + deadline_dias=0 + #busca maxima duracion + for indice_empleado in range(0,cantidad_empleados): + if(tiempo_ocupado_empleado[indice_empleado]>deadline_dias): + deadline_dias=tiempo_ocupado_empleado[indice_empleado] + + #print tiempo_ocupado_empleado + #se redondean los dias para pagar el dia entero a los que trabajan menos + deadline_dias=int(math.ceil(deadline_dias))*1.2 + + #archivo de salida de empleados + archivo = open ("%s_empleados"%archivo_salida, "w") + archivo.write("e%d"%1) + for i in range(1,cantidad_empleados): + #nombre del empleado + archivo.write(" e%d"%(i+1)) + archivo.write("\n") + archivo.write("%d"%dedicacion_diaria_diponible_empleado[0]) + for i in range(1,cantidad_empleados): + archivo.write(" %d"%dedicacion_diaria_diponible_empleado[i]) + archivo.write("\n") + archivo.write("%.2f"%habilidad_empleados[0]) + for i in range(1,cantidad_empleados): + archivo.write(" %.2f"%habilidad_empleados[i]) + archivo.write("\n") + archivo.write("%d"%sueldo_semanal_empleado[0]) + for i in range(1,cantidad_empleados): + archivo.write(" %d"%sueldo_semanal_empleado[i]) + + #archivo de salida de tareas + archivo = open ("%s_tareas"%archivo_salida, "w") + archivo.write("%d"%deadline_dias) + archivo.write("\n") + archivo.write("t%d"%1) + for i in range(1,cantidad_tareas): + #nombre de la tarea + archivo.write(" t%d"%(i+1)) + archivo.write("\n") + archivo.write("%d"%esfuerzo_requerido_tarea[0]) + for i in range(1,cantidad_tareas): + archivo.write(" %d"%esfuerzo_requerido_tarea[i]) + + + #archivo cantidad de tareas + archivo = open ("%s_cantidad_tareas"%archivo_salida, "w") + archivo.write("%d"%cantidad_tareas) + + #archivo cantidad de trabajos + archivo = open ("%s_cantidad_empleados"%archivo_salida, "w") + archivo.write("%d"%cantidad_empleados) + + +except IOError as error: + print error -- GitLab