Cplex中的单词生成

时间:2018-10-06 13:29:20

标签: cplex opl

我对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的示例,但是我似乎想不出一种模拟最大化目标的方法。 你能帮我开始这个小项目吗?我特别对“主题”块之外的代码感兴趣。

谢谢!

1 个答案:

答案 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();
}

}