Создание генетического калькулятора в PHP, проблемы с неверными результатами

1

Я пытаюсь сделать генетический калькулятор. У меня есть следующий код:

<?php
    $gene1 = 'BA';
    $geneA = array();
    $i = 0;
    while ($i < strlen($gene1)) $geneA[] = substr($gene1,$i++,2);

    $gene2 = 'MSBA';
    $geneB = array();
    $i = 0;
    while ($i < strlen($gene2)) $geneB[] = substr($gene2,$i++,2);

    $possabilities = array();
    foreach ($geneA as $A) {
       foreach ($geneB as $B) {
          if ($A === strtoupper($A)) $possabilities[] = $A.$B;
          else {
             if ($B === strtoupper($B)) $possabilities[] = $B.$A;
             else $possabilities[] = $A.$B;
          }
       }
    }
    print_r($possabilities);
?>

Что работает до некоторой степени, он соединяет гены в массиве, однако он не работает должным образом. Это соединение должно просто вернуть BABA и MSBA. Вместо этого он возвращает это:

Array ( [0] => BAMS [1] => BASB [2] => BABA [3] => BAA [4] => AMS [5] => ASB [6] => ABA [7] => AA )

Это не идеально подходит для моего проекта. Я думал, что лучшей идеей было бы запятая разделить гены, такие как $gene1 = 'BA'; и $gene2 = 'MS,BA'; и запустить цикл, объединяющий каждый ген таким образом, но я не уверен, как это сделать правильно. Может ли кто-нибудь пролить свет на эту идею?

Теги:

1 ответ

2
Лучший ответ

Надеюсь, я прав, полагая, что

  • Гены всегда состоят из двух пар (MS, но не "M" и "S")
  • Каждый член $geneA должен быть сопоставлен с каждым членом $geneB

Часть 1: Разрешение ошибки

В этом случае ваш алгоритм расщепления имеет серьезный недостаток: он всегда прогрессирует только на один шаг в исходной строке ($gene1 и $gene2)

function getGeneArray($geneString) {
    // check the argument for fitting your needs!
    if ( strlen($geneString) % 2 == 1 ) {
         die('Supplied geneString is not made of pairs!'); // better not die - handle errors according to your application methodology
    }
    // add additional error-catching (there are only certain possible base-pairs, if something else is found you should reject the string

    $genes = array();
    $i = 0;
    while ( $i < strlen($geneString) )
    {
        $genes[] = substr($geneString, $i, 2);
        $i += 2; // Here is your mistake, you just $i++
    }
    return $genes;
}

С помощью этой небольшой функции вы: a) уменьшаете дубликаты в своем коде и b) получаете определенный результат (нет неправильных генов)

Часть 2. Создание самого документа кода

Глядя на ваш код, становится ясно, что пары uppercase-gene должны появляться для пар нижнего регистра, я пытаюсь сообщить об этом с помощью кода с помощью дополнительной функции с ясным именем.

function combinePairs($A, $B) {
    // uppercase genes build the string first, which means B must be uppercase to come first and A cant be uppercase
    if (strtoupper($A) !== $A && strotoupper($B) === $B) {
        return $B.$A;
    } 
    return $A.$B;
}       

Часть 3: Подключение

$geneA = getGeneArray($gene1);
$geneB = getGeneArray($gene2);

$possibilities = array();
foreach ($geneA as $A) {
    foreach ($geneB as $B) {
        $possibilities[] = combinePairs($A, $B);
    }
}

print_r($possibilities);

Итоговая записка

Как программист вы хотите удовлетворить потребности своего клиента или источника ввода, так что, конечно, вы можете разделить свои гены запятыми. Попытайтесь использовать формат, наиболее удобный для вашего приложения и клиента. В этом случае вы можете легко выбрать массив с помощью функции explode explode() (взорваться в руководстве)

  • 0
    Это абсолютно потрясающе и дает мне над чем поработать, спасибо большое! Можете ли вы дать совет, если бы я использовал что-то вроде "WTba", перешедшее к "WTba", и как установить, что 2 рецессивных гена (в нижнем регистре) станут BA. Например, фактический результат этого будет WT, BA и WTba
  • 1
    Всегда пожалуйста. Я не специалист по генетике, но я имею в виду что-то вроде правил Менделя ... но давайте начнем с самого начала: после расчета всех возможностей вы хотите выполнить функцию следующего шага с результатом из вашего сценария? учитывает ли он какие-либо шансы или должен просто отражать возможности? Не могли бы вы предоставить пример данных?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню