Алгоритм решения локального выравнивания

Локальное выравнивание между X и Y, по крайней мере, в одном столбце, выравнивающем C по W.

Имея две последовательности X длины n и Y длины m, мы ищем локальное выравнивание с наивысшей оценкой (т. е. выравнивание между подстрокой X' из X и подстрокой Y' из Y), которое имеет хотя бы один столбец в в котором C из X' выравнивается с W из Y' (если такое выравнивание существует). В качестве модели подсчета очков мы используем матрицу замещения s и линейные штрафы за пропуски с параметром d.

Напишите код для эффективного решения проблемы. Если вы используете динамическое программирование, достаточно указать уравнения для вычисления записей в матрицах динамического программирования и указать, где начинается и заканчивается трассировка.

Мое решение:

Я взял 2 последовательности, а именно «HCEA» и «HWEA», и попытался решить вопрос. Вот мой код. Выполнил ли я то, что задано в вопросе? Если я ошибаюсь, пожалуйста, скажите мне, где я ошибся, чтобы я изменил свой код.

И есть ли другой способ решить вопрос? Если он доступен, кто-нибудь может опубликовать псевдокод или алгоритм, чтобы я мог его кодировать.

public class Q1 {

    public static void main(String[] args) {
        //  Input Protein Sequences 
        String seq1 = "HCEA";  
        String seq2 = "HWEA";

        //  Array to store the score
        int[][] T = new int[seq1.length() + 1][seq2.length() + 1];

        //  initialize seq1
        for (int i = 0; i <= seq1.length(); i++) {
            T[i][0] = i;
        }

        //  Initialize seq2
        for (int i = 0; i <= seq2.length(); i++) {
            T[0][i] = i;
        }

        //  Compute the matrix score
        for (int i = 1; i <= seq1.length(); i++) {
            for (int j = 1; j <= seq2.length(); j++) {
                if ((seq1.charAt(i - 1) == seq2.charAt(j - 1))
                        || (seq1.charAt(i - 1) == 'C') && (seq2.charAt(j - 1) == 'W')) {
                    T[i][j] = T[i - 1][j - 1];
                } else {
                    T[i][j] = Math.min(T[i - 1][j], T[i][j - 1]) + 1;
                }
            }
        }

        //  Strings to store the aligned sequences
        StringBuilder alignedSeq1 = new StringBuilder();
        StringBuilder alignedSeq2 = new StringBuilder();

        //  Build for sequences 1 & 2 from the matrix score
        for (int i = seq1.length(), j = seq2.length(); i > 0 || j > 0;) {
            if (i > 0 && T[i][j] == T[i - 1][j] + 1) {
                alignedSeq1.append(seq1.charAt(--i));
                alignedSeq2.append("-");
            } else if (j > 0 && T[i][j] == T[i][j - 1] + 1) {
                alignedSeq2.append(seq2.charAt(--j));
                alignedSeq1.append("-");
            } else if (i > 0 && j > 0 && T[i][j] == T[i - 1][j - 1]) {
                alignedSeq1.append(seq1.charAt(--i));
                alignedSeq2.append(seq2.charAt(--j));
            }
        }

        //  Display the aligned sequence
        System.out.println(alignedSeq1.reverse().toString());
        System.out.println(alignedSeq2.reverse().toString());
    }
}

@Shole Ниже приведены два вопроса и ответы, представленные в моем решенном листе.

  1. Выравнивание суффикса X с префиксом Y. Имея две последовательности X и Y, мы ищем выравнивание с наивысшей оценкой между любым суффиксом X и любым префиксом Y. В качестве модели оценки мы используем матрицу подстановки s и линейную Штрафы за пробел с параметром d. Приведите эффективный алгоритм для оптимального решения этой задачи за время O(nm), где n — длина X, а m — длина Y. Если вы используете подход динамического программирования, достаточно дать уравнения, необходимые для вычисления матрица динамического программирования, чтобы объяснить, какая информация хранится для обратной трассировки, и указать, где начинается и заканчивается трассировка.

Решение: пусть X_i будет префиксом X длины i, а Y_j обозначит префикс Y длины j. Мы вычисляем матрицу F так, что F[i][j] является лучшим результатом выравнивания любого суффикса X_i и строки Y_j. Мы также вычисляем матрицу трассировки P. Вычисление F и P можно выполнить за время O(nm) с использованием следующих уравнений:

