Я тут наваял какой-то фигни, но она работает очень и очень медленно. У Попова в видеокурсе нет ни слова, как это можно оптимизировать. config.php Код (Text): <?php $sizei=32; $sizej=32; ?> index.php Код (Text): <?php include 'config.php'; echo '<form action="index.php" method="post">'; for($i=0; $i<$sizei; $i++){ for($j=0; $j<$sizej; $j++){ echo '<input type="text" name="c'.$i.'_'.$j.'" value="1" size=1>'; } echo '<br>'; } echo '<input type="submit" name="submit" value="submit">'; echo '</form>'; for($i=0; $i<$sizei; $i++){ for($j=0; $j<$sizej; $j++){ $cstring=c.$i._.$j; $m[$i][$j]=$_POST[$cstring]; } } $filename='mij.txt'; $mw=fopen($filename, 'w'); $m=serialize($m); fwrite($mw, $m); fclose($mw); ?> test.php Код (Text): <?php include 'config.php'; $mij='mij.txt'; $m3ijk='m3ijk.txt'; $xij='xijk.txt'; $yij='yijk.txt'; $xymovesij='xymoves.txt'; if(file_exists($mij)){ $rmij=fopen($mij, 'r'); $m=unserialize(fread($rmij,filesize($mij))); fclose($rmij); } if(file_exists($m3ijk)){ $rm3ijk=fopen($m3ijk, 'r'); $m3=unserialize(fread($rm3ijk,filesize($m3ijk))); fclose($rm3ijk); } if(file_exists($xij)){ $rxij=fopen($xij, 'r'); $x=unserialize(fread($rxij,filesize($xij))); fclose($rxij); } if(file_exists($yij)){ $ryij=fopen($yij, 'r'); $y=unserialize(fread($ryij,filesize($yij))); fclose($ryij); } if(file_exists($xymovesij)){ $rxymovesij=fopen($xymovesij, 'r'); $xymoves=unserialize(fread($rxymovesij,filesize($xymovesij))); fclose($rxymovesij); } header ("Content-type: image/png"); $img = imagecreatetruecolor($sizei*4, $sizej*2); for($i=0;$i<$sizei;$i++){ for($j=0;$j<$sizej;$j++){ $m2[$i][$j]=0; for($k=0;$k<8;$k++){ if(!isset($x[$i][$j][$k])){ $x[$i][$j][$k]=$i; $y[$i][$j][$k]=$j; } $i0=$x[$i][$j][$k]; $j0=$y[$i][$j][$k]; $m2[$i][$j]=$m2[$i][$j]+$m[$i0][$j0]; } for($k=0;$k<9;$k++){ if ($m[$i][$j]!=-1){ $k3=$k+9; }else{ $k3=$k; } $k2=($k-4)*2; switch($m2[$i][$j]){ case $k2: if(isset($m3[$i][$j][$k3])){ $m2[$i][$j]=$m3[$i][$j][$k3]; $m3[$i][$j][$k3]=$m3[$i][$j][$k3]*-1; }else{ $m3[$i][$j][$k3]=1; $m2[$i][$j]=$m3[$i][$j][$k3]; } break; } } //***************************** Графика ***************************** if($m[$i][$j]>0) { $r=255; $g=255; $b=255; } else { $r=0; $g=0; $b=0; } $ink=imagecolorallocate($img,$r,$g,$b); imagesetpixel($img,$i*2,$j*2,$ink); imagesetpixel($img,$i*2+1,$j*2+1,$ink); imagesetpixel($img,$i*2+1,$j*2,$ink); imagesetpixel($img,$i*2,$j*2+1,$ink); //***************************** Графика ***************************** $moves=array(-1,-1,1,1,0,-1,0,1,1,-1,-1,1,-1,0,1,0,1,0,-1,0,-1,1,1,-1,0,1,0,-1,1,1,-1,-1); for($k=0;$k<8;$k++){ $i0=$x[$i][$j][$k]; $j0=$y[$i][$j][$k]; if($m[$i0][$j0]==-1){ if(!isset($xymoves[$i][$j][$k][0])){ $karray=($k+1)*4-4; $xymoves[$i][$j][$k][0]=$moves[$karray]; } $x[$i][$j][$k]=$x[$i][$j][$k]+$xymoves[$i][$j][$k][0]; if($m[$i][$j]==-1){ switch($xymoves[$i][$j][$k][0]){ case -1: $xymoves[$i][$j][$k][0]=0; break; case 0: $xymoves[$i][$j][$k][0]=1; break; case 1: $xymoves[$i][$j][$k][0]=-1; break; } }else{ switch($xymoves[$i][$j][$k][0]){ case -1: $xymoves[$i][$j][$k][0]=1; break; case 0: $xymoves[$i][$j][$k][0]=-1; break; case 1: $xymoves[$i][$j][$k][0]=0; break; } } if(!isset($xymoves[$i][$j][$k][1])){ $karray=($k+1)*4-3; $xymoves[$i][$j][$k][1]=$moves[$karray]; } $y[$i][$j][$k]=$y[$i][$j][$k]+$xymoves[$i][$j][$k][1]; if($m[$i][$j]==-1){ switch($xymoves[$i][$j][$k][1]){ case -1: $xymoves[$i][$j][$k][1]=1; break; case 0: $xymoves[$i][$j][$k][1]=-1; break; case 1: $xymoves[$i][$j][$k][1]=0; break; } }else{ switch($xymoves[$i][$j][$k][1]){ case -1: $xymoves[$i][$j][$k][1]=0; break; case 0: $xymoves[$i][$j][$k][1]=1; break; case 1: $xymoves[$i][$j][$k][1]=-1; break; } } }else{ if(!isset($xymoves[$i][$j][$k][2])){ $karray=($k+1)*4-2; $xymoves[$i][$j][$k][2]=$moves[$karray]; } $x[$i][$j][$k]=$x[$i][$j][$k]+$xymoves[$i][$j][$k][2]; if($m[$i][$j]==-1){ switch($xymoves[$i][$j][$k][2]){ case -1: $xymoves[$i][$j][$k][2]=0; break; case 0: $xymoves[$i][$j][$k][2]=1; break; case 1: $xymoves[$i][$j][$k][2]=-1; break; } }else{ switch($xymoves[$i][$j][$k][2]){ case -1: $xymoves[$i][$j][$k][2]=1; break; case 0: $xymoves[$i][$j][$k][2]=-1; break; case 1: $xymoves[$i][$j][$k][2]=0; break; } } if(!isset($xymoves[$i][$j][$k][3])){ $karray=($k+1)*4-1; $xymoves[$i][$j][$k][3]=$moves[$karray]; } $y[$i][$j][$k]=$y[$i][$j][$k]+$xymoves[$i][$j][$k][3]; if($m[$i][$j]==-1){ switch($xymoves[$i][$j][$k][3]){ case -1: $xymoves[$i][$j][$k][3]=0; break; case 0: $xymoves[$i][$j][$k][3]=1; break; case 1: $xymoves[$i][$j][$k][3]=-1; break; } }else{ switch($xymoves[$i][$j][$k][3]){ case -1: $xymoves[$i][$j][$k][3]=1; break; case 0: $xymoves[$i][$j][$k][3]=-1; break; case 1: $xymoves[$i][$j][$k][3]=0; break; } } } } /* $moves=array(-1,-1,1,1,0,-1,0,1,1,-1,-1,1,-1,0,1,0,1,0,-1,0,-1,1,1,-1,0,1,0,-1,1,1,-1,-1); for($k=0;$k<8;$k++){ $i0=$x[$i][$j][$k]; $j0=$y[$i][$j][$k]; if($m[$i0][$j0]==-1){ $karray=($k+1)*4-4; $x[$i][$j][$k]=$x[$i][$j][$k]+$moves[$karray]; $karray=($k+1)*4-3; $y[$i][$j][$k]=$y[$i][$j][$k]+$moves[$karray]; }else{ $karray=($k+1)*4-2; $x[$i][$j][$k]=$x[$i][$j][$k]+$moves[$karray]; $karray=($k+1)*4-1; $y[$i][$j][$k]=$y[$i][$j][$k]+$moves[$karray]; } } */ for($k=0;$k<9;$k++){ if($x[$i][$j][$k]==-1){ $x[$i][$j][$k]=$sizei-1; } if($x[$i][$j][$k]==$sizei){ $x[$i][$j][$k]=0; } if($y[$i][$j][$k]==-1){ $y[$i][$j][$k]=$sizej-1; } if($y[$i][$j][$k]==$sizej){ $y[$i][$j][$k]=0; } } } } $ti=15; $tj=16; $ink2=imagecolorallocate($img,255,255,255); imagesetpixel($img,($ti*2)+$sizei*2,$tj*2,$ink2); imagesetpixel($img,($ti*2+1)+$sizei*2,$tj*2+1,$ink2); imagesetpixel($img,($ti*2+1)+$sizei*2,$tj*2,$ink2); imagesetpixel($img,($ti*2)+$sizei*2,$tj*2+1,$ink2); $tempx=$x[$ti][$tj][0]; $tempy=$y[$ti][$tj][0]; $ink3=imagecolorallocate($img,80,255,255); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2,$ink3); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2+1,$ink3); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2,$ink3); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2+1,$ink3); $tempx=$x[$ti][$tj][1]; $tempy=$y[$ti][$tj][1]; $ink4=imagecolorallocate($img,255,80,255); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2,$ink4); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2+1,$ink4); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2,$ink4); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2+1,$ink4); $tempx=$x[$ti][$tj][2]; $tempy=$y[$ti][$tj][2]; $ink5=imagecolorallocate($img,80,80,255); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2,$ink5); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2+1,$ink5); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2,$ink5); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2+1,$ink5); $tempx=$x[$ti][$tj][3]; $tempy=$y[$ti][$tj][3]; $ink6=imagecolorallocate($img,255,255,80); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2,$ink6); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2+1,$ink6); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2,$ink6); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2+1,$ink6); $tempx=$x[$ti][$tj][4]; $tempy=$y[$ti][$tj][4]; $ink7=imagecolorallocate($img,80,255,80); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2,$ink7); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2+1,$ink7); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2,$ink7); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2+1,$ink7); $tempx=$x[$ti][$tj][5]; $tempy=$y[$ti][$tj][5]; $ink8=imagecolorallocate($img,255,80,80); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2,$ink8); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2+1,$ink8); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2,$ink8); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2+1,$ink8); $tempx=$x[$ti][$tj][6]; $tempy=$y[$ti][$tj][6]; $ink9=imagecolorallocate($img,80,80,80); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2,$ink9); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2+1,$ink9); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2,$ink9); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2+1,$ink9); $tempx=$x[$ti][$tj][7]; $tempy=$y[$ti][$tj][7]; $ink10=imagecolorallocate($img,0,80,160); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2,$ink10); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2+1,$ink10); imagesetpixel($img,($tempx*2+1)+$sizei*2,$tempy*2,$ink10); imagesetpixel($img,($tempx*2)+$sizei*2,$tempy*2+1,$ink10); imagepng($img); imagedestroy($img); $wmij=fopen($mij, 'w'); $m2=serialize($m2); fwrite($wmij, $m2); fclose($wmij); $wm3ijk=fopen($m3ijk, 'w'); $m3=serialize($m3); fwrite($wm3ijk, $m3); fclose($wm3ijk); $wxij=fopen($xij, 'w'); $x=serialize($x); fwrite($wxij, $x); fclose($wxij); $wyij=fopen($yij, 'w'); $y=serialize($y); fwrite($wyij, $y); fclose($wyij); $wxymovesij=fopen($xymovesij, 'w'); $xymoves=serialize($xymoves); fwrite($wxymovesij, $xymoves); fclose($wxymovesij); ?> И такой вопрос, что произойдет если массивы сохранять не в файлы а в сессионные переменные?
Значит, что если $sizei и $sizej около 100 - тогда чехлит около 10 секунд. Поубирал из кода все лишнее, чтобы легче читалось: Код (Text): <?php include 'config.php'; $mij='mij.txt'; $m3ijk='m3ijk.txt'; $xij='xijk.txt'; $yij='yijk.txt'; $rgbfile='rgb.txt'; if(file_exists($mij)){ $rmij=fopen($mij, 'r'); $m=unserialize(fread($rmij,filesize($mij))); fclose($rmij); } if(file_exists($m3ijk)){ $rm3ijk=fopen($m3ijk, 'r'); $m3=unserialize(fread($rm3ijk,filesize($m3ijk))); fclose($rm3ijk); } if(file_exists($xij)){ $rxij=fopen($xij, 'r'); $x=unserialize(fread($rxij,filesize($xij))); fclose($rxij); } if(file_exists($yij)){ $ryij=fopen($yij, 'r'); $y=unserialize(fread($ryij,filesize($yij))); fclose($ryij); } header ("Content-type: image/png"); $img = imagecreatetruecolor($sizei, $sizej); for($i=0;$i<$sizei;$i++){ for($j=0;$j<$sizej;$j++){ $m2[$i][$j]=0; for($k=0;$k<8;$k++){ if(!isset($x[$i][$j][$k])){ $x[$i][$j][$k]=$i; $y[$i][$j][$k]=$j; } $i0=$x[$i][$j][$k]; $j0=$y[$i][$j][$k]; $m2[$i][$j]=$m2[$i][$j]+$m[$i0][$j0]; } for($k=0;$k<9;$k++){ if ($m[$i][$j]!=-1){ $k3=$k+9; }else{ $k3=$k; } $k2=($k-4)*2; switch($m2[$i][$j]){ case $k2: if(isset($m3[$i][$j][$k3])){ $m2[$i][$j]=$m3[$i][$j][$k3]; $m3[$i][$j][$k3]=$m3[$i][$j][$k3]*-1; }else{ $m3[$i][$j][$k3]=1; $m2[$i][$j]=$m3[$i][$j][$k3]; } break; } } //***************************** Графика ***************************** if($m[$i][$j]>0) { $r=255; $g=255; $b=255; } else { $r=0; $g=0; $b=0; } $ink=imagecolorallocate($img,$r,$g,$b); imagesetpixel($img,$i,$j,$ink); //***************************** Графика ***************************** $moves=array(-1,-1,1,1,0,-1,0,1,1,-1,-1,1,-1,0,1,0,1,0,-1,0,-1,1,1,-1,0,1,0,-1,1,1,-1,-1); for($k=0;$k<8;$k++){ $i0=$x[$i][$j][$k]; $j0=$y[$i][$j][$k]; if($m[$i0][$j0]==-1){ $karray=($k+1)*4-4; $x[$i][$j][$k]=$x[$i][$j][$k]+$moves[$karray]; $karray=($k+1)*4-3; $y[$i][$j][$k]=$y[$i][$j][$k]+$moves[$karray]; }else{ $karray=($k+1)*4-2; $x[$i][$j][$k]=$x[$i][$j][$k]+$moves[$karray]; $karray=($k+1)*4-1; $y[$i][$j][$k]=$y[$i][$j][$k]+$moves[$karray]; } } for($k=0;$k<9;$k++){ if($x[$i][$j][$k]==-1){ $x[$i][$j][$k]=$sizei-1; } if($x[$i][$j][$k]==$sizei){ $x[$i][$j][$k]=0; } if($y[$i][$j][$k]==-1){ $y[$i][$j][$k]=$sizej-1; } if($y[$i][$j][$k]==$sizej){ $y[$i][$j][$k]=0; } } } } imagepng($img); imagedestroy($img); $mij='mij.txt'; $m3ijk='m3ijk.txt'; $xij='xijk.txt'; $yij='yijk.txt'; $wmij=fopen($mij, 'w'); $m2=serialize($m2); fwrite($wmij, $m2); fclose($wmij); $wm3ijk=fopen($m3ijk, 'w'); $m3=serialize($m3); fwrite($wm3ijk, $m3); fclose($wm3ijk); $wxij=fopen($xij, 'w'); $x=serialize($x); fwrite($wxij, $x); fclose($wxij); $wyij=fopen($yij, 'w'); $y=serialize($y); fwrite($wyij, $y); fclose($wyij); ?> Добавлено спустя 4 минуты 38 секунд: Я вот думаю, может это от того, что я в качестве индексов двумерного массива использую трехмерные массивы? Код (Text): $i0=$x[$i][$j][$k]; $j0=$y[$i][$j][$k]; $m2[$i][$j]=$m2[$i][$j]+$m[$i0][$j0]; Или может это из-за функции unserialize? Или из-за графики... Короче не знаю, на C++ у меня шустро работало, а в php чехлит.
Где-то здесь была тема для вашего случая. Сам Попова не смотрел (не выдержал его гнусавого монотонного голоса более 12 секунд), но по качеству кода его подаванов могу судить о качестве курса. В общем читайте книги умные и php.net. Или курсы качественные используйте. Аминь
Суть скрипта в чем. Есть клеточный автомат $sizei*$sizej клеточек. Правила взаимодействий между клеточками устанавливаются динамически, в зависимости от состояния системы. Количество клеточек, с которыми взаимодействует выбранная клеточка - тоже динамическое число. Координаты окружающих клеточек, опять же... Но не в этом дело. Есть динамическая система, которая пытается побороть внутреннюю энтропию самой себя, и тем самым обучается... А, впрочем, я отвлекся от основного вопроса. Где подкрутить надо, чтобы не так тормозило?
*facepalm* Вы делаете вещи явно не те, для которых предназначен РНР. Еще и оптимизировать это пытаетесь. Для быстрой скорости вашего алгоритма используйте Python или Ruby. Для более быстрой скорости используйте C (C#/ C++/ Objective C). Для мега-скорости - Assembler. НО не РНР!
Короче ты не понял. В чем главная проблема моей программы - в том, что если сделать координаты "окружающих клеточек" - динамическими, тогда теряется симметрия всей системы. Но тут опять-же, если мы зададим периодические граничные условия для каждой "окружающей клеточки", и ПРАВИЛЬНО подберем правила по которым меняются координаты этих клеточек - тогда симметрия восстанавливается. Фактически, с периодическими граничными условиями, наш клеточный автомат находится не в двухмерном пространстве, и даже не в трехмерном, а в пространстве Римана. С точки зрения топологии, поверхность нашего автомата, является четырехмерным тороидом! Добавлено спустя 20 минут 9 секунд: Я пробовал на C++ делать, но там меня компилятор выбрасывал куда-то в дизасемблер, еще на этапе компиляции. Вобщем не может он хранить в памяти мои 8-ми мерные массивы... Конечно можно там что-то с указателями, динамическая память и т.д. придумать... но куда мне с тремя неоконченными высшими в указатели лезть... Короче суть в чем. Любой клеточный автомат, с детерминированными правилами поведения между клеточками, рано или поздно приходить в состояние "зацыкливания". Это или состояние, когда он никак не меняется, или состояние, когда он переходит от одного состояния в другое, при этом количество состояний ограничено. Так вот, на любой внешний раздражитель, можно найти такое "детерминированное" состояние автомата. Фактически это будет "сущность" того или иного раздражителя на определенном... хм... поле. Так вот с помощью этих... хм... полей, или даже так сказать "карт" самоорганизаций, мы сможем обучить нашу программу взаимодействовать с внешними раздражителями. Добавлено спустя 1 минуту 19 секунд: Вобщем у Попова нет ни слова по этому поводу.
Но я хочу делать под web! Чтобы любой рандомный пользователь смог взаимодействовать с моей "нейронной сетью".
Для этого существуют нормальные способы. "Труъ" программисты РНР даже за язык программирования не считают, и отчасти они правы. Вы уже даже догадываетесь почему.
пхп читает и пишет в стандартные потоки ввода и вывода. тыможешь свою логикуи графику писать на любом языке. можешь работать в свящке с пхп. можешь обойтись и без него.