康威 再玩一次生命游戏

简介

数模训练代码

问题1

B3S23的最大静态模式 使用minizinc 构建

% Use this editor as a MiniZinc scratch book
int: nc = 11;
var int : t;
set of int: index = 1..nc;
set of int: inside = 2..(nc-1);
array[1..nc, 1..nc] of var 0..1: x;
array[1..nc, 1..nc] of var int: p; %中心点为1的数组
array[1..nc, 1..nc] of var int: q; %中心点为0的数组
% constraint forall(i in inside)(forall )
% 边界约束
constraint forall(i in index)(x[1, i] = 0);
constraint forall(i in index)(x[nc, i] = 0);
constraint forall(i in index)(x[i, 1] = 0);
constraint forall(i in index)(x[i, nc] = 0);
% 中心为1的约束
constraint forall(i in inside,j in inside)(p[i,j]= if x[i,j] == 1 then x[i-1,j] + x[i+1,j] + x[i-1, j-1] + x[i,j-1] + x[i+1, j-1] + x[i-1,j+1] + x[i,j+1] + x[i+1,j+1] else 3 endif);
constraint forall(i in inside,j in inside)( 2<=p[i,j] / p[i,j]<=3); % / 感觉这个符号就是 && 的意思
% 中心为0的约束
constraint forall(i in inside,j in inside)(q[i,j]= if x[i,j] == 0 then x[i-1,j] + x[i+1,j] + x[i-1, j-1] + x[i,j-1] + x[i+1, j-1] + x[i-1,j+1] + x[i,j+1] + x[i+1,j+1] else 100 endif);
% 四个角落
constraint q[1,1] = if x[1,1] == 0 then x[2,1]+x[1,2]+x[2,2] else 100 endif;
constraint q[1,nc] = if x[1,nc] == 0 then x[2,nc]+x[1,nc-1]+x[2,nc-1] else 100 endif;
constraint q[nc,1] = if x[nc,1] == 0 then x[nc-1,1]+x[nc-1,2]+x[nc,2] else 100 endif;
constraint q[nc,nc] = if x[nc,nc] == 0 then x[nc-1,nc]+x[nc-1,nc-1]+x[nc,nc-1] else 100 endif;
% 四条边
constraint forall(j in inside)(q[1,j] = if x[1,j] == 0 then x[1,j-1] + x[1,j+1] + x[2, j-1] + x[2,j] + x[2,j+1] else 100 endif);
constraint forall(j in inside)(q[nc, j] = if x[nc,j] == 0 then x[nc,j-1] + x[nc,j+1] + x[nc-1, j-1] + x[nc-1,j] + x[nc-1, j+1] else 100 endif);
constraint forall(i in inside)(q[i,1] = if x[i,1] == 0 then x[i-1,1]+x[i+1,1] + x[i-1,2] + x[i,2] + x[i+1, 2] else 100 endif);
constraint forall(i in inside)(q[i,nc] = if x[i, nc] == 0 then x[i-1,nc] + x[i+1,nc] + x[i-1,nc-1] + x[i,nc-1] + x[i+1, nc-1] else 100 endif);
% 为0 的总体约束
constraint forall(i in index,j in index)(abs(q[i,j] - 3) > 0.5);

