From fd8265bc450bac01640d937ff8fb882da7dcde55 Mon Sep 17 00:00:00 2001 From: Azza Bouleimen Date: Sat, 16 May 2020 15:56:18 +0100 Subject: [PATCH 1/2] project_Group7 --- FrequencyClass.png | Bin 0 -> 4733 bytes Gosper_Glider_Gun.png | Bin 0 -> 6524 bytes Heavy_Spaceship.png | Bin 0 -> 1258 bytes Medium_Spaceship.png | Bin 0 -> 1138 bytes game_of_life.ipynb | 2284 +++++++++++++++++++++++++++++++++++++++++ glider.png | Bin 0 -> 667 bytes light.png | Bin 0 -> 885 bytes still_life.png | Bin 0 -> 37264 bytes 8 files changed, 2284 insertions(+) create mode 100644 FrequencyClass.png create mode 100644 Gosper_Glider_Gun.png create mode 100644 Heavy_Spaceship.png create mode 100644 Medium_Spaceship.png create mode 100644 game_of_life.ipynb create mode 100644 glider.png create mode 100644 light.png create mode 100644 still_life.png diff --git a/FrequencyClass.png b/FrequencyClass.png new file mode 100644 index 0000000000000000000000000000000000000000..133a511fc7326d890aee360b6147be0a5bbb88c7 GIT binary patch literal 4733 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 LNkvXXu0mjfstoYG literal 0 HcmV?d00001 diff --git a/Gosper_Glider_Gun.png b/Gosper_Glider_Gun.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a30d6a14686db8a1f69c6c4aa403d94c76af97 GIT binary patch literal 6524 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 literal 0 HcmV?d00001 diff --git a/Heavy_Spaceship.png b/Heavy_Spaceship.png new file mode 100644 index 0000000000000000000000000000000000000000..a7366da021d546c44634990668222222b8d427a9 GIT binary patch literal 1258 zcmeAS@N?(olHy`uVBq!ia0y~yV4MbIpW5@=M+`@3#Z$squ7i45^s&_Qt_ntw@QMi@TJ| zSX@|K9BW)0Sy+zzn$O!kZO;aGy@UhLbMn1Q=g(g5|H{;OvP$;an7r#YmkR4QBpz<# zm6qR8=f^`rrI9~H*-pZg>BZ_VNRr;hEWXY6Qx ze)@1(@w8t19fdn%<#!d{k;}dGE48NWAL5@=M+`@3#Z$Vexcv45^s&_Qu9SEl&xzi$Ax2 z;OOA!X!_C71T<;)b)|;8zuh`2pGUl{)$I-0zAAm~*0i+hJ@anQTlc)1SK2J+hQ)(p zdz_gV{vUr?YvCoCdt*c5;bZ6X{%n5D#L%v;!l2^BEkirH}WWO{@zCIp$y6a$N=?MMecdAu3UmBD2@d{Q1R};YZN&?+-s# zy|XH@jo)^ATiM+m`Ja{Tj|ZC7^xxn5QTYDhWAATSoVve`whq{~Hn#oU?VSGW#n*dZ z|4cf3?0Vi0`9HtS`aYet&1Iax!O74$fq_cYnW*fuXO_QbJTTpAFaP%3w^k+hL2 38:\n", + " return np.zeros((N,N))\n", + " else:\n", + " return np.zeros((38,38))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Defining the type of each pattern:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "#Initialisation of the seed\n", + "def initialize_world(world, pattern=\"default\"):\n", + " if(pattern==\"default\"):\n", + " gap = world.shape[0]//3 #alocate the pattern in the middle of the chart \n", + " size = world.shape[0] - 2*gap #alocate the patterns in the middle of the the chart \n", + " grid = np.random.choice(states, size**2, p=[0.3, 0.7]).reshape(size, size)\n", + " world[gap:gap+size, gap:gap+size] = grid # grid of the patterns \n", + " return\n", + " if(pattern == \"stillLifes\"): \n", + " stillLifes(world)\n", + " return\n", + " if(pattern==\"blinker\"): \n", + " blinker(world)\n", + " return\n", + " if(pattern==\"toad\"): \n", + " toad(world)\n", + " return\n", + " if(pattern==\"pulsar\"): \n", + " pulsar(world)\n", + " return\n", + " if (pattern==\"glider\"): \n", + " glider(world)\n", + " return\n", + " if (pattern==\"light_spaceship\"): \n", + " light_spaceship(world)\n", + " return\n", + " if (pattern==\"medium_spaceship\"):\n", + " medium_spaceship(world)\n", + " return\n", + " if (pattern==\"heavy_spaceship\"):\n", + " heavy_spaceship(world)\n", + " return\n", + " if (pattern==\"gun\"): \n", + " gun(world)\n", + " return\n", + " if (pattern==\"unbouded\"):\n", + " unbouded(world)\n", + " return" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.2 Update the grid" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#Itarations through generation\n", + "def update_world(frameNum,img,world):\n", + " world_copy = world.copy()\n", + " N = world.shape[0]\n", + " for i in range(N):\n", + " for j in range(N):\n", + " s = world[(i+1)%N,j]+world[i,(j+1)%N]+world[(i-1)%N,j]+world[i,(j-1)%N]+\\\n", + " world[(i+1)%N,(j+1)%N]+world[(i-1)%N,(j-1)%N]+world[(i+1)%N,(j-1)%N]+world[(i-1)%N,(j+1)%N]\n", + " \n", + " if world[i,j] == live:\n", + " if s>3 or s<2:\n", + " world_copy[i,j] = dead # overpopulation and underpopulation\n", + " elif s ==3:\n", + " world_copy[i,j] = live #reproduction \n", + " \n", + " img.set_data(world_copy) #we need to make a copy of the world in order to update the cells correctly \n", + " world[:] = world_copy[:]\n", + " return img" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "#Display of the animation\n", + "def animations(world):\n", + " fig, ax = plt.subplots() \n", + " img = ax.imshow(world, cmap='gray') \n", + " anim = animation.FuncAnimation(fig, update_world, fargs=(img, world), \n", + " frames = 25, \n", + " interval=500)\n", + " plt.close(anim._fig)\n", + " return anim" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3. Categories of patterns thought generations " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.1 Caracteristics of the patterns\n", + "\n", + "
    \n", + " \n", + "Number of cells : the number of cells stay alive in each generation;\n", + "\n", + "Bounding box : is the smallest rectangular array of cells that contains the entire pattern. It is one of the standard ways to measure the size of an object; the other standard metric is the population, in other words is the size of square box that fits the pattern;\n", + " \n", + "Frequency class : The frequency class of an object is a measure of its commonness. The frequency class of an object O, in a given set of objects, is defined as x if and only if the most common object in the set, M, is 2x times as common as O.\n", + " \n", + "![](FrequencyClass.png)\n", + "\n", + "Period : is the smallest number of generations it takes for it to reappear in its original form, possibly with some slight modification of interest.The pattern return at its initial state after \"x\" generations;\n", + " \n", + "Heat : The heat of an oscillator or spaceship is the average number of cells that change state in each generation, in other words is the number of \"births\" and \"deaths\";\n", + "\n", + "Mod : This caracteristic just the oscillator or spaceship have it. The Mod of a pattern is the smallest number of generations that it takes for it to reappear in its original form, possibily subject to some rotation or reflection. The mod of a pattern may be equal to its period, but it may also be a quarter of the period (for oscillators that rotate 90 degrees every quarter period) or half the period (for other oscillators that rotate 180 degrees every half period, oscillators with 180 degree rotational symmetry that rotate 90 degrees every half period, and also for flippers);\n", + " \n", + "Volatility : The volatility of an oscillator is the size (in cells) of its rotor divided by the sum of the sizes of its rotor and its stator. In other words, it is the proportion of cells involved in the oscillator which actually oscillate.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.2 Still Lifes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Still life (cellular automaton) In Conway's Game of Life and other cellular automata, is a pattern that does not change from one generation to the next. A still life can be thought of as an oscillator with unit period.\n", + "In the following code, we are implementing three types of still lives shapes: Block, Beehive and Loaf\n", + "\n", + "| Caracteristic | Block | Beehive | Loaf |\n", + "|-----------------|-------|---------|------|\n", + "| Period | 1 | 1 | 1 |\n", + "| Bounding Box | 2x2 | 3x4 | 4x4 |\n", + "| Frequency class | 0 | 0.9 | 2.7 |\n", + "\n", + "![](still_life.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [], + "source": [ + "def stillLifes(world):\n", + " N = world.shape[0]\n", + " type_still_life = np.random.randint(0,3)\n", + " print(type_still_life)\n", + " initial = np.random.randint(0,N,(1,2)).squeeze()\n", + " i, j = initial[0] , initial[1]\n", + " #Block\n", + " if type_still_life == 0:\n", + " world[i,j] = live\n", + " world[(i+1)%N, j] = live\n", + " world[i,(j+1)%N] = live\n", + " world[(i+1)%N,(j+1)%N] = live\n", + " #Beehive\n", + " elif type_still_life == 1:\n", + " world[(i+1)%N, j] = live\n", + " world[i,(j+2)%N] = live\n", + " world[(i+1)%N,(j+1)%N] = live\n", + " world[i, (j-1)%N] = live\n", + " world[(i-1)%N,j] = live\n", + " world[(i-1)%N,(j+1)%N] = live\n", + " #Loaf\n", + " elif type_still_life == 2:\n", + " world[(i+1)%N, j] = live\n", + " world[i,(j+2)%N] = live\n", + " world[i, (j-1)%N] = live\n", + " world[(i-1)%N,j] = live\n", + " world[(i-1)%N,(j+1)%N] = live\n", + " world[(i+1)%N,(j+2)%N] = live\n", + " world[(i+2)%N,(j+1)%N] = live" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.3 Oscillators \n", + "\n", + "An oscillator is a pattern that returns to its initial configuration after some number of steps. The static patterns shown above could be thought of as oscillators with a period of one. Here are two commonly-seen period-two oscillators:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* **The \"Blinker\"**\n", + "\n", + "Blinker is the smallest partern of the called group of oscilators which are made of patterns that after generations they return to the exact position. The parameter of the minimum number of generation until achieving the inicial state is called: period. For intance, the blinker has a period of 2 what means that after two generations it return to the initial position.We can consider the blinker a kind of \"Periodic Life pattern\".\n", + "\n", + "| Caracteristic | Value |\n", + "|-----------------|--------|\n", + "| Number of cells | 3 |\n", + "| Bounding box | 3x3 |\n", + "| Frequency class | 0,1 |\n", + "| Period | 2 |\n", + "| Mod | 1 |\n", + "| Heat | 4 |\n", + "| Volatility | 0,80 |" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "def blinker(world):\n", + " center = world.shape[0]//2 #getting the center of the world\n", + " #translating the shape to put it in the center of the world\n", + " world[center][center-1] = world[center][center] = world[center][center + 1] = 1" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Main\n", + "world = create_world(15) \n", + "initialize_world(world,\"blinker\")\n", + "\n", + "#print anim_to_html(anim)\n", + "anim = animations(world)\n", + "HTML(anim.to_html5_video())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* **The \"Toad\"**\n", + "\n", + "| Caracteristic | Value |\n", + "|-----------------|--------|\n", + "| Number of cells | 6 |\n", + "| Bounding box | 4x4 |\n", + "| Frequency class | 7,1 |\n", + "| Period | 2 |\n", + "| Mod | 2 |\n", + "| Heat | 8 |\n", + "| Volatility | 0,80 |" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#oscillators The \"Toad\"\n", + "def toad(world):\n", + " center = world.shape[0]//2 #getting the center of the world\n", + " #translating the shape to put it in the center of the world\n", + " world[center][center] = world[center][center+1] = world[center][center-1] = 1\n", + " world[center - 1][center] = world[center-1][center-1] = world[center-1][center-2] = 1\n", + " \n", + " \n", + "#Main\n", + "world = create_world(15) \n", + "initialize_world(world,\"toad\")\n", + "\n", + "#print anim_to_html(anim)\n", + "anim = animations(world)\n", + "HTML(anim.to_html5_video())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* **The \"Pulsar\"**\n", + "\n", + "Here's a period-three oscillator known as \"The Pulsar\", which displays some appealing symmetry.\n", + "\n", + "| Caracteristic | Value |\n", + "|-----------------|--------|\n", + "| Number of cells | 48 |\n", + "| Bounding box | 15x15 |\n", + "| Frequency class | 12,1 |\n", + "| Period | 3 |\n", + "| Mod | 3 |\n", + "| Heat | 42,7 |\n", + "| Volatility | 0,73 |" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#oscillators The \"Pulsar\"\n", + "def pulsar(world):\n", + " N = world.shape[0]\n", + " #world's center\n", + " c = N//2\n", + " #symetry coefficents\n", + " X=[1,1,-1,-1]\n", + " Y=[1,-1,1,-1]\n", + " for x, y in zip(X, Y):\n", + " left = c - x * 2\n", + " right = c - x * 4\n", + " world[c + y, min(left, right): max(left, right) + 1] = world[c + y * 6, min(left, right): max(left, right) + 1] = live\n", + " up = c + y * 2\n", + " down = c + y * 4\n", + " world[min(up, down): max(up, down) + 1, c - x] = world[min(up, down): max(up, down) + 1, c - x * 6] = live\n", + "\n", + " \n", + "#Main\n", + "world = create_world(15) \n", + "initialize_world(world,\"pulsar\")\n", + "\n", + "#print anim_to_html(anim)\n", + "anim = animations(world)\n", + "HTML(anim.to_html5_video())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3.4 Spaceships" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* **Glider**\n", + "\n", + "The glider is a pattern that travels across the board in Conway's Game of Life. Gliders are the smallest spaceships, and they travel diagonally at a speed of one cell every four generations. The glider is often produced from randomly generated starting configurations.\n", + "\n", + "| Caracteristic | Value |\n", + "|-----------------|--------|\n", + "| Number of cells | 5 |\n", + "| Bounding box | 3x3 |\n", + "| Frequency class | 1,8 |\n", + "| Period | 4 |\n", + "| Mod | 2 |\n", + "| Heat | 4 |\n", + "\n", + "Mod : 2 (After 2 generations the pattern becomes a 90 degre left rotation and a reflection of its initial state.)\n", + " \n", + "![](glider.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#oscillators The \"glider\"\n", + "def glider(world):\n", + " center = world.shape[0] // 2 #getting the center of the world\n", + " #translating the shape to put it in the center of the world\n", + " world[center+1][center] = world[center][center-1] = world[center][center+1] = live\n", + " world[center+1][center+1] = world[center-1][center+1] = 1\n", + "\n", + "\n", + "#Main\n", + "world = create_world(3) \n", + "initialize_world(world,\"glider\")\n", + "\n", + "#print anim_to_html(anim)\n", + "anim = animations(world)\n", + "HTML(anim.to_html5_video())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* **Light spaceship**\n", + "\n", + "| Caracteristic | Value |\n", + "|-----------------|--------|\n", + "| Number of cells | 9 |\n", + "| Bounding box | 35x4 |\n", + "| Frequency class | 11,2 |\n", + "| Period | 4 |\n", + "| Mod | 2 |\n", + "| Heat | 11 |\n", + "\n", + "Mod : 2 (After 2 generations the pattern becomes a 180 degres rotation)\n", + "\n", + "![](light.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# lightweight spaceship\n", + "def light_spaceship(world):\n", + " center = world.shape[0] // 2 #getting the center of the world\n", + " #translating the shape to put it in the center of the world\n", + " world[center][center+1]=live\n", + " world[center][center+4]=live\n", + " world[center+1][center+0]=live\n", + " world[center+2][center+0]=live\n", + " world[center+2][center+4]=live\n", + " world[center+3][center+0:center+4]=live\n", + "#Main\n", + "world = create_world(20) \n", + "initialize_world(world,\"light_spaceship\")\n", + "\n", + "#print anim_to_html(anim)\n", + "anim = animations(world)\n", + "HTML(anim.to_html5_video())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* **Medium spaceship**\n", + "\n", + "| Caracteristic | Value |\n", + "|-----------------|--------|\n", + "| Number of cells | 11 |\n", + "| Bounding box | 6x4 |\n", + "| Frequency class | 13,2 |\n", + "| Period | 4 |\n", + "| Mod | 2 |\n", + "| Heat | 15 |\n", + "\n", + "Mod : 2 (After 2 generations the pattern becomes a 180 degre rotation)\n", + "\n", + "![](Medium_Spaceship.png)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# mediumweight spaceship\n", + "def medium_spaceship(world):\n", + " center = world.shape[0] // 2 #getting the center of the world\n", + " #translating the shape to put it in the center of the world\n", + " world[center+0,3] = world[center+1,1] = world[center+1,5] = live\n", + " world[center+2,0] = world[center+3,0] = world[center+3,5] = world[center+4,0:5] = live\n", + "\n", + "#Main\n", + "world = create_world(20) \n", + "initialize_world(world,\"medium_spaceship\")\n", + "\n", + "#print anim_to_html(anim)\n", + "anim = animations(world)\n", + "HTML(anim.to_html5_video())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* **Heavy spaceship**\n", + "\n", + "| Caracteristic | Value |\n", + "|-----------------|--------|\n", + "| Number of cells | 13 |\n", + "| Bounding box | 7x4 |\n", + "| Frequency class | 15,7 |\n", + "| Period | 4 |\n", + "| Mod | 2 |\n", + "| Heat | 19 |\n", + "\n", + "Mod : 2 (After 2 generations the pattern becomes a 180 degre rotation)\n", + "\n", + "![](Heavy_Spaceship.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# heavyweight spaceship\n", + "def heavy_spaceship(world):\n", + " center = world.shape[0]//2 #getting the center of the world\n", + " #translating the shape to put it in the center of the world\n", + " world[0,center+3]=live\n", + " world[0,center+4]=live\n", + " world[1,center+1]=live\n", + " world[1,center+6]=live\n", + " world[2:4,center]=live\n", + " world[3,center+6]=live\n", + " world[4,center:center+6]=livelive\n", + "\n", + "\n", + "#Main\n", + "world = create_world(20) \n", + "initialize_world(world,\"heavy_spaceship\")\n", + "\n", + "#print anim_to_html(anim)\n", + "anim = animations(world)\n", + "HTML(anim.to_html5_video())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* **The Gosper Glider Gun**\n", + "\n", + "This pattern create streams of gliders forever.\n", + "\n", + "It is pattern that after can be shuttle running some generations it moves back to initial state, than emits forever glider which is a spaceship pattern that travels diagonally. Consider the first unbounded-growth.\n", + "\n", + "| Caracteristic | Value |\n", + "|-----------------|--------|\n", + "| Number of cells | 36 |\n", + "| Bounding box | 36x9 |\n", + "| Period | 30 |\n", + "\n", + "![](Gosper_Glider_Gun.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#spaceship The \"Gosper Glider Gun\"\n", + "def gun(world):\n", + " world[5:7,1:3] = live #setting a rectangle of cells to one\n", + " world[3,13:15] = live #setting a line of cells to one\n", + " world[4,12] = world[4,16] = live\n", + " world[5,11] = world[5,17] = live\n", + " world[6,11] = world[6,15] = live\n", + " world[6,17:19] = live #setting a line of cells to one\n", + " world[7,11] = world[7,18] = live\n", + " world[8,12] = world[8,16] = live\n", + " world[9,13:15] = live #setting a line of cells to one\n", + " world[1,25] = live\n", + " world[2,23] = world[2,25] = live\n", + " world[3:6,21:23] = live #setting a rectangle of cells to one\n", + " world[6,23] = live\n", + " world[6:8,25] = live #setting a line of cells to one\n", + " world[3:5,35:37] = live #setting a rectangle of cells to one\n", + "\n", + "world = create_world(36) # all cells in the begining are dead\n", + "initialize_world(world,\"gun\")\n", + "\n", + "#print anim_to_html(anim)\n", + "anim = animations(world)\n", + "HTML(anim.to_html5_video())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* **Unbounded growth** " + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#unbounded growth\n", + "def unbouded(world):\n", + " center = world.shape[0]//2 #getting the center of the world\n", + " #translating the shape to put it in the center of the world\n", + " world[center,center:center+5] = live\n", + " world[center+1,center]= live\n", + " world[center+2,center+3:center+5]= live\n", + " world[center+3,center+1:center+3]= world[center+3,center+4]= live\n", + " world[center+4,center] = world[center+4,center+2]= world[center+4,center+4]= live\n", + "world = create_world(40) # all cells in the begining are dead\n", + "initialize_world(world,\"unbouded\")\n", + "\n", + "#print anim_to_html(anim)\n", + "anim = animations(world)\n", + "HTML(anim.to_html5_video())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 4. Analyse the evolutions of patterns " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Nowadays it has been seen many application to Conway's Game of Life since biology to music due to its simple rules and coverage.Considering that\n", + "at the earlier studies of John Conway in 1970's,the elementary patterns were discovered with the use of blackboards, graph papwes and game boards. \n", + "After 50 years the academic world has changed dramatically with the popularization and evolution computational power able to do the more complex \n", + "calculations in seconds what led to more advanced patterns.\n", + "\n", + "Talking about still life patterns, this pattern is divided into groups such as :strict still life,pseudo still lifes, stable constellations and quasi still\n", + "lifes, considering the first two groups mentioned as the most important ones.For the strict still life,it is formed by one or two components, in case one\n", + "cell is removed it breaks the equilibrium and as the consequence the pattern is not considered a still life anymore due to the main characterist of \n", + "being a period 1 pattern.As example we have the Beehive shown in this work, the Beehive with tail and the \"table on table\".The pseudo still life are made of two or more island which means copies of still life which if one cell is removed, the\n", + "pattern is strict still life for the example the bi-block,the triple pseudo still life and teh quad pseudo still life. The blockade is an example of stable \n", + "constellation which is made by four blocks distant one from another and with no interaction. The last pattern is similar to a constellation with the slightest\n", + "difference that a dead cell between the block maintain the estability as the example the tub and the quasi still life. The most recently discovered in the Still \n", + "Life is \"House on house siamese table-on-table weld hat-siamese-hat\" which comprises 34 cells and it is an example of stric still lived in 2019.\n", + "\n", + "The oscillator pattern repeats itself after finite number of generations without moving in the grid and since the earlier works of Conway with the blinker and \n", + " pulsar with period respectely of 2 and 3, described in this project, much more complex patterns were developped with the substancial growth of the period reaching\n", + "the maximum of 312 so far with Dave Greene a called period-triple p104 gun in 2004. The most recent pattern was the first 23 rd period oscillator by Luka Okanishi\n", + "in November 2019.\n", + "\n", + "The spaceship is the pattern which after input an inicial seed, after a finite number of generation the pattern returns to the initial state but in a different location\n", + "in the grid. Due to this fact, spaceships have the intrinsic characteristic of speed which is defined by the the number of cells that an object travelled until returning \n", + "to its initial position, times aconstant c( which represents the speed of light)divided by the period ( number of generations until reaching its initial state).For instance,\n", + "a glider has a period of 4 and after its initial state it moves only one cell during its period that is why the speed is c/4.\n", + "It is assumption that no spaceship can move diagonally faster than c/4 and not faster than c/2 horizontaly.Spaceships are divided into the following classes :elementary,enginnered,adjustable and many others. The first one generally has a small size such as the glider.\n", + "which the latest discovery was done by Adam Gauche called \"Sir Robin\" which is also well-known as teh first \"knightship\" what means that for every two cells that moves horizontally,\n", + "one moves vertically.Engineered spaceships consists requires small interaction and the latest invention was the 2-engine Cordership discovered by Adam F. Pierce in 2017. Lastly,\n", + "the adjustable spaceship can adjust your own speed as the latest is the \"Demonoid \"which consists of a Gemini and orthogonal in 2015. The evolution of spaceship was observed in terms\n", + "of the dramatically increase of the number of cells, different speeds and ability to move in different directions such as vertically or in an oblique way.\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sources:\n", + "\n", + "https://www.conwaylife.com/\n", + "\n", + "https://cs.stanford.edu/people/eroberts/courses/soco/projects/2001-02/cellular-automata/walks%20of%20life/patterns.html\n", + "\n", + "http://web.archive.org/web/20090603015231/http://ddi.cs.uni-potsdam.de/HyFISCH/Produzieren/lis_projekt/proj_gamelife/ConwayScientificAmerican.htm\n", + "\n", + "https://books.google.it/books?id=Dvb0DAAAQBAJ&pg=PT158&lpg=PT158&dq=spaceship+speed+pattern+game+of+life&source=bl&ots=Hz9Q4ei6qi&sig=ACfU3U2yETRZztVfg_8ITIem1x0QuLt6HA&hl=pt-BR&sa=X&ved=2ahUKEwijmLbo3aHpAhXtQhUIHfcuBb84FBDoATAGegQIChAB#v=onepage&q=spaceship%20speed%20pattern%20game%20of%20life&f=false\n", + "\n", + "http://web.math.ucsb.edu/~padraic/ucsb_2014_15/ccs_problem_solving_w2015/The%20Game%20of%20Life.pdf\n", + "\n", + "https://niginsblog.wordpress.com/2016/03/07/new-spaceship-speed-in-conways-game-of-life/\n", + " \n", + "https://en.wikipedia.org/wiki/Oscillator_(cellular_automaton)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/glider.png b/glider.png new file mode 100644 index 0000000000000000000000000000000000000000..babd8c50ab3880cbcf9c725a41716b4cfd331168 GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0y~yU~~ntn>g5j5@=M+`@3&)MVAAz;aSW-L^Y-q-z#|DFZWqPX zCe^KAaNVn+wLrecphH`kWB2c3Kj!!u2V@uBE0Z~H$Z+P&nagYC86M2bF@9|C+93b? z`1R*Ynb)7!Pd?nnE8V~8;b%z&7ePwVwwacBe+3x6C&fQ)_^r6SF4Qc{QX}v2pSJsVi~qf<{ZYfl5y(Oz>d1ZesCfeee+n>+w(?4w<@`C; zc0Rp9z?D*TBkkFaug(m2x@)I0Uo*?OvEidMD99g4Cr)_H5RsZVADFrrJYD@<);T3K F0RRt?%}4+M literal 0 HcmV?d00001 diff --git a/light.png b/light.png new file mode 100644 index 0000000000000000000000000000000000000000..27ed3567647040ded84c8adae775f3701a3594a9 GIT binary patch literal 885 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

    ;4+adj4nA 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 Date: Sat, 16 May 2020 16:44:15 +0100 Subject: [PATCH 2/2] update --- game_of_life.ipynb | 399 ++++++++++++--------------------------------- 1 file changed, 100 insertions(+), 299 deletions(-) diff --git a/game_of_life.ipynb b/game_of_life.ipynb index 9c759a1..00fab78 100644 --- a/game_of_life.ipynb +++ b/game_of_life.ipynb @@ -258,7 +258,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -323,7 +323,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -335,14 +335,14 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "" @@ -441,14 +444,14 @@ "" ] }, - "execution_count": 26, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Main\n", - "world = create_world(15) \n", + "world = create_world(40) \n", "initialize_world(world,\"blinker\")\n", "\n", "#print anim_to_html(anim)\n", @@ -475,7 +478,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -597,7 +600,7 @@ "" ] }, - "execution_count": 27, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -641,7 +644,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -838,7 +841,7 @@ "" ] }, - "execution_count": 28, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -901,7 +904,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -1013,7 +1016,7 @@ "" ] }, - "execution_count": 29, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -1058,7 +1061,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -1187,7 +1190,7 @@ "" ] }, - "execution_count": 30, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -1234,7 +1237,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -1389,7 +1392,7 @@ "" ] }, - "execution_count": 31, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -1433,7 +1436,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -1579,7 +1582,7 @@ "" ] }, - "execution_count": 32, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -1595,7 +1598,7 @@ " world[1,center+6]=live\n", " world[2:4,center]=live\n", " world[3,center+6]=live\n", - " world[4,center:center+6]=livelive\n", + " world[4,center:center+6]=live\n", "\n", "\n", "#Main\n", @@ -1628,7 +1631,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -1955,7 +1958,7 @@ "" ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -1987,208 +1990,6 @@ "HTML(anim.to_html5_video())" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "* **Unbounded growth** " - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#unbounded growth\n", - "def unbouded(world):\n", - " center = world.shape[0]//2 #getting the center of the world\n", - " #translating the shape to put it in the center of the world\n", - " world[center,center:center+5] = live\n", - " world[center+1,center]= live\n", - " world[center+2,center+3:center+5]= live\n", - " world[center+3,center+1:center+3]= world[center+3,center+4]= live\n", - " world[center+4,center] = world[center+4,center+2]= world[center+4,center+4]= live\n", - "world = create_world(40) # all cells in the begining are dead\n", - "initialize_world(world,\"unbouded\")\n", - "\n", - "#print anim_to_html(anim)\n", - "anim = animations(world)\n", - "HTML(anim.to_html5_video())" - ] - }, { "cell_type": "markdown", "metadata": {},