Página 2 de 2

Re: Puntuación errónea en alineamiento

NotaPublicado: 2017-01-26 16:07 @713
por explorer
perl junior escribiste:¿Por qué si viene de la derecha añades a @camino abajo?
Tienes razón. Hay que intercambiar las líneas 99 y 104.

perl junior escribiste:Además, si vemos el resultado, estaría mal, no debería salir "TGCTTA".
La secuencia sale al revés, pero no sé por qué. Quizás porque estás usando unshift en la línea 109, pero eso es lo que dicta la lógica. Voy a mirarlo con detalle.

perl junior escribiste:Y por otra parte, viendo ahora el código tanto en la línea 30 como en la 37 creo que lo tengo mal y que los índices empiecen por 1.
En la mayoría de los casos, la inicialización no es necesaria.

Re: Puntuación errónea en alineamiento

NotaPublicado: 2017-01-26 17:04 @753
por perl junior
Con las anteriores secuencias sí que lo hace bien... Quizás tenga que ver con el tamaño de las secuencias.

Re: Puntuación errónea en alineamiento

NotaPublicado: 2017-01-26 17:56 @789
por explorer
Sí que lo he pensado, pero no.

Bueno, el caso es que he quitado la versión recursiva de construir_camino() y la he convertido en un simple bucle while(), mucho más simple. Ahora ya saca el valor correcto.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. #
  3. use List::Util qw[min max];
  4.  
  5. sub programacion_dinamica{
  6.         my($secuencia1,$secuencia2) =@_;
  7.  
  8.         my $len1 =length ($secuencia1);
  9.         my $len2 =length($secuencia2);
  10.         my @secuencia1 = split("",$secuencia1);
  11.         my @secuencia2= split("",$secuencia2);
  12.  
  13.         #Construimos la tabla s y la inicializamos a 0
  14.         my @s=();
  15.         my @decisiones=();
  16.         for (my $i =0; $i <=$len1 ;$i++){
  17.  
  18.                 my @ fila_s=();
  19.                 my @fila_decision=();
  20.                 for (my $j=0;$j <=$len2;$j++){
  21.                         push @fila_s,0;
  22.                         push@fila_decision,'';
  23.                         print @fila_decision;
  24.                 }
  25.                 push @s,\@fila_s; #por referencia
  26.                 push @decisiones,\@fila_decision;
  27.         }
  28.  
  29.  
  30.         for (my $i =0;$i<$len1;$i++){
  31.                 $s[0][0]= 0;
  32.                 $s[$i][0] =$s[$i][0];
  33.  
  34.                 $decisiones[$i][0]="abajo";
  35.         }
  36.  
  37.         for (my $j=0;$j<=$len2;$j++){
  38.  
  39.                 $s[0][$j] =$s[0][$j];
  40.  
  41.                 $decisiones[0][$j]="derecha";
  42.         }
  43.  
  44.         for (my $j=1;$j<= $len2;$j++){
  45.                 for (my $i=1;$i<= $len1;$i++){
  46.  
  47.                         if ($secuencia1[$i-1] eq $secuencia2[$j-1]){
  48.                                 $suma=1;
  49.                         }
  50.                         else{
  51.                                 $suma=0;
  52.                         }
  53.  
  54.                         $s[$i][$j]=max(
  55.                                 $s[$i-1][$j]+0,
  56.                                 $s[$i][$j-1]+0,
  57.                                 $s[$i-1][$j-1]+$suma);
  58.  
  59.                         if($s[$i][$j]== $s[$i][$j-1]+0){
  60.                                 $decisiones[$i][$j] ="derecha";
  61.                         }
  62.                         elsif ($s[$i][$j]==$s[$i-1][$j-1]+$suma){
  63.                                 $decisiones[$i][$j] ="diagonal";
  64.                         }
  65.                         else{
  66.                                 $decisiones[$i][$j]="abajo";
  67.                     }
  68.                 }
  69.         }
  70.  
  71.         my ($camino_ref, $secuencia_ref) = construir_camino($len1,$len2,\@decisiones,\@secuencia1);
  72.  
  73.         return $s[$len1][$len2], $camino_ref, $secuencia_ref;
  74. }
  75.  
  76. sub construir_camino{
  77.     my ($i, $j, $decisiones_ref, $secuencia1_ref) = @_;
  78.     my @camino;
  79.     my @secuencia;
  80.  
  81.     while ($i > 0 or $j > 0) {
  82.  
  83.         my $sentido = $decisiones_ref->[$i][$j];
  84.         unshift @camino, $sentido;
  85.  
  86.         print "$i:$j: $sentido\n";
  87.  
  88.         if ($sentido eq "abajo") {
  89.  
  90.             $i--;
  91.         }
  92.         elsif ($sentido eq "derecha") {
  93.  
  94.             $j--;
  95.         }
  96.         else {
  97.             $i--; $j--;
  98.  
  99.             print "$secuencia1_ref->[$i] > @secuencia\n";
  100.             unshift @secuencia, $secuencia1_ref->[$i];
  101.         }
  102.     }
  103.  
  104.     return \@camino, \@secuencia;
  105. }
  106.  
  107.  
  108. $secuencia1="ATGCTTA";
  109. $secuencia2="TGCATTAA";
  110.  
  111.  
  112.  
  113. my ($resultado, $camino_ref, $secuencia_ref) = programacion_dinamica($secuencia1,$secuencia2);
  114. print "\n";
  115. print $resultado,"\n";
  116. print join(" ", @$camino_ref),   "\n";
  117. print join(" ", @$secuencia_ref), "\n";
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
7:8: derecha
7:7: diagonal
A >
6:6: diagonal
T > A
5:5: diagonal
T > T A
4:4: derecha
4:3: diagonal
C > T T A
3:2: diagonal
G > C T T A
2:1: diagonal
T > G C T T A
1:0: abajo

6
abajo diagonal diagonal diagonal derecha diagonal diagonal diagonal derecha
T G C T T A
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Observa también que he ajustado el paso de argumentos entre las dos funciones, para que los arrays pasen por referencia.

Re: Puntuación errónea en alineamiento

NotaPublicado: 2017-01-27 15:56 @705
por explorer
A propósito... hay otro hilo con el mismo algoritmo de este hilo: Alineamiento múltiple