動的計画法による最適アライメント
配列アライメントの動的計画法(Dynamic Programming)は、DNAやタンパク質などの配列を比較して、最もよく一致する部分を見つける方法です。ここでは、グローバルアライメント(Needleman-Wunsch法)の簡単な例で説明します。
例:2つの配列をアラインする
配列A:GATTACA 配列B:GCATGCU
ステップ①:スコアのルールを決める
一致(match):+1
不一致(mismatch):-1
ギャップ(gap):-1
ステップ②:スコア表(マトリックス)を作る
行:配列A(+1行目にギャップ) 列:配列B(+1列目にギャップ)
最初の行と列はギャップペナルティで初期化します。
- G C A T G C U
- 0 -1 -2 -3 -4 -5 -6 -7
G -1
A -2
T -3
T -4
A -5
C -6
A -7
ステップ③:スコアを埋める
各マスは以下の3つの選択肢から最大値を選びます:
左上(↖):一致/不一致のスコア
上(↑):ギャップ
左(←):ギャップ
例:(A, C)の位置
左上:
-2 + (-1)(不一致)上:
-2 + (-1)(ギャップ)左:
-1 + (-1)(ギャップ) → 最大値:-2
このようにして、表をすべて埋めていきます。
ステップ④:トレースバックでアラインメントを復元
右下から左上に向かって、どの方向から来たかをたどっていきます。これにより、最適なアラインメントが得られます。
例(結果の一例):
G A T T A C A
| | | | | |
G C A T G C U
✅ ポイントまとめ
動的計画法は「部分問題の最適解を使って全体の最適解を導く」方法。
スコア表を作って、各ステップで最適な選択をする。
最後にトレースバックでアラインメントを復元する。
もっと複雑な例やローカルアライメント(Smith-Waterman法)もあるけど、まずはこの基本を押さえると理解が深まるよ!興味があれば、スコア表を実際に埋めてみる練習もおすすめです。やってみる?
もちろん!もっとわかりやすく、身近な例えを使って説明してみますね。
ケーキの材料を比べるような感覚で考えてみよう
たとえば、あなたが2つのレシピを持っていて、それぞれの材料リストを比べたいとします。
レシピA:
卵 牛乳 小麦粉 砂糖レシピB:
卵 小麦粉 バター 砂糖
どこが同じで、どこが違うかを見つけたいですよね? これが「配列アライメント」の目的です。
動的計画法ってなに?
これは「表を使って、少しずつ比べていく方法」です。 材料リストの1つ1つを順番に比べて、どこが一致しているか、どこを飛ばす(ギャップ)かを考えながら、最もよく似た並び方を探します。
具体的な手順(簡単な例)
配列A:A C G T
配列B:A G T
ステップ①:表を作る
縦に配列A、横に配列Bを並べて、マス目を作ります。 最初の行と列は「ギャップを入れたときの点数」で埋めます。
- A G T
- 0 -1 -2 -3
A -1
C -2
G -3
T -4
(※ここでは、同じ文字なら +1、違う文字やギャップなら -1 というルールで点数をつけます)
ステップ②:マスを埋める
各マスでは、3つの選択肢から一番良い点数を選びます:
斜め(↖):文字が一致してるかどうか
上(↑):ギャップを入れる
左(←):ギャップを入れる
たとえば、CとGを比べると一致してないので -1。 でも、ギャップを入れた方が点数が高いこともあります。
ステップ③:最後に道をたどる
表の右下からスタートして、どの道を通ってきたかを逆にたどります。 これで「どこを一致させたか」「どこにギャップを入れたか」がわかります。
✅ 結果のイメージ
A C G T
| | |
A - G T
このように、Cは飛ばして(ギャップ)、他の文字を一致させることで、なるべく似た並びを作ることができます。
もし「実際に表を埋めてみたい!」と思ったら、一緒にやってみましょうか? もっと簡単な配列で練習することもできますよ!
なるほど、そこが引っかかっていたんですね。では、もっとかみくだいて説明しますね!
目的:最も高い点数を選ぶ
表のマスを埋めるとき、「この位置に来るには、どのルートが一番得か?」を考えます。
そのルートは3つあります:
斜め(↖)から来る: → 今の文字同士を比べて、一致していれば +1、不一致なら -1
上(↑)から来る: → 配列Aにギャップ(空白)を入れる。点数は -1
左(←)から来る: → 配列Bにギャップを入れる。点数は -1
例で見てみよう
配列A:C 配列B:G 今、表の「CとGを比べるマス」を埋めたいとします。
① 斜め(↖)から来る場合:
CとGは違う文字 → 不一致 → 点数は「斜めのマスの点数 -1」
② 上(↑)から来る場合:
Cを使って、Gを飛ばす(ギャップ) → 点数は「上のマスの点数 -1」
③ 左(←)から来る場合:
Gを使って、Cを飛ばす(ギャップ) → 点数は「左のマスの点数 -1」
どれが一番高いかを選ぶ!
たとえば、斜めから来ると -2、上から来ると -3、左から来ると -1 だったら…
→ 一番高いのは 左から来る(-1) → だからこのマスには「-1」を入れる!
✅ まとめ
「一致してるかどうか」だけじゃなく、「ギャップを入れた方が得になることもある」
だから、3つの選択肢を毎回比べて、一番高い点数を選ぶのがポイント!
もし実際の表で一緒に埋めてみたいなら、簡単な配列でやってみましょうか? 「A G T」と「A T」みたいな短い例でやると、すぐ理解できますよ!
大丈夫です!ここでは、実際の表を一緒に埋めながら、どのマスに何を入れるかを丁寧に説明します。使う配列は短くして、わかりやすくしますね。
例:配列A =「A G T」、配列B =「A T」
スコアルール:
一致(同じ文字)→ +1
不一致 → -1
ギャップ(空白)→ -1
ステップ①:表を作る
まず、縦に配列A、横に配列Bを並べて、表を作ります。 左端と上端には「ギャップを入れたときの点数」を入れます。
- A T
- 0 -1 -2
A -1
G -2
T -3
ステップ②:マスを埋める(1マスずつ解説)
マス (A, A) の点数を決める
斜め(↖):0 + 1(AとAは一致)→ 1
上(↑):-1 + (-1) → -2
左(←):-1 + (-1) → -2 → 最大は 1 → このマスには「1」を入れる!
- A T
- 0 -1 -2
A -1 1
G -2
T -3
マス (A, T)
斜め(↖):-1 + (-1)(AとTは不一致)→ -2
上(↑):1 + (-1) → 0
左(←):-2 + (-1) → -3 → 最大は 0 → このマスには「0」を入れる!
- A T
- 0 -1 -2
A -1 1 0
G -2
T -3
マス (G, A)
斜め(↖):-1 + (-1)(GとAは不一致)→ -2
上(↑):-2 + (-1) → -3
左(←):1 + (-1) → 0 → 最大は 0 → このマスには「0」を入れる!
- A T
- 0 -1 -2
A -1 1 0
G -2 0
T -3
マス (G, T)
斜め(↖):1 + (-1)(GとTは不一致)→ 0
上(↑):0 + (-1) → -1
左(←):0 + (-1) → -1 → 最大は 0 → このマスには「0」を入れる!
- A T
- 0 -1 -2
A -1 1 0
G -2 0 0
T -3
マス (T, A)
斜め(↖):-2 + (-1) → -3
上(↑):-3 + (-1) → -4
左(←):0 + (-1) → -1 → 最大は -1 → このマスには「-1」を入れる!
- A T
- 0 -1 -2
A -1 1 0
G -2 0 0
T -3 -1
マス (T, T)
斜め(↖):0 + 1(TとTは一致)→ 1
上(↑):-1 + (-1) → -2
左(←):-1 + (-1) → -2 → 最大は 1 → このマスには「1」を入れる!
- A T
- 0 -1 -2
A -1 1 0
G -2 0 0
T -3 -1 1
✅ 最終表:
- A T
- 0 -1 -2
A -1 1 0
G -2 0 0
T -3 -1 1
このように、1マスずつ「どこから来るのが一番得か?」を考えて埋めていくのが動的計画法です!
次はこの表を使って「どの文字を合わせるか」をたどる「トレースバック」に進めますが、ここまでで理解できそうですか? もっと一緒に埋めてみてもいいですよ!
すばらしい気づきです!その通りです。あなたの計算は正しくて、私の前の説明にミスがありました。では、もう一度正確に整理してみましょう。
問題のマス:A行・T列(つまり「A」と「T」を比べるマス)
このマスを埋めるには、3つの方向から来る可能性があります:
① 斜め(↖):AとTは違う → 不一致 → 点数 = 左上のマス(-1) + 不一致(-1) = -2
② 上(↑):上のマスは「T列・-行」つまり -2 → 点数 = -2 + ギャップ(-1) = -3
③ 左(←):左のマスは「A行・A列」つまり 1 → 点数 = 1 + ギャップ(-1) = 0
✅ 結論:最大値は「0」なので、このマスには 0 を入れる!
あなたの言う通り、左から来た場合は 1 + (-1) = 0 です。 前の説明で「上から来たら -2 + (-1)」と書いてしまったのは、上のマスの値を間違えて -1 としてしまったためです。正しくは -2 でした。
本当に鋭い指摘でした!こういう細かいところに気づけるのは、理解が深まっている証拠です。 この調子で、他のマスも一緒に埋めてみましょうか?それともトレースバックに進んでみたいですか?
よし、では前回の続きとして、残りのマスも一緒に埋めていきましょう! もう一度、使っている配列とスコアルールを確認します。
配列
配列A(縦):
A G T配列B(横):
A T
スコアルール
一致(match):+1
不一致(mismatch):-1
ギャップ(gap):-1
初期化した表
- A T
- 0 -1 -2
A -1
G -2
T -3
前回、マス (A,A)〜(T,T) まで埋めました。ここでもう一度、埋めたマスを含めて表を更新します。
✅ 完成したスコア表(すべてのマスを埋めた状態)
- A T
- 0 -1 -2
A -1 1 0
G -2 0 0
T -3 -1 1
トレースバック(最適なアラインメントを見つける)
表の右下(1)からスタートして、どの方向から来たかをたどります。
スタート:マス (T,T) = 1
→ TとTは一致 → 斜め(↖)に移動
次:マス (G,A) = 0
→ GとAは不一致 → 左(←)に移動(ギャップを入れる)
次:マス (G,-) = 0
→ Gにギャップ → 上(↑)に移動
次:マス (A,A) = 1
→ AとAは一致 → 斜め(↖)に移動
アラインメント結果
A G T
| |
A - T
AとAは一致
Gはギャップ(B側に対応する文字なし)
TとTは一致
まとめ
表を1マスずつ埋めるときは、3方向(↖ ↑ ←)から来る点数を比べて最大を選ぶ
最後に右下からたどることで、どの文字を合わせたかがわかる
ギャップを入れることで、より良い一致が得られることもある!
この流れがつかめれば、もっと長い配列でも同じように進められます。 「ローカルアライメント」や「スコアの工夫」など、さらに発展した話もありますが、まずはこの基本をしっかり理解するのが大事です!
もっと練習したい?別の配列でも一緒にやってみましょうか!
はい、正しくご指摘いただきました! マス (G,-) の値は -2 です。以下でしっかり確認してみましょう。
表の初期化(ギャップのペナルティ)
まず、左端の列(縦方向)と上端の行(横方向)は「ギャップを入れたときの点数」で埋めます。ギャップのペナルティは -1 なので、こうなります:
- A T
- 0 -1 -2
A -1
G -2
T -3
ここで、
マス (A,-) = -1(Aに1つギャップ)
マス (G,-) = -2(Gに2つギャップ)
マス (T,-) = -3(Tに3つギャップ)
つまり、Gの位置に来るには、2回ギャップを入れたという意味で、-2が正しい値です。
✅ まとめ
マス (G,-) は「ギャップを2回入れたときの点数」なので -2
あなたの指摘は完全に正確です!
こうやって1つずつ確認していくと、動的計画法の仕組みがどんどん見えてきますね。 次はトレースバックの道順をもう一度一緒にたどってみましょうか?それとも別の例題に挑戦してみますか?
ではもう一度、トレースバック(最適なアラインメントの復元)を一緒にやってみましょう! 使うのは、前回完成させたスコア表です。
配列の確認
配列A(縦):
A G T配列B(横):
A T
✅ 完成したスコア表
- A T
- 0 -1 -2
A -1 1 0
G -2 0 0
T -3 -1 1
トレースバックの手順
スタートは右下のマス (T, T) = 1 ここから、どの方向からこのマスに来たかをたどっていきます。
ステップ1:マス (T, T) = 1
配列Aの文字:T
配列Bの文字:T → 一致しているので、斜め(↖)から来たと判断 → 次はマス
(G, A)
ステップ2:マス (G, A) = 0
配列Aの文字:G
配列Bの文字:A → 不一致なので、3方向を比べる必要あり
確認:
斜め(↖):マス
(A, -)= -1 → -1 + (-1) = -2上(↑):マス
(A, A)= 1 → 1 + (-1) = 0左(←):マス
(G, -)= -2 → -2 + (-1) = -3
→ 最大は 0(上から) → 上(↑)から来たと判断 → 次はマス (A, A)
ステップ3:マス (A, A) = 1
配列Aの文字:A
配列Bの文字:A → 一致しているので、斜め(↖)から来たと判断 → 次はマス
(−, −)(スタート地点)
アラインメントの復元
たどった順に並べると:
A G T
| |
A - T
AとA → 一致
G → ギャップ(B側に対応する文字なし)
TとT → 一致
最終結果
配列A:A G T
配列B:A - T
このように、スコア表をたどることで、どの文字を合わせるか・どこにギャップを入れるかがわかります!
2025年10月6日 | カテゴリー:AUTODOCK VINA,CLUS PRO/BIOINFORMATICS |




