Расчеты для квадратной матрицы с использованием PHP - PullRequest
0 голосов
/ 26 мая 2020

Я аспирант и имею небольшие знания по PHP и SQL. У меня есть квадратная матрица размером примерно 12x12, и я беру данные для ее заполнения из базы данных. Моя проблема в том, что мне нужно получить все возможные комбинации, добавляя по одному значению из каждой строки, а PHP для этого требуется более 15 минут.

После получения данных из базы данных я делаю следующее: поместите их в 12 массивов, по одному на каждую строку с 12 значениями в каждом, по одному на каждый столбец матрицы. После этого я в основном go разбиваю на 12 циклов, по одному на каждый массив, чтобы добавить каждое значение с каждым значением каждой строки. Мои массивы от $ d0 до $ d11



for ($id0=0; $id0<=11; ++$id0){
$v0=$d0[$id0];
for ($id1=0; $id1<=11; ++$id1){
    if ($id1 <> $id0){
        $v1=$v0+$d1[$id1];

        for ($id2=0; $id2<=11; ++$id2){
        if (($id2 <> $id1)&&($id2 <> $id0)) {
            $v2=$v1+$d2[$id2];

            for ($id3=0; $id3<=11; ++$id3){
            if (($id3 <> $id0) && ($id3 <> $id1) && ($id3 <> $id2)) {
                $v3=$v2+$d3[$id3];

                for ($id4=0; $id4<=11; ++$id4){
                if (($id4 <> $id0) && ($id4 <> $id1) && ($id4 <> $id2) && ($id4 <> $id3)) {
                    $v4=$v3+$d4[$id4];

                    for ($id5=0; $id5<=11; ++$id5){
                    if (($id5 <> $id0) && ($id5 <> $id1) && ($id5 <> $id2) && ($id5 <> $id3) && ($id5 <> $id4)) {
                        $v5=$v4+$d5[$id5];

                        for ($id6=0; $id6<=11; ++$id6){
                        if (($id6 <> $id0) && ($id6 <> $id1) && ($id6 <> $id2) && ($id6 <> $id3) &&  ($id6 <> $id4) && ($id6 <> $id5)) {
                            $v6=$v5+$d6[$id6];

                            for ($id7=0; $id7<=11; ++$id7){
                            if (($id7 <> $id0) && ($id7 <> $id1) && ($id7 <> $id2) && ($id7 <> $id3) &&  ($id7 <> $id4) && ($id7 <> $id5) && ($id7 <> $id6)) {
                                $v7=$v6+$d7[$id7];

                                for ($id8=0; $id8<=11; ++$id8){
                                if (($id8 <> $id0) && ($id8 <> $id1) && ($id8 <> $id2) && ($id8 <> $id3) &&  ($id8 <> $id4) && ($id8 <> $id5) && ($id8 <> $id6)  && ($id8 <> $id7)) {
                                    $v8=$v7+$d8[$id8];

                                    for ($id9=0; $id9<=11; ++$id9){
                                    if  (($id9 <> $id1) && ($id9 <> $id2) && ($id9 <> $id3) &&  ($id9 <> $id4) && ($id9 <> $id5) && ($id9 <> $id6) && ($id9 <> $id7)  && ($id9 <> $id8) && ($id9 <> $id0)  ) {
                                        $v9=$v8+$d9[$id9];  

                                        for ($id10=0; $id10<=11; ++$id10){
                                        if  (($id10 <> $id1) && ($id10 <> $id2) && ($id10 <> $id3) &&  ($id10 <> $id4) && ($id10 <> $id5) && ($id10 <> $id6) && ($id10 <> $id7)  && ($id10 <> $id8) && ($id10 <> $id0)  && ($id10 <> $id9) ) {

                                            $v10=$v9+$d10[$id10];   

                                            for ($id11=0; $id11<=11; ++$id11){
                                            if  (($id11 <> $id0)  && ($id11 <> $id1) && ($id11 <> $id2) && ($id11 <> $id3) &&  ($id11 <> $id4) && ($id11 <> $id5) && ($id11 <> $id6) && ($id11 <> $id7)  &&  ($id11 <> $id8) && ($id11 <> $id9) && ($id11 <> $id10) ) {

                                                $v11=$v10+$d11[$id11];  

                                                if ($v11<$best){
                                                    $consumers = $id0.$id1.$id2.$id3.$id4.$id5.$id6.$id7.$id8.$id9.$id10.$id11;
                                                    $best = $v11;
                                                }
                                            }
                                            }
                                        }
                                        }
                                    }
                                    }
                                }
                                }
                            }
                            }
                        }
                        }
                    }
                    }
                }
                }
            }
            }

        }
        }
    }
    }
}
echo $consumers;
echo "</br>";
echo $best;

Не могли бы вы узнать другой способ сделать это и получить результаты быстрее? Производительность очень медленная, и мне нужно около 15 минут, чтобы получить результат. Как я могу улучшить производительность?

Извините за такую ​​огромную помощь, но у меня нет слишком много денег, чтобы попросить математика исправить это, и я хотел бы решить эту проблему, поскольку это было бы большим улучшением по окончании PhD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...