0

我必须在 C# Form 中做一个程序,它必须从一个看起来像这样的文件加载:

100ACTGGCTTACACTAATCAAG

101TTAAGGCACAGAAGTTTCCA

102ATGGTATAAACCAGAAGTCT

...

120GCATCAGTACGTACCCGTAC

由数字 (ID) 和 20 个字母 (ADN) 组成的 20 行;另一个文件如下所示:

TGCAACGTGTACTATGGACC

简而言之,这是一个杀人游戏,有 20 人;我必须加载和拆分字母并且.. 我必须比较它们,最后我必须找到最佳匹配。我不知道该怎么做,我不知道如何加载数组中的字母然后拆分它们..然后比较它们。

4

2 回答 2

0

您在这里想要做的是使用类似于计算字符串之间的Levenshtein 距离的方法。

简而言之,它提供了一个字符串必须更改多少个单个字母才能与另一个字符串相等的计数。在 DNA 或蛋白质的背景下,这可以解释为代表两个个体或样本之间的突变数量。因此,较短的距离将表明两者之间的关系更密切。

该算法的计算量可能相当大,但会给你一个很好的答案。实施起来也很有趣和有启发性。您可以在wikipedia 文章下找到几种实现方法。

如果你觉得很难理解它是如何工作的,我建议你手动设置一个示例网格,一根短线在顶部水平,一根在左侧垂直,并尝试手动计算,以了解正确的概念(一开始可能会令人困惑,但实际上并不难)。

于 2013-11-11T08:41:28.467 回答
0

这是一个简单 match function的. 它可能没有您的游戏所需的复杂性。该解决方案不需要split对字符串进行显式处理以获取 DNA“字母”数组。比较 DNA in place

将每个“嫌疑人”条目与“证据”条目进行比较。

int idLength = 3;
string evidence = //read from file
List<string> suspects = //read from file
List<double> matchScores = new List<double>();

foreach (string suspect in suspects)
{
    int count = 0;
    for (int i = idLength; i < suspect.Length; i++)
    {
        if (suspect[i + idLength] == evidence[i]) count++;
    }
    matchScores.Add(count * 100 / evidence.Length);
}

matchScores列表现在包含所有个人匹配分数。我没有将最大匹配分数保存在单独的变量中,因为可能有多个“嫌疑人”具有相同的分数。要找出最匹配的主题,只需迭代matchScores列表即可。最佳匹配的索引是嫌疑人在suspects列表中的索引。

优化说明:

  • 您可以检查每个“可疑”字符串以查看 DNA 序列从哪里开始(即在什么索引处),因为它可能是可变的;
  • 此处可以使用字典,而不是两个列表,其中“可疑字符串”作为键,匹配分数作为值
于 2013-11-11T08:09:42.833 回答