【问题标题】:Word generation in CplexCplex 中的单词生成
【发布时间】:2018-10-06 13:29:19
【问题描述】:

我对 CPlex 和约束编程很陌生,我似乎不知道如何解决这个问题。 给定一个目标k和一个词长n,找到一组k个长度n的DNA词。 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”(反之亦然)而获得的。

我尝试按照 Velino 示例进行操作,但我似乎想不出一种方法来模拟最大化目标。 你能帮我开始这个小项目吗?我对“主题”块之外的代码特别感兴趣。

谢谢!

【问题讨论】:

  • 所以你还没有尝试任何东西?那我怕它太宽泛了。不过,将其表述为 MIP 看起来相对简单(但它不会是一个小模型)。很难说您熟悉或不熟悉 MIP 公式的哪些基本构建块。您对最大化的期望是什么?您的描述没有什么可优化的。这只是一个可行性问题。因此,您可以将目标设置为任何常量。

标签: cplex opl


【解决方案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();
}

}

【讨论】:

  • 谢谢。我以为我必须找到某种最大化函数,但我了解您的代码并将其作为起点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 2021-03-17
  • 2011-09-14
  • 2013-12-17
  • 1970-01-01
相关资源
最近更新 更多