using Combinatorics, StatsFuns q = 0.1 # Probabilidad de estar enfermo n = 5 # Tamaño del grupo α = 0.95 # probabilidad acumulada de los escenarios a generar function scn_gen(q :: Float64, n :: Int, α :: Float64) # Genera escenarios probables de infección asumiendo prob de contagio constante, individuos independientes # INPUT: # q = probabilidad de dar positivo # n = tamańo del grupo # α = probabilidad conjunta de los escenarios generados # OUTPUT # a = matrix con vectores de infeccion (escenario) # p = probabilidad de cada escenario # S = numero de escenarios generados k = sum(binomial(n, i) for i in 0:convert(Int, binominvcdf(n, q, α))) # numero de escenarios a generar a = zeros(k, n) # inicializo escenarios p = zeros(k) # inicializo probabilidades cum_p = 0 # var aux con probabilidad acumulada S = 2^n for (index, set) in enumerate(powerset(1:n)) # itero sobre los posibles escenarios de infección a[index,set] .= 1 # armo el escenario de infeccion p[index] = q^(sum(a[index,:])) * (1-q)^(n-sum(a[index,:])) # calculo la probabilidad del escenario (binomial) cum_p += p[index] # acumulo probabilidad if cum_p >α # Si llego a la cuota, termino a = a[1:index,:] # acorto los escenarios p = p[1:index] # acorto las probabilidades S = index # numero efectivo de escenarios break end end return a, p, S end function index_set(b :: Set,S :: Int) # Entrega el indice del conjunto b sobre la enumeracion de subconjuntos del conjunto 1:S #INPUT: # b = conjunto de elementos # S = tamaño del conjunto sobre el que queremos buscar #OUTPUT: # index = indice del conjunto b en la enumeracion de combinaciones de los elementos de 1:S for (index, set) in enumerate(combinations(1:S)) # Recusion inversa partiendo por los estados con menos escenarios factibles if b == Set(set) return index end end return empty end t_ini = time_ns() #aqui estaba el código, dejare algunos comentarios pa que vean que hacía, los espacios vacíos solo tenían codigo, o ifs # genero escenarios de infecion, sus probabilidades, y numero de escenarios # Inicializando la funcion de valor # Inicializando test optimo # Recusion inversa partiendo por los estados con menos escenarios factibles # si solo queda un escenario factible, entonces termine (puedo diagnosticar a todos) # en ese caso, no hay test que aplicar # Valor temporal para calcular funcion de valor # Valor temporal para almacenar test optimo # enumero posibles tests # unos donde se encuentran los pacientes incluidos en el test # variable auxiliar calculo Q function (valor para un estado y una accion - test- dados) # escenarios factibles # dentro de este loop el escenario real es i # conjunto de escenarios en set que entregan mismo resultado al test que escenario i # escenarios factibles # resultado del test bajo escenario j # si los resultados bajo i y j coinciden, no puedo descartar j # agrego j a los estados que no son eliminados por el test # calculo valor esperado # normalizo por la probabilidad condicional # si es el mejor valor encontrado hasta ahora, guardo como funcion de valor # guardo el indice del test como optimo t_end = time_ns() elapsed_time = (t_end -t_ini) / 1.0e9 display("Tiempo = $elapsed_time segundos")