Генерация слов в Cplex - PullRequest
       8

Генерация слов в Cplex

0 голосов
/ 06 октября 2018

Я довольно плохо знаком с программированием на CPlex и constrait и, похоже, не могу понять, как решить эту проблему.Если задана цель k и длина слова n , найдите набор из k слов ДНК длиной n .Слово ДНК - это строка над алфавитом {A, C, G, T} , которая удовлетворяет этим ограничениям:

  • Для всех пар слов w1, w2 вмножество, расстояние Хэмминга между ними должно быть больше заданного значения, d

  • Не менее 50% букв в слове должно быть G или C

  • Для всех пар слов w1, w2 в наборе расстояние Хэмминга между w1 и дополнением Уотсона-Крика w2 должно быть больше заданного значения, d

    Уотсона-Крикадополнение слова w получается путем обращения w и замены всех букв «A» на «T» и наоборот, и всех букв «C» на «G» и наоборот.

Я пытался следовать примеру Vellino, но не могу придумать, как смоделировать цель максимизации.Не могли бы вы помочь мне начать этот маленький проект?Меня особенно интересует код за пределами блока "subject to".

Спасибо!

1 Ответ

0 голосов
/ 07 октября 2018

вы можете начать с

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

}
...