第7章の練習,投票
再帰版のアラインメント
align_rec.rb
load("./max.rb")
def g()
-2
end
def q(x,y)
if x==y
2
else
-1
end
end
def align_sub(s,t,i,j)
if i==0 || j==0
i*g() + j*g()
else
v0 = align_sub(s,t,i, j-1) + g()
v1 = align_sub(s,t,i-1,j-1) + q(s[i-1],t[j-1])
v2 = align_sub(s,t,i-1,j) + g()
max(v0,max(v1,v2))
end
end
def align_rec(s,t)
align_sub(s,t,s.length(),t.length())
end
align_rec("ATAG","AAC")
align_rec("GACG","GCAG")
再帰版の実行時間の計測
require "benchmark"
Benchmark.measure{ align_rec("012345","543210") }.total()
Benchmark.measure{ align_rec("0123456","6543210") }.total()
Benchmark.measure{ align_rec("01234567","76543210") }.total()
Benchmark.measure{ align_rec("012345678","876543210") }.total()
Benchmark.measure{ align_rec("0123456789","9876543210") }.total()
「AAAC」と「CAAA」のアラインメントで類似度最大になるのは?
-
-AAAC
CAAA-
-
AAAC
CAAA
- 両方共最大
ここは?
- 1/16
- 3/16
- 5/16
- 7/16
- 9/16
動的計画法を用いたアラインメント
align.rb
load("./make2d.rb")
load("./max.rb")
def g()
-2
end
def q(c,d)
if c == d
return 2
else
return -1
end
end
def align(s,t)
m = s.length()
n = t.length()
a = make2d(m+1,n+1)
a[0][0] = 0
for j in 1..n
a[0][j] = a[0][j-1] + g()
end
for i in 1..m
a[i][0] = a[i-1][0] + g()
end
for i in 1..m
for j in 1..n
end
end
a
end
def traceback(a,s,t)
u = ""
v = ""
i = s.length()
j = t.length()
while i>0 || j>0
if j>0 && a[i][j] == a[i][j-1] + g()
u = "-" + u
v = t[j-1 .. j-1] + v
j = j - 1 # go left
else
if i>0 && j>0 &&
a[i][j] == a[i-1][j-1] + q(s[i-1], t[j-1])
else
if i>0 && a[i][j] == a[i-1][j] + g()
end
end
end
end
[u,v]
end
def align_dp(s,t)
traceback(align(s,t),s,t)
end
ここは?
- 1
- 2
- 3
- 4
- 5
- -1
- -2
- -3
- -4
練習
- align.rb を完成させて、ATAG と AAC のアラインメントを求めよう。
- RNase_P.rb をロードすると、文字列を返す(引数なしの)関数 seq0() と seq1() が定義される。これらのアラインメントを求めよう。
align_dp(seq0(),seq1())
進捗状況の確認
- align の結果に対して traceback が正しく動いた時点で投票してください。
- align は動いたが、traceback の結果が正しくない。
- align はできたが、うまく動かない。
- align がまだできていない。