我有一个关于我用D编写的两种细胞自动机算法的问题。
我先写了这个,对速度感到非常失望。尺寸为sizex = 64 sizey = 27,初始随机填充40%,在我相当现代的笔记本电脑上显着延迟约5秒。
(位置是一个结构,有两个整数,分别为x和y,有几种方法可用于不同的计算,而DIR是一个包含8个方块的位置的枚举):
Position[] runCellAutoma(uint sizex,uint sizey,Position[] poslist){
Position[] newposlist;
uint sy;
bool alive;
while(sy<=sizey){
for(uint sx;sx<=sizex;++sx){
int ncount;
Position checkpos = Position(sx,sy);
foreach_reverse(Position pos;poslist){
if(checkpos == pos){
alive = true;
}
foreach(POS; [EnumMembers!DIR]){
if(checkpos+POS == pos){
++ncount;
}
}
}
if(alive){
if(ncount >= 2 && ncount < 4 && sx > 0 && sy>0 && sx<sizex && sy<sizey){
newposlist ~= checkpos;
}
}
if(!alive){
if(ncount >= 2 && ncount < 3&&sx>0&&sy>0&&sx<sizex&&sy<sizey){
newposlist ~= checkpos;
}
}
}
++sy;
}
return newposlist;
我读了一些关于细胞自动机的信息,看起来他们中的许多人都使用了二维阵列的bool。所以我重写了我的算法:
Position[] runCellAutoma2(uint sizex,uint sizey,Position[] poslist){
Position[] newposlist;
bool[][] cell_grid = new bool[][](sizey,sizex);
for(int y;y<sizey;++y){
for(int x;x<sizex;++x){
cell_grid[y][x] = false;
}
}
foreach(Position pos; poslist){
if(pos.y < sizey && pos.x < sizex&&pos.y >=0 && pos.x >= 0){
cell_grid[pos.y][pos.x] = true;
}
}
foreach(y,bool[] col; cell_grid){
foreach(x,bool cell;cell_grid[y]){
int ncount;
foreach(POS; [EnumMembers!DIR]){
if(y+POS.y < sizey && x+POS.x < sizex&&y+POS.y >=0 && x+POS.x >= 0){
if(cell_grid[y+POS.y][x+POS.x]){
++ncount;
}
}
}
if(cell){
if(ncount >= 2 && ncount < 4 && x > 0 && y>0 && x<sizex && y<sizey){
newposlist ~= Position(to!int(x),to!int(y));
}
}
if(!cell){
if(ncount >= 2 && ncount < 3&&x>0&&y>0&&x<sizex&&y<sizey){
newposlist ~= Position(to!int(x),to!int(y));
}
}
}
}
return newposlist;
}
两者都给我相同的结果,但第二个版本立即使用与第一个版本相同的参数。我想知道为什么第一个比第二个慢得多?
谢谢。