F[0][0]=0
  for i = 1..n: F[i][0]=0
  for j = 1..m: F[0][j]=-j*d, P[0][j]=L
  for i = 1..n, j = 1..m:
      F[i][j] = max{ F[i-1][j-1]+s(X[i-1],Y[j-1]), F[i-1][j]-d, F[i][j-1]-d }
      P[i][j] = D, T or L according to which of the three expressions above is the maximum

После того, как мы вычислили F и P, мы находим наибольшее значение в нижней строке матрицы F. Пусть F[n][j0] будет этим наибольшим значением. Мы начинаем трассировку с F[n][j0] и продолжаем трассировку, пока не достигнем первого столбца матрицы. Построенное таким образом выравнивание и есть решение.

  1. Выравнивание Y по подстроке X без пробелов в Y Имея строку X длины n и строку Y длины m, мы хотим вычислить выравнивание Y с наивысшей оценкой по любой подстроке X с дополнительным ограничением, которое мы не разрешается вставлять какие-либо пробелы в Y. Другими словами, вывод представляет собой выравнивание подстроки X' из X со строкой Y, так что оценка выравнивания является максимально возможной (среди всех вариантов X') и таким образом, чтобы выравнивание не вносило пробелов в Y (но могло вводить пробелы в X'). В качестве модели подсчета очков мы снова используем матрицу замещения s и линейные штрафы за пропуски с параметром d. Предложите эффективный алгоритм динамического программирования, который оптимально решает эту задачу за полиномиальное время. Достаточно привести уравнения, необходимые для вычисления матрицы динамического программирования, объяснить, какая информация сохраняется для трассировки, и указать, где трассировка начинается и заканчивается. Каково время работы вашего алгоритма?

Решение:

Пусть X_i будет префиксом X длины i, а Y_j обозначит префикс Y длины j. Мы вычисляем матрицу F так, что F[i][j] является лучшим результатом выравнивания любого суффикса X_i и строки Y_j, так что выравнивание не вставляет пробелов в Y. Мы также вычисляем матрицу трассировки P. Вычисление F и P может быть выполнено за время O(nm) с использованием следующих уравнений:

F[0][0]=0
  for i = 1..n: F[i][0]=0
  for j = 1..m: F[0][j]=-j*d, P[0][j]=L
  for i = 1..n, j = 1..m:
      F[i][j] = max{ F[i-1][j-1]+s(X[i-1],Y[j-1]), F[i][j-1]-d }
      P[i][j] = D or L according to which of the two expressions above is the maximum

После того, как мы вычислили F и P, мы находим наибольшее значение в крайнем правом столбце матрицы F. Пусть F[i0][m] будет этим наибольшим значением. Мы начинаем трассировку с F[i0][m] и продолжаем трассировку, пока не достигнем первого столбца матрицы. Построенное таким образом выравнивание и есть решение.

Надеюсь, вы получили некоторое представление о том, что мне действительно нужно.


person Community    schedule 25.02.2014    source источник
comment
Я предлагаю вам сделать свой собственный HW, я могу предложить поиск материалов / алгоритмов вычислительной биологии.   -  person dolbi    schedule 25.02.2014
comment
@DOLBI, да, я знаю, что это мой HW. Я никого не просил решать вопрос. Я только что попросил помочь мне начать. Я действительно не смог получить материалы, которые помогут мне в решении проблемы.   -  person    schedule 25.02.2014
comment
Можете ли вы привести пример матрицы замен и штрафа за пробел??? Эти две вещи не являются общим термином, необходимым в DP, поэтому я не знал их значения раньше ... Дает ли матрица замещения вам оценку любых двухсимвольных совпадений? Например: матч «A» и «C» дает вам 3 балла и т. Д. Тогда что такое штраф за пробел? Я постараюсь дать вам более точное решение, если вы сможете вкратце объяснить мне, что это за две вещи...   -  person shole    schedule 01.03.2014
comment
@shole ... да, вы правы ... матрица подстановки дает нам оценку любых двух совпадений символов, как то, что вы сказали. и штраф за пробел добавляется, когда мы сопоставляем символ из одной последовательности с пробелом в другой последовательности и наоборот... например, F[0][j] = -jd в примерах решений...   -  person    schedule 01.03.2014


Ответы (1)


Я думаю, что найти ресурсы или даже ответ в Google довольно легко ... поскольку первый результат поиска уже является полным решением DP.

Тем не менее, я ценю, что вы хотели бы продумать решение самостоятельно и запрашиваете некоторые подсказки.

Прежде чем я дам некоторые советы, я хотел бы сказать кое-что о разработке решения DP (я полагаю, вы знаете, что это можно решить с помощью решения DP).

Решение dp в основном состоит из четырех частей:

1. DP state, you have to self define the physical meaning of one state, eg: a[i] := the money the i-th person have; a[i][j] := the number of TV programmes between time i and time j; etc

2. Transition equations

3. Initial state / base case

4. how to query the answer, eg: is the answer a[n]? or is the answer max(a[i])?

Всего 2 цента за решение DP, вернемся к вопросу :)

