Matlab 康威生命游戏中的静物发生器

Matlab 康威生命游戏中的静物发生器,matlab,math,conways-game-of-life,Matlab,Math,Conways Game Of Life,我在考虑发电机(它不需要严格)。代码应该尽可能简单。我想到了这个想法:首先我生成随机矩阵,然后迭代每个元素并检查这两条规则: 1.活动单元必须有2个或3个活动邻居。 2.死细胞可以有任何数量的活邻居,除了3个。 若细胞不满足这些规则,我会切换它(若它是死的,我会让它活的等等),直到它满足这些规则。不幸的是,如果我改变了一个细胞,另一个细胞需要被修复,它需要永远稳定下来 我知道你可以对《生活的游戏》进行X次迭代,直到它稳定下来,但是你需要处理和检测一些振荡器 问题是: 我如何更轻松地搜索静物?您能

我在考虑发电机(它不需要严格)。代码应该尽可能简单。我想到了这个想法:首先我生成随机矩阵,然后迭代每个元素并检查这两条规则: 1.活动单元必须有2个或3个活动邻居。 2.死细胞可以有任何数量的活邻居,除了3个。 若细胞不满足这些规则,我会切换它(若它是死的,我会让它活的等等),直到它满足这些规则。不幸的是,如果我改变了一个细胞,另一个细胞需要被修复,它需要永远稳定下来

我知道你可以对《生活的游戏》进行X次迭代,直到它稳定下来,但是你需要处理和检测一些振荡器

问题是: 我如何更轻松地搜索静物?您能分享一些代码/想法吗?

下面是我根据自己的想法在matlab中创建的代码。代码工作不正常,尤其是我试图切换符合规则的单元格的部分

% live cell must have either 2 or 3 live neighbors.
% dead cell can have any number of live neighbors except 3.

DIM = 20;
M = randi(2, DIM+1) - 1;
%zeros the bounds
M(1,:) = 0;
M(DIM,:) = 0;
M(:,1) = 0;
M(:,DIM) = 0;

    for x = 2:length(M)
        for y = 2:length(M)
            %M = double((M & neighbours == 2) | neighbours == 3);
            neighbours = conv2(M, [1 1 1; 1 0 1; 1 1 1], 'same'); % returns numbers of neighbours
            if neighbours(x,y) == 1 || neighbours(x,y) == 0
                M(x,y) = 0;
            end
            if M(x, y) == 1 && (neighbours(x,y) > 3) || M(x, y) == 0 && neighbours(x,y) == 3 % still life
                if M(x,y)
                    todel = neighbours(x, y)-3;
                else
                    todel = 1;
                end

                while todel
                    a = randi(3, 1) - 2; % randomly choose cell to toggle
                    b = randi(3, 1) - 2;
                    if (a || b)
                        M(x+a, y+b) = ~M(x+a, y+b); % toggle cell
                        sprintf('(%d, %d);;(%d, %d)',x, y, x+a, y+b)
                        neighbours = conv2(M, [1 1 1; 1 0 1; 1 1 1], 'same'); % returns numbers of neighbours
                        if ((M(x, y) == 1 && (neighbours(x,y) == 2 || neighbours(x,y) == 3)) ||  (M(x, y) == 0 && neighbours(x,y) ~= 3)) % still life
                            todel = todel-1;
                        end
                    end
                end
            end 

            M(1,:) = 0;
            M(DIM,:) = 0;
            M(:,1) = 0;
            M(:,DIM) = 0;
        end
    end
%end

imshow(M, 'InitialMagnification', 1000);
drawnow;

有一个NxN板,并设置为随机像素。然后为每一个改变的像素在电路板上打+1分。然后做一个随机变异,如果分数上升,拒绝它,如果分数下降,接受它。实际上,您可能必须使用模拟退火

或者还有其他的搜索策略。
最终,您应该得到一个更改==0。我能看到的障碍是,这可能是琐碎的“死亡”生活。

你似乎有两个问题,两个问题都不清楚。你如何定义“静物”?你是指模式在有限个状态之间振荡的情况吗?您的第二个隐含问题来自“代码工作不正常”。如果您需要这方面的帮助,请参阅。@RoryDaulton。这是一种不会改变的生活,即使是在经历了无数次的反复之后。你写的“第二个问题”不是一个问题。我不是想说服任何人修改我的代码。我只是给了文一个有点错误的片段,也许这有助于理解我的问题。问题是粗体的,所以你可以清楚地看到它。@RoryDaulton OP想要生成一个具有静物特征的[半]随机模式,感谢澄清。我知道“静物”的标准定义,我自己也写过多个模拟游戏,虽然不是用Matlab编写的。我问过你对“静物”的定义,因为你的陈述“它不需要严格”和“有点稳定,但你需要处理和检测一些振荡器”并不清楚。@RoryDaulton静物的定义是有问题的“1.活动单元必须有2个或3个活动邻居。2.死细胞可以有任何数量的活邻居,除了3“。但生成这样一个模式似乎不是一个简单的任务