在康威生活游戏中的静物发电机

时间:2017-01-14 13:02:05

标签: matlab math conways-game-of-life

我在考虑still life生成器(它不需要严格)。代码应该尽可能简单。我提出了这个想法:首先,我生成随机矩阵,然后迭代每个元素并检查这两个规则: 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;

1 个答案:

答案 0 :(得分:1)

拥有NxN板,并设置为随机像素。然后为每个更改的像素为每个像素评分+1。然后进行随机变异,如果分数上升,拒绝它,如果分数下降,接受。实际上你可能不得不使用模拟退火。

http://www.malcolmmclean.site11.com/www/SimulatedAnnealing/SimulatedAnnealing.html

或者还有其他搜索策略。 最终你应该得到一个改变== 0.我可以看到的障碍是,这可能是微不足道的"死了"寿命。