• 康威 再玩一次生命游戏


    简介

    数模训练代码

    问题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
  • 相关阅读:
    JAXB
    webservice引用spring的bean
    org.apache.cxf.interceptor.Fault: No such operation
    org.apache.cxf.transport.servlet.CXFServlet cannot be cast to javax.servlet.Servlet
    Java常用jar包用途
    访问者模式
    模板模式
    策略模式
    状态模式
    代理模式
  • 原文地址:https://www.cnblogs.com/eat-too-much/p/13584578.html
Copyright © 2020-2023  润新知