#!/usr/bin/perl -w # Dato: lista de opciones de menu, porcentaje de uso estimado y # número de segundos para decirlo # Se busca: menú óptimo -> mínima duración media use 5.032; # use experimental "postderef"; # no experimental; # use experimental "declared_refs"; my $options = 100; # lo único que importa es el número my @lengths; my @use; push @use, $_ for (1..100); # el uso probable multiplicado por la longitud es idéntico al objetivo # la diferencia en los niveles de menú es que el segundo menú suma toda la duración del primero (y un poco más de respuesta) die "Bad data" if $options != scalar(@use); my @ouse = sort { $b <=> $a } @use; push @lengths, 4 + rand()*4 for (1..$options); # esto se debería hacer en una misma estructura de datos $hash{nombre}{uso}{duración} my $min = 9e99; # posible número de niveles del menú my $c=0; my @group3; my @tmp; while (++$c < 10_000_000){ # print "\r$c"; @group3=(); @tmp = @ouse; # el número de cortes en la lista en 1 menor que los trozos, además el último ya viene dado # agrupar según el corte my $k = 0; loop: my $p = 2 + int rand() * scalar(@tmp)/4; # el menú mínimo tiene 2 opciones, el máximo tiene límite (10, en el ejemplo) my @x = splice (@tmp, 0, $p); push @{$group3[$k]}, @x; if ($p >= scalar(@tmp)-2){ push @{$group3[++$k]}, @tmp; }else{ $k++; goto loop; } my @sum; my $sumw; my $sumatotal = 0; my @lista = @lengths; my $cc = 0; # línea menú for my $i (@group3){ $sum[$cc] = $sum[$cc-1] if (defined $sum[$cc-1]); # +1 porque hay 1 segundo de respuesta for my $j (@{$i}){ $sumw += $lista[0]; $sum[$cc] += $j * shift (@lista) if (@lista); # ??? Esto debería ser correcto porque se consume siempre @lista en el mismo, mismito, orden } $sumatotal += $sum[$cc]+1 if (defined $sum[$cc]); $cc++; } $sumatotal /= $sumw; # si se considera la suma total, se suma todo, y en realidad interesa mejorar la media if ($sumatotal < $min){ $min = $sumatotal; say ""; # RTFM: # for $aref ( @AoA ) { # say "\t [ @$aref ],"; # } say "$c) Objetivo = $sumatotal"; for my $i (@group3){ say "@{$i}"; } } } exit 1; __END__ El problema del robot o centralita para 10 extensiones es demasiado simple, por lo que lo extendemos a unas hipotéticas 100 exstensiones.