Вот несколько советов, которые я могу придумать:

  1. Что такое состояние дп? Сколько измерений достаточно, чтобы определить такое состояние? Думая о том, что вы решаете задачи, очень похожие на обычную задачу с подстроками (для двух строк), 1-мерность кажется слишком маленькой, а 3-мерность кажется слишком большой, верно?

  2. Как упоминалось в пункте 1, эта проблема очень похожа на общую проблему подстроки, может быть, вам следует взглянуть на эти проблемы, чтобы получить некоторое представление? LCS, LIS, Изменить расстояние и т. д.< /сильный>

Дополнительная часть: не имеет прямого отношения к ОП

ДП легко освоить, но трудно освоить. Я очень мало знаю об этом, действительно не могу поделиться. Я думаю, что «Введение в алгоритм» — вполне стандартная книга для начала, вы можете найти много ресурсов, особенно некоторые учебные пособия в формате ppt/pdf некоторых колледжей/университетов, чтобы изучить некоторые основные примеры DP. эти примеры полезны, и я объясню ниже)

Проблема может быть решена многими различными решениями DP, некоторые из них намного лучше (меньшая сложность времени/пространства) из-за четко определенного состояния DP.

Итак, как спроектировать лучшее состояние DP или хотя бы понять, что одну проблему можно решить с помощью DP? Я бы сказал, что это вопрос опыта и знаний. Есть набор "хорошо известных" проблем DP, которые, я бы сказал, многие другие проблемы DP можно решить, немного изменив их. Вот сообщение, которое я только что получил о другой проблеме DP , как указано в этом посте, эта проблема очень похожа на «хорошо известную» проблему под названием «умножение цепочки матриц». Итак, вы ничего не можете сделать с частью «опыта», поскольку она не имеет прямого пути, но вы можете работать над частью «знаний», изучив сначала эти стандартные задачи DP?

Наконец, давайте вернемся к вашему первоначальному вопросу, чтобы проиллюстрировать мою точку зрения:

  1. Поскольку я знал проблему LCS раньше, у меня есть ощущение, что для аналогичной проблемы я смогу решить ее, разработав аналогичное состояние DP и уравнение перехода? The state s(i,j):= The optimal cost for A(1..i) and B(1..j), given two strings A & B

  2. Что является «оптимальным», зависит от вопроса, и как достичь этого «оптимального» значения в каждом состоянии, определяется уравнением перехода.

  3. Когда это состояние определено, легко увидеть, что окончательный ответ, который я хотел бы запросить, будет просто s(len(A), len(B)).

  4. Базовый вариант? с(0,0) = 0 ! Мы ничего не можем сделать с двумя пустыми строками, верно?

Итак, с полученными знаниями у меня есть приблизительное представление о 4 основных компонентах разработки решения DP. Я знаю, что это немного долго, но я надеюсь, что это поможет, ура.

person shole    schedule 26.02.2014
comment
@shole... Большое спасибо!!! Очень рад видеть ваш ответ. Хотя я не мог понять все части вашего ответа, все же по сравнению с вопросом он намного лучше. Я изучу все вещи, которые вы упомянули, и сойдусь к решению. Было бы очень полезно, если бы вы могли предложить мне учебник или ссылки, которые будут охватывать общие концепции. - person ; 27.02.2014
comment
Я изо всех сил старался добавить дополнительную часть, и я надеюсь, что это поможет, всего наилучшего. - person shole; 27.02.2014
comment
@shole ... Я добавил свою реализацию ... Не могли бы вы проверить это и сказать мне, что мне следует улучшить ...? - person ; 01.03.2014
comment
Можете ли вы сказать об этом больше: «В качестве модели подсчета очков мы используем матрицу замещения s и линейные штрафы за пробел с параметром d». Если вы можете предоставить, например, это было бы лучше - person shole; 01.03.2014