import numpy as np
def needleman_wunsch(seq1, seq2, match_score=1, mismatch_score=-1, gap_penalty=-1):
m, n = len(seq1), len(seq2)
score_matrix = np.zeros((m + 1, n + 1), dtype=int)
for i in range(m + 1):
score_matrix[i, 0] = i * gap_penalty
for j in range(n + 1):
score_matrix[0, j] = j * gap_penalty
for i in range(1, m + 1):
for j in range(1, n + 1):
match = score_matrix[i - 1, j - 1] + (match_score if seq1[i - 1] == seq2[j - 1] else mismatch_score)
delete = score_matrix[i - 1, j] + gap_penalty
insert = score_matrix[i, j - 1] + gap_penalty
score_matrix[i, j] = max(match, delete, insert)
align1, align2 = '', ''
i, j = m, n
while i > 0 or j > 0:
current_score = score_matrix[i, j]
if i > 0 and score_matrix[i - 1, j] + gap_penalty == current_score:
align1 = seq1[i - 1] + align1
align2 = '-' + align2
i -= 1
elif j > 0 and score_matrix[i, j - 1] + gap_penalty == current_score:
align1 = '-' + align1
align2 = seq2[j - 1] + align2
j -= 1
else:
align1 = seq1[i - 1] + align1
align2 = seq2[j - 1] + align2
i -= 1
j -= 1
return score_matrix[m, n], align1, align2
seq1 = "AAAATTAC"
seq2 = "TATGC"
score, aligned_seq1, aligned_seq2 = needleman_wunsch(seq1, seq2)
print(f"Alignment Score: {score}")
print(f"Aligned Sequence 1: {aligned_seq1}")
print(f"Aligned Sequence 2: {aligned_seq2}")