Cplex 中的单词生成
Word generation in Cplex
我对 CPlex 和约束编程还很陌生,我似乎不知道如何解决这个问题。
给定一个目标k和一个词长n,找到一组k个长度为n。 DNA 单词是字母表 {A,C,G,T} 上的一个字符串,它满足以下限制:
对于集合中的所有词对w1,w2,汉明距离
它们之间必须大于给定值,d
单词中至少50%的字母必须是G或C
对于集合中的所有词对w1,w2,汉明距离
w1 和 w2 的 Watson-Crick 补码之间必须大于
给定值,d
单词 w 的 Watson-Crick 补码是通过反转 w 并将所有 "A" 字母替换为 "T" 反之亦然,并将所有 "C" 字母替换为 "G" 反之亦然。
我尝试按照 Vellino 示例进行操作,但我似乎想不出一种方法来对最大化进行建模 objective。
你能帮我开始这个小项目吗?我对 "subject to" 块之外的代码特别感兴趣。
谢谢!
你可以从
开始
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();
}
}
我对 CPlex 和约束编程还很陌生,我似乎不知道如何解决这个问题。 给定一个目标k和一个词长n,找到一组k个长度为n。 DNA 单词是字母表 {A,C,G,T} 上的一个字符串,它满足以下限制:
对于集合中的所有词对w1,w2,汉明距离 它们之间必须大于给定值,d
单词中至少50%的字母必须是G或C
对于集合中的所有词对w1,w2,汉明距离 w1 和 w2 的 Watson-Crick 补码之间必须大于 给定值,d
单词 w 的 Watson-Crick 补码是通过反转 w 并将所有 "A" 字母替换为 "T" 反之亦然,并将所有 "C" 字母替换为 "G" 反之亦然。
我尝试按照 Vellino 示例进行操作,但我似乎想不出一种方法来对最大化进行建模 objective。 你能帮我开始这个小项目吗?我对 "subject to" 块之外的代码特别感兴趣。
谢谢!
你可以从
开始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();
}
}