solve maximize sum (i in index, j in index)(x[i,j]);
output [show(x[i,j]) ++ if j == nc then "
" else " " endif |i in index, j in index ]

问题21

B36S23的最大静态模式

% Use this editor as a MiniZinc scratch book
int: nc = 7;
var int : t;
set of int: index = 1..nc;
set of int: inside = 2..(nc-1);
array[1..nc, 1..nc] of var 0..1: x;
array[1..nc, 1..nc] of var int: p; %中心点为1的数组
array[1..nc, 1..nc] of var int: q; %中心点为0的数组
% constraint forall(i in inside)(forall )
% 边界约束
constraint forall(i in index)(x[1, i] = 0);
constraint forall(i in index)(x[nc, i] = 0);
constraint forall(i in index)(x[i, 1] = 0);
constraint forall(i in index)(x[i, nc] = 0);
% 中心为1的约束
constraint forall(i in inside,j in inside)(p[i,j]= if x[i,j] == 1 then x[i-1,j] + x[i+1,j] + x[i-1, j-1] + x[i,j-1] + x[i+1, j-1] + x[i-1,j+1] + x[i,j+1] + x[i+1,j+1] else 3 endif);
constraint forall(i in inside,j in inside)( 2<=p[i,j] / p[i,j]<=3); % / 感觉这个符号就是 && 的意思
% 中心为0的约束
constraint forall(i in inside,j in inside)(q[i,j]= if x[i,j] == 0 then x[i-1,j] + x[i+1,j] + x[i-1, j-1] + x[i,j-1] + x[i+1, j-1] + x[i-1,j+1] + x[i,j+1] + x[i+1,j+1] else 100 endif);
% 四个角落
constraint q[1,1] = if x[1,1] == 0 then x[2,1]+x[1,2]+x[2,2] else 100 endif;
constraint q[1,nc] = if x[1,nc] == 0 then x[2,nc]+x[1,nc-1]+x[2,nc-1] else 100 endif;
constraint q[nc,1] = if x[nc,1] == 0 then x[nc-1,1]+x[nc-1,2]+x[nc,2] else 100 endif;
constraint q[nc,nc] = if x[nc,nc] == 0 then x[nc-1,nc]+x[nc-1,nc-1]+x[nc,nc-1] else 100 endif;
% 四条边
constraint forall(j in inside)(q[1,j] = if x[1,j] == 0 then x[1,j-1] + x[1,j+1] + x[2, j-1] + x[2,j] + x[2,j+1] else 100 endif);
constraint forall(j in inside)(q[nc, j] = if x[nc,j] == 0 then x[nc,j-1] + x[nc,j+1] + x[nc-1, j-1] + x[nc-1,j] + x[nc-1, j+1] else 100 endif);
constraint forall(i in inside)(q[i,1] = if x[i,1] == 0 then x[i-1,1]+x[i+1,1] + x[i-1,2] + x[i,2] + x[i+1, 2] else 100 endif);
constraint forall(i in inside)(q[i,nc] = if x[i, nc] == 0 then x[i-1,nc] + x[i+1,nc] + x[i-1,nc-1] + x[i,nc-1] + x[i+1, nc-1] else 100 endif);
% 为0 的总体约束
constraint forall(i in index,j in index)(abs(q[i,j] - 3) > 0.5 / abs(q[i,j] - 6) > 0.5);

solve maximize sum (i in index, j in index)(x[i,j]);
output [show(x[i,j]) ++ if j == nc then "
" else " " endif |i in index, j in index ]

问题22

B36S236最大静态模式

% Use this editor as a MiniZinc scratch book
int: nc = 7;
var int : t;
set of int: index = 1..nc;
set of int: inside = 2..(nc-1);
array[1..nc, 1..nc] of var 0..1: x;
array[1..nc, 1..nc] of var int: p; %中心点为1的数组
array[1..nc, 1..nc] of var int: q; %中心点为0的数组
% constraint forall(i in inside)(forall )
% 边界约束
constraint forall(i in index)(x[1, i] = 0);
constraint forall(i in index)(x[nc, i] = 0);
constraint forall(i in index)(x[i, 1] = 0);
constraint forall(i in index)(x[i, nc] = 0);
% 中心为1的约束
constraint forall(i in inside,j in inside)(p[i,j]= if x[i,j] == 1 then x[i-1,j] + x[i+1,j] + x[i-1, j-1] + x[i,j-1] + x[i+1, j-1] + x[i-1,j+1] + x[i,j+1] + x[i+1,j+1] else 3 endif);
constraint forall(i in inside,j in inside)( 2==p[i,j] / p[i,j]==3 / p[i,j]==6); % / 感觉这个符号就是 && 的意思 / or
% 中心为0的约束
constraint forall(i in inside,j in inside)(q[i,j]= if x[i,j] == 0 then x[i-1,j] + x[i+1,j] + x[i-1, j-1] + x[i,j-1] + x[i+1, j-1] + x[i-1,j+1] + x[i,j+1] + x[i+1,j+1] else 100 endif);
% 四个角落
constraint q[1,1] = if x[1,1] == 0 then x[2,1]+x[1,2]+x[2,2] else 100 endif;
constraint q[1,nc] = if x[1,nc] == 0 then x[2,nc]+x[1,nc-1]+x[2,nc-1] else 100 endif;
constraint q[nc,1] = if x[nc,1] == 0 then x[nc-1,1]+x[nc-1,2]+x[nc,2] else 100 endif;
constraint q[nc,nc] = if x[nc,nc] == 0 then x[nc-1,nc]+x[nc-1,nc-1]+x[nc,nc-1] else 100 endif;
% 四条边
constraint forall(j in inside)(q[1,j] = if x[1,j] == 0 then x[1,j-1] + x[1,j+1] + x[2, j-1] + x[2,j] + x[2,j+1] else 100 endif);
constraint forall(j in inside)(q[nc, j] = if x[nc,j] == 0 then x[nc,j-1] + x[nc,j+1] + x[nc-1, j-1] + x[nc-1,j] + x[nc-1, j+1] else 100 endif);
constraint forall(i in inside)(q[i,1] = if x[i,1] == 0 then x[i-1,1]+x[i+1,1] + x[i-1,2] + x[i,2] + x[i+1, 2] else 100 endif);
constraint forall(i in inside)(q[i,nc] = if x[i, nc] == 0 then x[i-1,nc] + x[i+1,nc] + x[i-1,nc-1] + x[i,nc-1] + x[i+1, nc-1] else 100 endif);
% 为0 的总体约束
constraint forall(i in index,j in index)(abs(q[i,j] - 3) > 0.5 / abs(q[i,j] - 6) > 0.5);

solve maximize sum (i in index, j in index)(x[i,j]);
output [show(x[i,j]) ++ if j == nc then "
" else " " endif |i in index, j in index ]

问题3

B3S23最大的振荡器。

% Use this editor as a MiniZinc scratch book
int: nc = 6;
var int : t1; % B3/S23
set of int: index = 1..nc;
set of int: inside = 2..(nc-1);
array[1..nc, 1..nc] of var 0..1: x; % x 作为 周期0 的图
array[1..nc, 1..nc] of var 0..1: y; % y 作为 周期1 的图
array[1..nc, 1..nc] of var 0..1: z; % z 作为 周期2 的图
array[1..nc, 1..nc] of var int: xp; %中心点为1的数组
array[1..nc, 1..nc] of var int: xq; %中心点为0的数组
array[1..nc, 1..nc] of var int: yp; %中心点为1的数组
array[1..nc, 1..nc] of var int: yq; %中心点为0的数组
array[1..nc, 1..nc] of var int: t; %中心点为0的数组

% 边界约束 x
constraint forall(i in index)(x[1, i] = 0);
constraint forall(i in index)(x[nc, i] = 0);
constraint forall(i in index)(x[i, 1] = 0);
constraint forall(i in index)(x[i, nc] = 0);
% 边界约束 y
constraint forall(i in index)(y[1, i] = 0);
constraint forall(i in index)(y[nc, i] = 0);
constraint forall(i in index)(y[i, 1] = 0);
constraint forall(i in index)(y[i, nc] = 0);
% 边界约束 z
constraint forall(j in inside)(z[1,j] = 0);
constraint forall(j in inside)(z[nc, j] = 0);
constraint forall(i in inside)(z[i,1] = 0);
constraint forall(i in inside)(z[i,nc] = 0);
% 中心为1的约束
constraint forall(i in inside,j in inside)(xp[i,j] = if x[i,j] == 1 then x[i-1,j] + x[i+1,j] + x[i-1, j-1] + x[i,j-1] + x[i+1, j-1] + x[i-1,j+1] + x[i,j+1] + x[i+1,j+1] else 100 endif);

% 中心为0的约束
constraint forall(i in inside,j in inside)(xq[i,j] = if x[i,j] == 0 then x[i-1,j] + x[i+1,j] + x[i-1, j-1] + x[i,j-1] + x[i+1, j-1] + x[i-1,j+1] + x[i,j+1] + x[i+1,j+1] else 100 endif);
% 四个角落
constraint xq[1,1] = if x[1,1] == 0 then x[2,1]+x[1,2]+x[2,2] else 100 endif;
constraint xq[1,nc] = if x[1,nc] == 0 then x[2,nc]+x[1,nc-1]+x[2,nc-1] else 100 endif;
constraint xq[nc,1] = if x[nc,1] == 0 then x[nc-1,1]+x[nc-1,2]+x[nc,2] else 100 endif;
constraint xq[nc,nc] = if x[nc,nc] == 0 then x[nc-1,nc]+x[nc-1,nc-1]+x[nc,nc-1] else 100 endif;
% 四条边
constraint forall(j in inside)(xq[1,j] = if x[1,j] == 0 then x[1,j-1] + x[1,j+1] + x[2, j-1] + x[2,j] + x[2,j+1] else 100 endif);
constraint forall(j in inside)(xq[nc, j] = if x[nc,j] == 0 then x[nc,j-1] + x[nc,j+1] + x[nc-1, j-1] + x[nc-1,j] + x[nc-1, j+1] else 100 endif);
constraint forall(i in inside)(xq[i,1] = if x[i,1] == 0 then x[i-1,1]+x[i+1,1] + x[i-1,2] + x[i,2] + x[i+1, 2] else 100 endif);
constraint forall(i in inside)(xq[i,nc] = if x[i, nc] == 0 then x[i-1,nc] + x[i+1,nc] + x[i-1,nc-1] + x[i,nc-1] + x[i+1, nc-1] else 100 endif);
% 为1 0 的总体约束
constraint forall(i in index,j in index)(y[i,j] = if abs(xq[i,j] - 3) < 0.5 then 1 else
  if 2<=xp[i,j] / xp[i,j]<=3 then 1 else 0 endif  
  endif); % 等于3的话会新生



% 现在y中存储着 x 的下一代 
% 中心为1的约束
constraint forall(i in inside,j in inside)(yp[i,j] = if y[i,j] == 1 then y[i-1,j] + y[i+1,j] + y[i-1, j-1] + y[i,j-1] + y[i+1, j-1] + y[i-1,j+1] + y[i,j+1] + y[i+1,j+1] else 100 endif);

% 中心为0的约束
constraint forall(i in inside,j in inside)(yq[i,j] = if y[i,j] == 0 then y[i-1,j] + y[i+1,j] + y[i-1, j-1] + y[i,j-1] + y[i+1, j-1] + y[i-1,j+1] + y[i,j+1] + y[i+1,j+1] else 100 endif);
% 四个角落
constraint yq[1,1] = if y[1,1] == 0 then y[2,1]+y[1,2]+y[2,2] else 100 endif;
constraint yq[1,nc] = if y[1,nc] == 0 then y[2,nc]+y[1,nc-1]+y[2,nc-1] else 100 endif;
constraint yq[nc,1] = if y[nc,1] == 0 then y[nc-1,1]+y[nc-1,2]+y[nc,2] else 100 endif;
constraint yq[nc,nc] = if y[nc,nc] == 0 then y[nc-1,nc]+y[nc-1,nc-1]+y[nc,nc-1] else 100 endif;
% 四条边
constraint forall(j in inside)(yq[1,j] = if y[1,j] == 0 then y[1,j-1] + y[1,j+1] + y[2, j-1] + y[2,j] + y[2,j+1] else 100 endif);
constraint forall(j in inside)(yq[nc, j] = if y[nc,j] == 0 then y[nc,j-1] + y[nc,j+1] + y[nc-1, j-1] + y[nc-1,j] + y[nc-1, j+1] else 100 endif);
constraint forall(i in inside)(yq[i,1] = if y[i,1] == 0 then y[i-1,1]+y[i+1,1] + y[i-1,2] + y[i,2] + y[i+1, 2] else 100 endif);
constraint forall(i in inside)(yq[i,nc] = if y[i, nc] == 0 then y[i-1,nc] + y[i+1,nc] + y[i-1,nc-1] + y[i,nc-1] + y[i+1, nc-1] else 100 endif);
% 为0 的总体约束
constraint forall(i in index,j in index)(z[i,j] = if abs(yq[i,j] - 3) < 0.5 then 1 else
if 2 == yp[i,j] / yp[i,j]==3 then 1 else 0 endif
  endif); % 等于3的话会新生



% 约束 判断 x 和 y 要不一样(位置不一样)  x 和 z 要一样
constraint forall(i in index,j in index)( z[i,j] - x[i, j] == 0 );
constraint forall(i in index,j in index)( t[i,j] = abs(x[i,j] - y[i,j]));
constraint t1 = sum(i in index, j in index)(t[i,j]);
constraint t1 >= 1;
% 约束先按照最大话的 x 来
solve maximize sum (i in index, j in index)(y[i,j]);
output [show(x[i,j]) ++ if j == nc then "
" else " " endif |i in index, j in index ]

题外话

想参加一次数学建模比赛好难,我觉得成功的第一步就是有比较核心的队友。不离不弃。能力我觉得只要不笨,精力不差,投入时间就会有收获。马上研二了,不知道还有没有机会。以前本科最大的遗憾就是没能拿一两个奖项。不说了,说多了都是泪。没能写出很好的代码我很抱歉。

Hope is a good thing,maybe the best of things,and no good thing ever dies.----------- Andy Dufresne
原文地址:https://www.cnblogs.com/eat-too-much/p/13584578.html