我对CPlex和constrait编程还很陌生,而且似乎无法弄清楚如何解决此问题。 给定目标 k 和单词长度 n ,找到一组长度为 n 的 k DNA单词。 DNA字是满足以下约束的字母 {A,C,G,T} 上的字符串:
对于集合中所有词对w1,w2的汉明距离 它们之间必须大于给定值d
单词中至少50%的字母必须为G或C
对于集合中所有词对w1,w2的汉明距离 w1和w2的Watson-Crick补码之间的差必须大于 给定值d
单词w的沃森-克里克补码是通过反转w并将所有“ A”字母替换为“ T”,反之亦然,以及将所有“ C”字母替换为“ G”,反之亦然。
我尝试遵循Vellino的示例,但是我似乎想不出一种模拟最大化目标的方法。 你能帮我开始这个小项目吗?我特别对“主题”块之外的代码感兴趣。
谢谢!
答案 0 :(得分:1)
您可以从
开始using CP;
int n=5;
range letters=1..n;
int k=5; // words
range words=1..k;
int d=3;
dvar int x[words][letters] in 0..3; // ACGT
subject to
{
forall(ordered i,j in words) d<=sum(k in letters) (x[i][k]!=x[j][k]);
forall(i in words)
count(all(j in letters)x[i][j],1)+
count(all(j in letters)x[i][j],2)>=n/2;
forall(ordered i,j in words) d<=sum(k in letters) (x[i][k]!=(3-x[j][k]));
}
execute
{
function letterDisplay(n)
{
if (n==0) return "A";
if (n==1) return "C";
if (n==2) return "G";
if (n==3) return "T";
fail();
}
for(var w in words)
{
for(l in letters) write(letterDisplay(x[w][l]));
writeln();
}
}