{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "CG189KKDfXax"
   },
   "source": [
    ">> TREES, MORPHOGENESIS AND EVOLUTION\n",
    ">>>>\n",
    ">>> José Rodríguez\n",
    ">>>>\n",
    ">>> jose@ejristos.com\n",
    ">>>>\n",
    ">>> 5 September 2026.\n",
    ">>>>\n",
    ">>> Bogotá, Colombia.\n",
    "\n",
    "**Abstract**\n",
    "\n",
    "Houseflies (Musca domestica) are all the same around the world. This implies a tremendous stability of their morphology in spite of Evolution. Our bet is that this must be a natural result of the mechanism of reproduction. In fact, morphogenesis is attained by cell reproduction, and this is described by a tree.  As we know, phylogenetic trees have a strong reticence to evolve, caused by pleiotropy. That is why, we set as purpose for this contribution to propose a model for morphogenesis that is based on trees and to simulate it.\n",
    "\n",
    "# INTRODUCTION\n",
    "\n",
    "**The offspring of zebra have white stripes, or, like begets like. From this fact of Nature, we infer that morphogenesis must include inheritable characteristics. So, the biological form or shape must be written in the DNA of each individual and, hence, subject to Evolution.**\n",
    "\n",
    "Where the shape of a living being results from?\n",
    "\n",
    "Let us suppose the minimum: shape results directly from cell reproduction.\n",
    "\n",
    "A mother cell divides and two daughters results. After a while, a new cycle of reproduction might begin, in which each of the two cells divides. And so on. So, cell division is described by a tree that must be updated after each reproductive event. We hope that this type of trees also have a strong resistance to evolve, such as that shown by phylogenetic trees. If that is the case, we immediately have an explanation of the tremendous stability of the morphology of houseflies, which look the same all around the world. Thus, our global purpose is to study the stability of reproductive trees in the face of Evolution. In this essay, we propose various models for morphogenesis, we simulate them, and we work out in a specific case a prediction for its evolutionary stability.\n",
    "\n",
    "To begin with, let us learn how to encode trees in Python.\n",
    "\n",
    "## Trees\n",
    "\n",
    "We asked Gemini:\n",
    ">\n",
    "> Help us with the code for a tree whose nodes can have many children that must be updated from time to time.\n",
    "\n",
    "Gemini inserted the answer in our text intercalating explanations and code.  The Reader can distinguish our texts from those of Gemini by the context and corresponding styles. Programs may have adaptations by the Author. The most common one was to make programs self-contained and isolated from the others programs. This causes redundancies but prevents many troubles if one is making changes by routine. The advantage is that one can copy whatever program and run it in another place. To better understand the code, one can ask Gemini to explain it: click on the program, select the desired small segment of code to be explained, look inside the cell above-right for a three-points-menu, and choose 'Explain Code'. \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "cb4c5248"
   },
   "source": [
    "A basic tree structure can be represented using a `Node` class. Each `Node` will have a `value` and a list of `children`. We can implement methods to add children and traverse the tree, as in the following program that produces no output:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "c828a119"
   },
   "outputs": [],
   "source": [
    "# Program TreeNode1.py\n",
    "# Basic tree structure.\n",
    "# By Gemini\n",
    "\n",
    "class TreeNode1:\n",
    "    def __init__(self, value):\n",
    "        self.value = value\n",
    "        self.children = []\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, TreeNode1):\n",
    "            raise TypeError(\"Child must be an instance of TreeNode\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"TreeNode(value={self.value}, children={[child.value for child in self.children]})\"\n",
    "\n",
    "    def update_value(self, new_value):\n",
    "        self.value = new_value\n",
    "\n",
    "    def get_child(self, value):\n",
    "        for child in self.children:\n",
    "            if child.value == value:\n",
    "                return child\n",
    "        return None\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "  # Create the root node\n",
    "  root = TreeNode1(\"Root\")\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ffea9e39"
   },
   "source": [
    "Let's demonstrate how to create a tree, add children, and update a node's value. Updating the tree structure itself often involves adding/removing children or re-parenting nodes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "elapsed": 14,
     "status": "ok",
     "timestamp": 1788288304222,
     "user": {
      "displayName": "jose rodriguez",
      "userId": "08454562216435392883"
     },
     "user_tz": 300
    },
    "id": "5ddb838b",
    "outputId": "d9bdec74-9958-4358-bd35-799e211a2108"
   },
   "outputs": [],
   "source": [
    "# Program TreeNode2.py\n",
    "# A tree is created, children are added and values are updated.\n",
    "# By Gemini\n",
    "\n",
    "class TreeNode2:\n",
    "    def __init__(self, value):\n",
    "        self.value = value\n",
    "        self.children = []\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, TreeNode2):\n",
    "            raise TypeError(\"Child must be an instance of TreeNode\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"TreeNode(value={self.value}, children={[child.value for child in self.children]})\"\n",
    "\n",
    "    def update_value(self, new_value):\n",
    "        self.value = new_value\n",
    "\n",
    "    def get_child(self, value):\n",
    "        for child in self.children:\n",
    "            if child.value == value:\n",
    "                return child\n",
    "        return None\n",
    "\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "  # Create the root node\n",
    "  root = TreeNode2(\"Root\")\n",
    "\n",
    "  # Add some children to the root\n",
    "  child1 = TreeNode2(\"Child 1\")\n",
    "  child2 = TreeNode2(\"Child 2\")\n",
    "  root.add_child(child1)\n",
    "  root.add_child(child2)\n",
    "\n",
    "  # Add a grandchild to Child 1\n",
    "  grandchild1_1 = TreeNode2(\"Grandchild 1.1\")\n",
    "  child1.add_child(grandchild1_1)\n",
    "\n",
    "  # Add another grandchild to Child 1\n",
    "  grandchild1_2 = TreeNode2(\"Grandchild 1.2\")\n",
    "  child1.add_child(grandchild1_2)\n",
    "\n",
    "  # Display the tree structure (simplified representation)\n",
    "  print(\"Initial Tree:\")\n",
    "  print(root)\n",
    "  print(root.children)\n",
    "  print(child1.children)\n",
    "\n",
    "  # Update a node's value\n",
    "  print(\"\\nUpdating Child 2's value...\")\n",
    "  child2.update_value(\"Updated Child 2\")\n",
    "  print(root)\n",
    "\n",
    "  # Add a new child to root (an 'update' to the tree structure)\n",
    "  print(\"\\nAdding a new child to Root...\")\n",
    "  child3 = TreeNode2(\"Child 3\")\n",
    "  root.add_child(child3)\n",
    "  print(root)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "puQjCUAjkkO3"
   },
   "source": [
    "** Exercise.** Run the previous program and follow the result of adding two children to the root, which represents the zygote, from which a whole organism results, or a mother cell that gives origin to an organ.\n",
    ">\n",
    "> *Answer.* The tree was created with a root, two children, 'Child 1' and 'Child 2', and two grandchildren grandchild1_1 and grandchild1_2 that were the offspring of 'Child 1'. Next, 'child3' was added to the root.  The name of 'child 2' was changed to 'Updated Child 2'.\n",
    "\n",
    "**Exercise.** Delete 'grandchild1_2' and give a child to 'child3'.\n",
    ">\n",
    "> *Answer.* In the following program 'grandchild1_2' was deleted, and a child was given to 'child3'. Deletion was not declared, so we made space for it, inserted a comment with the requirement of deletion of a node, and Colab developed and inserted the corresponding code."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "dRu39m9QvPPU"
   },
   "outputs": [],
   "source": [
    "# Program TreeNode3.py\n",
    "# Enabling deletion of a node.\n",
    "# By Gemini\n",
    "\n",
    "class TreeNode3:\n",
    "    def __init__(self, value):\n",
    "        self.value = value\n",
    "        self.children = []\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, TreeNode3):\n",
    "            raise TypeError(\"Child must be an instance of TreeNode\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def delete_child(self, child_node):\n",
    "        if not isinstance(child_node, TreeNode3):\n",
    "            raise TypeError(\"Child must be an instance of TreeNode\")\n",
    "        self.children.remove(child_node)\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"TreeNode(value={self.value}, children={[child.value for child in self.children]})\"\n",
    "\n",
    "    def update_value(self, new_value):\n",
    "        self.value = new_value\n",
    "\n",
    "    def get_child(self, value):\n",
    "        for child in self.children:\n",
    "            if child.value == value:\n",
    "                return child\n",
    "        return None\n",
    "\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "  # Create the root node\n",
    "  root = TreeNode3(\"Root\")\n",
    "\n",
    "  # Add some children to the root\n",
    "  child1 = TreeNode3(\"Child 1\")\n",
    "  child2 = TreeNode3(\"Child 2\")\n",
    "  root.add_child(child1)\n",
    "  root.add_child(child2)\n",
    "\n",
    "  # Add a grandchild to Child 1\n",
    "  grandchild1_1 = TreeNode3(\"Grandchild 1.1\")\n",
    "  child1.add_child(grandchild1_1)\n",
    "\n",
    "  # Add another grandchild to Child 1\n",
    "  grandchild1_2 = TreeNode3(\"Grandchild 1.2\")\n",
    "  child1.add_child(grandchild1_2)\n",
    "\n",
    "  # Display the tree structure (simplified representation)\n",
    "  print(\"Initial Tree:\")\n",
    "  print(root)\n",
    "  print(root.children)\n",
    "  print(child1.children)\n",
    "\n",
    "  # Update a node's value\n",
    "  print(\"\\nUpdating Child 2's value...\")\n",
    "  child2.update_value(\"Updated Child 2\")\n",
    "  print(root)\n",
    "\n",
    "  # Add a new child to root (an 'update' to the tree structure)\n",
    "  print(\"\\nAdding a new child to Root...\")\n",
    "  child3 = TreeNode3(\"Child 3\")\n",
    "  root.add_child(child3)\n",
    "  print(root)\n",
    "\n",
    "  # Add a new child to child3\n",
    "  print(\"\\nAdding a new child to Child 3...\")\n",
    "  print(f\"Initial child3 {child3}\")\n",
    "  child4 = TreeNode3(\"Child 4\")\n",
    "  child3.add_child(child4)\n",
    "  print(f\"final child3 {child3}\")\n",
    "\n",
    "  # Delete 'grandchild1_2'\n",
    "  print(\"\\nDeleting 'Grandchild 1.2' from Child 1...\")\n",
    "  print(f\"Initial child1 {child1}\")\n",
    "  grandchild1_2 = child1.get_child(\"Grandchild 1.2\")\n",
    "  child1.delete_child(grandchild1_2)\n",
    "  print(f\"final child1 {child1}\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "-gHiv_ETylmP"
   },
   "source": [
    "We need trees generated at random. So, we asked Gemini:\n",
    ">\n",
    "> Please, the code for a random tree, with a random number of children at each node.\n",
    ">\n",
    "> Gemini proposed the following code. The parameter `max_depth` represents the maximal number of cell divisions that any branch in the tree may have. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "e8e6c977"
   },
   "outputs": [],
   "source": [
    "# Program randomTree.py\n",
    "# A random tree, with a random number of children at each node.\n",
    "# By Gemini\n",
    "\n",
    "import random\n",
    "\n",
    "class TreeNode4:\n",
    "    def __init__(self, value):\n",
    "        self.value = value\n",
    "        self.children = []\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, TreeNode4):\n",
    "            raise TypeError(\"Child must be an instance of TreeNode\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def delete_child(self, child_node):\n",
    "        if not isinstance(child_node, TreeNode4):\n",
    "            raise TypeError(\"Child must be an instance of TreeNode\")\n",
    "        self.children.remove(child_node)\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"TreeNode(value={self.value}, children={[child.value for child in self.children]})\"\n",
    "\n",
    "    def update_value(self, new_value):\n",
    "        self.value = new_value\n",
    "\n",
    "    def get_child(self, value):\n",
    "        for child in self.children:\n",
    "            if child.value == value:\n",
    "                return child\n",
    "        return None\n",
    "\n",
    "\n",
    "def generate_random_tree4(max_depth, max_children, current_depth=0, node_prefix=\"Node\"):\n",
    "    \"\"\"\n",
    "    Generates a random tree using the TreeNode class.\n",
    "\n",
    "    Args:\n",
    "        max_depth (int): The maximum depth of the tree.\n",
    "        max_children (int): The maximum number of children a node can have.\n",
    "        current_depth (int): The current depth of the node being created (for internal use).\n",
    "        node_prefix (str): A prefix for the node values.\n",
    "\n",
    "    Returns:\n",
    "        TreeNode: The root of the randomly generated tree.\n",
    "    \"\"\"\n",
    "    # Create a node with a random value\n",
    "    node_value = f\"{node_prefix}_{current_depth}_{random.randint(0, 100)}\"\n",
    "    node = TreeNode4(node_value)\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        # Randomly decide how many children this node will have\n",
    "        num_children = random.randint(0, max_children)\n",
    "\n",
    "        for _ in range(num_children):\n",
    "            child = generate_random_tree4(\n",
    "                max_depth, max_children, current_depth + 1, node_prefix\n",
    "            )\n",
    "            node.add_child(child)\n",
    "    return node\n",
    "\n",
    "def print_tree4(node, level=0):\n",
    "    \"\"\"\n",
    "    Helper function to print the tree structure.\n",
    "    \"\"\"\n",
    "    indent = \"  \" * level\n",
    "    print(f\"{indent}- {node.value}\")\n",
    "    for child in node.children:\n",
    "        print_tree4(child, level + 1)\n",
    "\n",
    "# Let's generate a random tree with a maximum depth of 3\n",
    "# and a maximum of 2 children per node,\n",
    "# and then print its structure.\n",
    "if __name__ == \"__main__\":\n",
    "  random_tree_root = generate_random_tree4(max_depth=3, max_children=2)\n",
    "  print(\"Generated Random Tree:\")\n",
    "  print_tree4(random_tree_root)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "EB4hnnzZGcxH"
   },
   "source": [
    "** Exercise.** Run the previous program various times and make sure that you can assign a derived node to its true parent.\n",
    ">\n",
    "> *Answer.* Nodes are printed by levels, by generations of cellular divisions or depth of the tree, and to discover the parent of a node, one looks upwards for the first level to the left.\n",
    "\n",
    "Let us pass now to consider a first model of morphogenesis.\n",
    "\n",
    "# THE PRINTING MODEL\n",
    "\n",
    "We assume that the biological shape is a direct result of a modulation of the reproductive cellular process. Our first attempt to model morphogenesis is to postulate that each cell is positioned according to a preestablished design. This is precisely how 3D printers function. This is the printing model. We will simulate it in 2D, two dimensions. We will take cells of the same size, and they will occupy a unit square that can be positioned at whatever point with integer coordinates.\n",
    "\n",
    "The basic elements to simulate morphogenesis are the following:\n",
    "\n",
    "1.   The reproductive process is written in the reproductive trees used above.\n",
    "2.   The form is dictated by the positioning of the children. This will be defined by the following procedure:\n",
    "> 1. Each unit square, of edge 1, is determined by its bottom left corner. This corner is named the *anchor point*. So, the square that is in the origin of coordinates and extends towards the first quadrant is determined by the anchor point $(0,0)$. On the other hand, the anchor point $(3,2)$ defines the square with vertices $(3,2), (4,2), (4,3), (3,3)$.\n",
    "> 2. Each square has 8 neighboring squares. For instance, the anchor points of all the neighboring squares of $(5,8)$ are : $(4,7), (5,7), (6,7), (4,8), (6,8), (4,9),(5,9),  (6,9)$.\n",
    "\n",
    "**Exercise.** For a given anchor point $(x,y)$, that determines a unit square expanding rightwards and upwards, develop an automatic procedure to generate the vertices that define the square.\n",
    ">\n",
    "> *Answer.* The corners of the unit square generated by the anchor point $(x,y)$ are: $(x,y), (x+1,y), (x+1,y+1), (x,y+1)$, so, the procedure is $(x+c, y + d)$, where $c$ and $d$ can be $0$ or $1$.\n",
    "\n",
    "**Exercise.** For a given point $(x,y)$, that determines a unit square expanding rightwards and upwards, develop an automatic procedure to generate all the anchor points that generate all the neighboring squares.\n",
    ">\n",
    "> *Answer.* The corners of the unit squares that neighbor the square determined by the anchor point  $(x,y)$ are defined by the expression $(x+c, y + d)$, where $c$ and $d$ can be $-1, 0, 1$. This procedure renders 9 points because the original point is already included with the option $c = d = 0$. Therefore, this option must be excluded to generate the neighbors.\n",
    "\n",
    "How can we connect square cells in the plane to trees?\n",
    "\n",
    "We need this because the reproduction process is kept in the trees while cells exists and reproduce as squares in the plane. Our connection will be as follows:\n",
    "\n",
    "1. The mother cell divides and gives origin to two cells. One of them remains in the same place of the mother, and the second must occupy a neighboring square.  In short, a cell division is depicted by $mother \\rightarrow (mother, child)$.\n",
    "2. The child migrates and refills the neighboring square that is dictated by an address that was given beforehand.\n",
    "\n",
    "\n",
    "**Definition.** A **morphological tree** or **spatial tree** is a tree that generates a plot in the plane depicting a reproductive process. We have been working with 2D spatial trees that generate a plot in the plane in which cells are represented by unit squares.\n",
    "\n",
    "**Exercise.** Develop the corresponding code for the task that connects squares to trees.\n",
    ">\n",
    "> *Answer.* We asked Colab:\n",
    ">\n",
    "> The code that extends the tree class to include the coordinates $(x,y)$ of the left-bottom corner of a square in the plane, together with the coordinates $(x+c,y+d)$ of the left-bottom corner of a neighboring square that is chosen at random. An example of use with a graphic in the plane.\n",
    ">>\n",
    ">> Gemini answered:\n",
    ">>> Okay, here's the code that extends the tree class to include spatial coordinates for squares and generates children in random neighboring squares, complete with a graphical representation.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "JWwTg4FgZGX9"
   },
   "outputs": [],
   "source": [
    "# # Program tree_directs_morphogenesis.py\n",
    "# Extends the tree class to include spatial coordinates\n",
    "# for squares and generates children in random neighboring squares,\n",
    "# complete with a graphical representation.\n",
    "# By Gemini\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "# Building upon the previous TreeNode classes, let's create a SpatialTreeNode\n",
    "class SpatialTreeNode:\n",
    "    def __init__(self, value, x, y):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        # Iterate through all 9 possible combinations (including self)\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue  # Exclude the current square itself\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix):\n",
    "        available_neighbors = self.get_neighboring_coordinates()\n",
    "        if not available_neighbors:\n",
    "            print(f\"No available neighbors for {self.value} at ({self.x},{self.y})\")\n",
    "            return None\n",
    "\n",
    "        # Choose a random neighbor\n",
    "        nx, ny = random.choice(available_neighbors)\n",
    "\n",
    "        # Create a new child node with the chosen coordinates\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        child_node = SpatialTreeNode(child_value, nx, ny)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode(value={self.value}, x={self.x}, y={self.y}, children={[child.value for child in self.children]}\"\n",
    "    def update_value(self, new_value):\n",
    "        self.value = new_value\n",
    "\n",
    "# Example Usage with Graphics\n",
    "if __name__ == \"__main__\":\n",
    "    # Create a root node (mother cell) at (0,0)\n",
    "    root_cell = SpatialTreeNode(\"Mother Cell\", 0, 0)\n",
    "    print(f\"Root Cell: {root_cell}\")\n",
    "\n",
    "    # Simulate cell division: Mother cell stays, child moves to a random neighbor\n",
    "    child1 = root_cell.add_child_in_random_neighbor(\"Child\")\n",
    "    if child1:\n",
    "        print(f\"First Child: {child1}\")\n",
    "\n",
    "    # Another division from the root\n",
    "    child2 = root_cell.add_child_in_random_neighbor(\"Child\")\n",
    "    if child2:\n",
    "        print(f\"Second Child: {child2}\")\n",
    "\n",
    "    # A child can also divide\n",
    "    if child1:\n",
    "        grandchild1_1 = child1.add_child_in_random_neighbor(\"Grandchild\")\n",
    "        if grandchild1_1:\n",
    "            print(f\"Grandchild from Child1: {grandchild1_1}\")\n",
    "\n",
    "    # Plotting the squares\n",
    "    fig, ax = plt.subplots(figsize=(8, 8))\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "\n",
    "    # Function to draw a square\n",
    "    def draw_square(ax, x, y, color='blue', alpha=0.7, label=None):\n",
    "        rect = plt.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=1)\n",
    "        ax.add_patch(rect)\n",
    "        if label:\n",
    "            ax.text(x + 0.5, y + 0.5, label, ha='center', va='center', color='white', fontsize=8)\n",
    "\n",
    "    # Function to recursively draw the tree nodes\n",
    "    def plot_tree_nodes(node, ax):\n",
    "        draw_square(ax, node.x, node.y, color='skyblue', label=node.value)\n",
    "        for child in node.children:\n",
    "            draw_square(ax, child.x, child.y, color='lightcoral', label=child.value)\n",
    "            # Draw a line connecting parent to child (from center of squares)\n",
    "            ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--')\n",
    "            plot_tree_nodes(child, ax) # Recursively plot children\n",
    "\n",
    "    plot_tree_nodes(root_cell, ax)\n",
    "\n",
    "    # Set plot limits based on the occupied squares\n",
    "    all_coords = []\n",
    "    def collect_coords(node):\n",
    "        all_coords.append((node.x, node.y))\n",
    "        for child in node.children:\n",
    "            collect_coords(child)\n",
    "\n",
    "    collect_coords(root_cell)\n",
    "\n",
    "    min_x = min(c[0] for c in all_coords) - 1\n",
    "    max_x = max(c[0] for c in all_coords) + 2\n",
    "    min_y = min(c[1] for c in all_coords) - 1\n",
    "    max_y = max(c[1] for c in all_coords) + 2\n",
    "\n",
    "    ax.set_xlim(min_x, max_x)\n",
    "    ax.set_ylim(min_y, max_y)\n",
    "    ax.set_xticks(range(int(min_x), int(max_x)))\n",
    "    ax.set_yticks(range(int(min_y), int(max_y)))\n",
    "    ax.grid(True)\n",
    "    ax.set_title(\"Tree of Spatially Arranged Cells\")\n",
    "    plt.xlabel(\"X Coordinate\")\n",
    "    plt.ylabel(\"Y Coordinate\")\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "H_G5T_TQcnuh"
   },
   "source": [
    "**Exercise.** Improve the code offered by Gemini. There are two problems. First. The Python editor finds an error in relation with the rectangle, and the graphic has two  superimposed messages.\n",
    ">\n",
    "> *Answer.*  The following program reproduces the previous code but solves the problem with the rectangle and with the superposition of messages in the graphic. The problem with the rectangle was solved by importing the Rectangle not from `matplotlib directly`, but from a sublibrary, `patches`. The problem of rewriting was due to the fact that the grandchild occupies the same square as the mother. So, such possibility was excluded."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "wLvTHaMJdS7U"
   },
   "outputs": [],
   "source": [
    "# Program tree_directs_morphogenesis2.py\n",
    "# Extends the tree class to include spatial coordinates\n",
    "# for squares and generates children in random neighboring squares,\n",
    "# complete with a graphical representation.\n",
    "# By Gemini and with the help of Google.\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "\n",
    "# Building upon the previous TreeNode classes, let's create a SpatialTreeNode\n",
    "class SpatialTreeNode2:\n",
    "    def __init__(self, value, x, y):\n",
    "        self.value = value # name\n",
    "        self.x = x #x-coordinate of the anchor corner\n",
    "        self.y = y #y-coordinate of the anchor corner\n",
    "        self.children = []\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode2):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        # Iterate through all 9 possible combinations (including self)\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue  # Exclude the current square itself\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    # Traverse the tree and collect all coordinates\n",
    "    def collect_coords(self):\n",
    "        all_coords = []\n",
    "        all_coords.append((self.x, self.y))\n",
    "        for child in self.children:\n",
    "            all_coords.extend(child.collect_coords())\n",
    "        return all_coords\n",
    "\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "        # Populated squares must be excluded\n",
    "        all_coords = self.collect_coords()\n",
    "        print(f\"All coordinates: {all_coords}\")\n",
    "        available_neighbors = [coord for coord in coordinates_neighbors if coord not in all_coords]\n",
    "        print(f\"Available neighbors: {available_neighbors}\")\n",
    "        if not available_neighbors:\n",
    "            print(f\"No available neighbors for {self.value} at ({self.x},{self.y})\")\n",
    "            return None\n",
    "\n",
    "        # Choose a random neighbor\n",
    "        nx, ny = random.choice(available_neighbors)\n",
    "\n",
    "        # Create a new child node with the chosen coordinates\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        child_node = SpatialTreeNode2(child_value, nx, ny)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode(value={self.value}, x={self.x}, y={self.y}, children={[child.value for child in self.children]}\"\n",
    "\n",
    "    def update_value(self, new_value):\n",
    "        self.value = new_value\n",
    "\n",
    "# Example Usage with Graphics\n",
    "if __name__ == \"__main__\":\n",
    "    # Create a root node (mother cell) at (0,0)\n",
    "    root_cell = SpatialTreeNode2(\"Mother Cell\", 0, 0)\n",
    "    print(f\"Root Cell: {root_cell}\")\n",
    "\n",
    "    # Simulate cell division: Mother cell stays, child moves to a random neighbor\n",
    "    child1 = root_cell.add_child_in_random_neighbor(\"Child\")\n",
    "    if child1:\n",
    "        print(f\"First Child: {child1}\")\n",
    "\n",
    "    # Another division from the root\n",
    "    child2 = root_cell.add_child_in_random_neighbor(\"Child\")\n",
    "    if child2:\n",
    "        print(f\"Second Child: {child2}\")\n",
    "\n",
    "    # A child can also divide\n",
    "    if child1:\n",
    "        grandchild1_1 = child1.add_child_in_random_neighbor(\"Grandchild\")\n",
    "        if grandchild1_1:\n",
    "            print(f\"Grandchild from Child1: {grandchild1_1}\")\n",
    "\n",
    "    # Plotting the squares\n",
    "    fig, ax = plt.subplots(figsize=(8, 8))\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "\n",
    "    # Function to draw a square\n",
    "    def draw_square2(ax, x, y, color='blue', alpha=0.7, label=None):\n",
    "        # Correction by Google + corresponding import\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=1)\n",
    "        ax.add_patch(rect)\n",
    "        if label:\n",
    "            ax.text(x + 0.5, y + 0.5, label, ha='center', va='center', color='white', fontsize=8)\n",
    "\n",
    "    # Function to recursively draw the tree nodes\n",
    "    def plot_tree_nodes2(node, ax):\n",
    "        draw_square2(ax, node.x, node.y, color='skyblue', label=node.value)\n",
    "        for child in node.children:\n",
    "            draw_square2(ax, child.x, child.y, color='lightcoral', label=child.value)\n",
    "            # Draw a line connecting parent to child (from center of squares)\n",
    "            ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--')\n",
    "            plot_tree_nodes2(child, ax) # Recursively plot children\n",
    "\n",
    "    plot_tree_nodes2(root_cell, ax)\n",
    "\n",
    "    # Set plot limits based on the occupied squares\n",
    "    all_coords = []\n",
    "    def collect_coords2(node):\n",
    "        all_coords.append((node.x, node.y))\n",
    "        for child in node.children:\n",
    "            collect_coords2(child)\n",
    "\n",
    "    collect_coords2(root_cell)\n",
    "\n",
    "    min_x = min(c[0] for c in all_coords) - 1\n",
    "    max_x = max(c[0] for c in all_coords) + 2\n",
    "    min_y = min(c[1] for c in all_coords) - 1\n",
    "    max_y = max(c[1] for c in all_coords) + 2\n",
    "\n",
    "    ax.set_xlim(min_x, max_x)\n",
    "    ax.set_ylim(min_y, max_y)\n",
    "    ax.set_xticks(range(int(min_x), int(max_x)))\n",
    "    ax.set_yticks(range(int(min_y), int(max_y)))\n",
    "    ax.grid(True)\n",
    "    ax.set_title(\"Tree of Spatially Arranged Cells\")\n",
    "    plt.xlabel(\"X Coordinate\")\n",
    "    plt.ylabel(\"Y Coordinate\")\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "hsJN-CJ77Jw2"
   },
   "source": [
    "**Exercise.** Play with the previous code to determine whether it is correct.\n",
    ">\n",
    ">*Answer.* The code is not correct because a square is sometimes occupied by two nodes. This cannot be because two cells in a biological tissue always occupy different spatial regions.\n",
    "\n",
    "**Exercise.** Correct the problem of the superposition of cells.\n",
    ">\n",
    "> *Answer.* The problem of the superposition of cells is due to the fact that the addresses of occupied cells are not correctly collected.  So, we asked Gemini:\n",
    ">\n",
    "> Example of traversing the tree to collect all coordinates.\n",
    ">\n",
    "> Gemini developed the following example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "WicQxi6yf-lU"
   },
   "outputs": [],
   "source": [
    "# Program traversing_the_tree.py\n",
    "# Example of traversing the tree to collect all coordinates\n",
    "# By Gemini\n",
    "\n",
    "import random\n",
    "\n",
    "class SpatialTreeNode3:\n",
    "    def __init__(self, value, x, y):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode3):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def collect_coords(self):\n",
    "        all_coords = [(self.x, self.y)]\n",
    "        for child in self.children:\n",
    "            all_coords.extend(child.collect_coords())\n",
    "        return all_coords\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "        # To prevent duplicates in this example, we'll quickly collect existing coords\n",
    "        # In a full run, collect_coords would be called from the root.\n",
    "        existing_coords = set(self.collect_coords())\n",
    "        available_neighbors = [coord for coord in coordinates_neighbors if coord not in existing_coords]\n",
    "\n",
    "        if not available_neighbors:\n",
    "            print(f\"No available neighbors for {self.value} at ({self.x},{self.y})\")\n",
    "            return None\n",
    "\n",
    "        nx, ny = random.choice(available_neighbors)\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        child_node = SpatialTreeNode3(child_value, nx, ny)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode(value={self.value}, x={self.x}, y={self.y}, children={[child.value for child in self.children]})\"\n",
    "\n",
    "# Example of traversing the tree to collect all coordinates\n",
    "\n",
    "# Create a root node\n",
    "root_cell = SpatialTreeNode3(\"Root\", 0, 0)\n",
    "\n",
    "# Add some children and grandchildren to demonstrate traversal\n",
    "child_a = SpatialTreeNode3(\"Child A\", 1, 0)\n",
    "root_cell.add_child(child_a)\n",
    "\n",
    "child_b = SpatialTreeNode3(\"Child B\", 0, 1)\n",
    "root_cell.add_child(child_b)\n",
    "\n",
    "grandchild_a1 = SpatialTreeNode3(\"Grandchild A1\", 2, 0)\n",
    "child_a.add_child(grandchild_a1)\n",
    "\n",
    "grandchild_b1 = SpatialTreeNode3(\"Grandchild B1\", -1, 1)\n",
    "child_b.add_child(grandchild_b1)\n",
    "\n",
    "grandgrandchild_a11 = SpatialTreeNode3(\"Grandgrandchild A11\", 3, 0)\n",
    "grandchild_a1.add_child(grandgrandchild_a11)\n",
    "\n",
    "print(f\"Tree structure:\\n{root_cell}\")\n",
    "print(f\"  Children of Root: {[c for c in root_cell.children]}\")\n",
    "print(f\"  Children of Child A: {[c for c in child_a.children]}\")\n",
    "print(f\"  Children of Child B: {[c for c in child_b.children]}\")\n",
    "print(f\"  Children of Grandchild A1: {[c for c in grandchild_a1.children]}\")\n",
    "print(f\"  Children of Grandchild B1: {[c for c in grandchild_b1.children]}\")\n",
    "\n",
    "# Collect all coordinates using the collect_coords method\n",
    "all_node_coordinates = root_cell.collect_coords()\n",
    "print(f\"\\nAll collected coordinates: {all_node_coordinates}\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "1UhRk_ZvnYtr"
   },
   "source": [
    "**Exercise.** Play with the code to see whether it resolves the problem of the superposition of cells. Observe the code to find the changes.\n",
    ">\n",
    "> *Answer.* We ran the program and it looked OK. Next we added a grandgrandchild_a11, and we found no trouble. So, we decided that it is OK. The code has two changes. First: coordinates were collected not into an array but into a set to automatically delete duplicates. Second: the method that collects all the coordinates remained unchanged, but now it is called from the root_cell, in line 83.\n",
    "\n",
    "**Exercise.** Incorporate the observed changes into the overall program that connects trees to squares in the plane.\n",
    ">\n",
    "> *Answer.* We tried to do that, but we failed. We noticed that the accounting procedure of collecting occupied cells could be solved by deletion of the method `collect_coords`and by adding the coordinates of each cell just after its creation. So, we asked Gemini:\n",
    ">\n",
    ">> Delete `collect_coords` and, instead, collect coordinates of occupied cells just after the creation of each node.\n",
    ">\n",
    "> Gemini answered:\n",
    ">>\n",
    ">> Okay, I will modify the code to remove the `collect_coords` method and instead manage a global set of occupied coordinates, updating it each time a new node is created. This ensures consistency and avoids redundant traversals.\n",
    ">>\n",
    ">> The code runs successfully. The root cell was created at (0,0), and it successfully added children and a grandchild in unique neighboring coordinates. A plot visualizing the tree structure was also generated. The problem of cell superposition has been addressed by maintaining a global set of occupied coordinates. The code follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "R-bYHK5Lqcgs"
   },
   "outputs": [],
   "source": [
    "# Program tree_directs_morphogenesis4.py\n",
    "# Extends the tree class to include spatial coordinates\n",
    "# for squares and generates children in random neighboring squares,\n",
    "# complete with a graphical representation.\n",
    "# By Gemini and with the help of Google.\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "from numpy import array as Array\n",
    "\n",
    "# Global set to store all occupied coordinates\n",
    "occupied_coords = set()\n",
    "\n",
    "# Building upon the previous TreeNode classes, let's create a SpatialTreeNode\n",
    "\n",
    "class SpatialTreeNode4:\n",
    "    def __init__(self, value, x, y):\n",
    "        self.value = value # name\n",
    "        self.x = x #x-coordinate of the anchor corner\n",
    "        self.y = y #y-coordinate of the anchor corner\n",
    "        self.children = []\n",
    "        global occupied_coords\n",
    "        occupied_coords.add((x, y)) # Add current node's coordinates to the global set\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode4):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode4\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        # Iterate through all 9 possible combinations (including self)\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue  # Exclude the current square itself\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    # Removed collect_coords method as per user request\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "        # Use the global occupied_coords set to prevent duplicates\n",
    "        global occupied_coords\n",
    "        available_neighbors = [coord for coord in coordinates_neighbors if coord not in occupied_coords]\n",
    "\n",
    "        if not available_neighbors:\n",
    "            print(f\"No available neighbors for {self.value} at ({self.x},{self.y})\")\n",
    "            return None\n",
    "\n",
    "        nx, ny = random.choice(available_neighbors)\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        child_node = SpatialTreeNode4(child_value, nx, ny)\n",
    "        self.add_child(child_node)\n",
    "        # The child's coordinates are added to occupied_coords in its __init__ method\n",
    "        return child_node\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode(value={self.value}, x={self.x}, y={self.y}, children={[child.value for child in self.children]})\"\n",
    "\n",
    "    def update_value(self, new_value):\n",
    "        self.value = new_value\n",
    "\n",
    "# Example Usage with Graphics\n",
    "if __name__ == \"__main__\":\n",
    "    # Clear global occupied_coords for each run in case of repeated execution\n",
    "    occupied_coords.clear()\n",
    "\n",
    "    # Create a root node (mother cell) at (0,0)\n",
    "    root_cell = SpatialTreeNode4(\"Mother Cell\", 0, 0)\n",
    "    print(f\"Root Cell: {root_cell}\")\n",
    "\n",
    "    # Simulate cell division: Mother cell stays, child moves to a random neighbor\n",
    "    child1 = root_cell.add_child_in_random_neighbor(\"Child\")\n",
    "    if child1:\n",
    "        print(f\"First Child: {child1}\")\n",
    "\n",
    "    # Another division from the root\n",
    "    child2 = root_cell.add_child_in_random_neighbor(\"Child\")\n",
    "    if child2:\n",
    "        print(f\"Second Child: {child2}\")\n",
    "\n",
    "    # A child can also divide\n",
    "    if child1:\n",
    "        grandchild1_1 = child1.add_child_in_random_neighbor(\"Grandchild\")\n",
    "        if grandchild1_1:\n",
    "            print(f\"Grandchild from Child1: {grandchild1_1}\")\n",
    "\n",
    "    # Plotting the squares\n",
    "    fig, ax = plt.subplots(figsize=(8, 8))\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "\n",
    "    # Function to draw a square\n",
    "    def draw_square4(ax, x, y, color='blue', alpha=0.7, label=None):\n",
    "        # Correction by Google + corresponding import\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=1)\n",
    "        ax.add_patch(rect)\n",
    "        if label:\n",
    "            ax.text(x + 0.5, y + 0.5, label, ha='center', va='center', color='white', fontsize=8)\n",
    "\n",
    "    # Function to recursively draw the tree nodes\n",
    "    def plot_tree_nodes4(node, ax):\n",
    "        draw_square4(ax, node.x, node.y, color='skyblue', label=node.value)\n",
    "        for child in node.children:\n",
    "            draw_square4(ax, child.x, child.y, color='lightcoral', label=child.value)\n",
    "            # Draw a line connecting parent to child (from center of squares)\n",
    "            ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--')\n",
    "            plot_tree_nodes4(child, ax) # Recursively plot children\n",
    "\n",
    "    plot_tree_nodes4(root_cell, ax)\n",
    "\n",
    "    # Set plot limits based on the global occupied_coords set\n",
    "    if occupied_coords:\n",
    "        all_current_coords_list = list(occupied_coords)\n",
    "        all_current_coords_array = Array(all_current_coords_list)\n",
    "\n",
    "        min_x = min(c[0] for c in all_current_coords_array) - 1\n",
    "        max_x = max(c[0] for c in all_current_coords_array) + 2\n",
    "        min_y = min(c[1] for c in all_current_coords_array) - 1\n",
    "        max_y = max(c[1] for c in all_current_coords_array) + 2\n",
    "\n",
    "        ax.set_xlim(min_x, max_x)\n",
    "        ax.set_ylim(min_y, max_y)\n",
    "        ax.set_xticks(range(int(min_x), int(max_x)))\n",
    "        ax.set_yticks(range(int(min_y), int(max_y)))\n",
    "    else:\n",
    "        ax.set_xlim(-2, 2) # Default limits if no coordinates\n",
    "        ax.set_ylim(-2, 2)\n",
    "\n",
    "    ax.grid(True)\n",
    "    ax.set_title(\"Tree of Spatially Arranged Cells\")\n",
    "    plt.xlabel(\"X Coordinate\")\n",
    "    plt.ylabel(\"Y Coordinate\")\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "AfI5q-Osxzpm"
   },
   "source": [
    "**Exercise.** Play with the code to see whether it is correct. Detect the changes to the programming.\n",
    ">\n",
    "> *Answer.* We ran the program more than 10 times and no error was detected. We agreed with Gemini that it is OK. Observed changes:\n",
    ">\n",
    ">> The coordinates of occupied cells were kept in a set that was declared outside the class `SpatialTreeNode4` as `occupied_coords`, line 14. It is updated automatically in the instant of creation of a node, line 25. It is called as global in line 47. It is deleted from available coordinates in line 48. It is used to define the limits of the graphic in line 116.\n",
    "\n",
    "For the study of Evolution we need to extend the previous program to cover arbitrary random trees.\n",
    "\n",
    "**Exercise.** Extend the previous program to cover random trees with arbitrary depth and number of children. We gave this task to Gemini and its answer was:\n",
    ">\n",
    "> Certainly! I will extend the program to generate random spatial trees with arbitrary depth and number of children. This will involve creating a new class `SpatialTreeNode5` and a recursive function to build the tree, ensuring that no cells overlap by utilizing the global `occupied_coords` set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "CPuK0xfu5JNu"
   },
   "outputs": [],
   "source": [
    "# Program random_spatial_tree5.py\n",
    "# Extends the tree class to include spatial coordinates for squares\n",
    "# and generates children in random neighboring squares, complete with a graphical representation.\n",
    "# It creates random trees with arbitrary depth and number of children.\n",
    "# By Gemini and with the help of Google.\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "from numpy import array as Array\n",
    "\n",
    "# Global set to store all occupied coordinates. This will be cleared before each tree generation.\n",
    "occupied_coords = set()\n",
    "\n",
    "class SpatialTreeNode5:\n",
    "    def __init__(self, value, x, y):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "        global occupied_coords\n",
    "        # Add current node's coordinates to the global set upon creation\n",
    "        occupied_coords.add((x, y))\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode5):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode5\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue  # Exclude the current square itself\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "        global occupied_coords\n",
    "        available_neighbors = [coord for coord in coordinates_neighbors if coord not in occupied_coords]\n",
    "\n",
    "        if not available_neighbors:\n",
    "            # print(f\"No available neighbors for {self.value} at ({self.x},{self.y})\")\n",
    "            return None\n",
    "\n",
    "        nx, ny = random.choice(available_neighbors)\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        # Create a new child node, its coordinates will be added to occupied_coords in its __init__\n",
    "        child_node = SpatialTreeNode5(child_value, nx, ny)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode5(value={self.value}, x={self.x}, y={self.y}, children={[child.value for child in self.children]})\"\n",
    "\n",
    "    def update_value(self, new_value):\n",
    "        self.value = new_value\n",
    "\n",
    "def generate_random_spatial_tree5(max_depth, max_children, current_depth=0, parent_node=None, node_prefix=\"Cell\"):\n",
    "    \"\"\"\n",
    "    Generates a random spatial tree using the SpatialTreeNode5 class.\n",
    "\n",
    "    Args:\n",
    "        max_depth (int): The maximum depth of the tree.\n",
    "        max_children (int): The maximum number of children a node can have.\n",
    "        current_depth (int): The current depth of the node being created (for internal use).\n",
    "        parent_node (SpatialTreeNode5, optional): The parent node to which new children will be added.\n",
    "                                                 If None, a root node is created at (0,0).\n",
    "        node_prefix (str): A prefix for the node values.\n",
    "\n",
    "    Returns:\n",
    "        SpatialTreeNode5: The root of the randomly generated tree.\n",
    "    \"\"\"\n",
    "    if parent_node is None:\n",
    "        # Create the root node at (0,0) if it's the initial call\n",
    "        node_value = f\"{node_prefix}_Root_{random.randint(0, 99)}\"\n",
    "        current_node = SpatialTreeNode5(node_value, 0, 0)\n",
    "    else:\n",
    "        # For children, the parent_node will attempt to add a child in a random neighbor\n",
    "        current_node = parent_node.add_child_in_random_neighbor(f\"{node_prefix}_{current_depth}\")\n",
    "        if current_node is None: # No available neighbors, terminate this branch\n",
    "            return None\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        num_children = random.randint(0, max_children) # Random number of children for this node\n",
    "        for _ in range(num_children):\n",
    "            # Recursively call for children, passing the current node as parent\n",
    "            generate_random_spatial_tree5(max_depth, max_children, current_depth + 1, current_node, node_prefix)\n",
    "\n",
    "    return current_node # Return the created node (root or child)\n",
    "\n",
    "def print_spatial_tree5(node, level=0):\n",
    "    \"\"\"\n",
    "    Helper function to print the spatial tree structure with coordinates.\n",
    "    \"\"\"\n",
    "    if node is None: # Handle cases where add_child_in_random_neighbor returns None\n",
    "        return\n",
    "    indent = \"  \" * level\n",
    "    print(f\"{indent}- {node.value} ({node.x},{node.y})\")\n",
    "    for child in node.children:\n",
    "        print_spatial_tree5(child, level + 1)\n",
    "\n",
    "# --- Plotting functions (reused from previous examples) ---\n",
    "def draw_square5(ax, x, y, color='blue', alpha=0.7, label=None):\n",
    "    rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=1)\n",
    "    ax.add_patch(rect)\n",
    "    if label:\n",
    "        ax.text(x + 0.5, y + 0.5, label, ha='center', va='center', color='white', fontsize=8)\n",
    "\n",
    "def plot_tree_nodes5(node, ax, root_color='skyblue', child_color='lightcoral'):\n",
    "    if node is None: # Handle cases where the tree generation might return None\n",
    "        return\n",
    "    # Plot the current node\n",
    "    draw_square5(ax, node.x, node.y, color=root_color if node.value.startswith('Cell_Root') else child_color, label=node.value)\n",
    "    # Recursively plot children and draw lines\n",
    "    for child in node.children:\n",
    "        # Draw a line connecting parent to child (from center of squares)\n",
    "        ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--')\n",
    "        plot_tree_nodes5(child, ax, root_color, child_color) # Recursive call for children\n",
    "\n",
    "\n",
    "# --- Example Usage with Random Spatial Tree ---\n",
    "if __name__ == \"__main__\":\n",
    "    # Clear global occupied_coords for each run\n",
    "    occupied_coords.clear()\n",
    "\n",
    "    # Parameters for random tree generation\n",
    "    MAX_DEPTH = 3\n",
    "    MAX_CHILDREN_PER_NODE = 2\n",
    "\n",
    "    print(f\"Generating a random spatial tree with max_depth={MAX_DEPTH}, max_children_per_node={MAX_CHILDREN_PER_NODE}\")\n",
    "    random_spatial_tree_root = generate_random_spatial_tree5(max_depth=MAX_DEPTH, max_children=MAX_CHILDREN_PER_NODE)\n",
    "\n",
    "    if random_spatial_tree_root:\n",
    "        print(\"\\nGenerated Random Spatial Tree Structure:\")\n",
    "        print_spatial_tree5(random_spatial_tree_root)\n",
    "\n",
    "        # Plotting the squares\n",
    "        fig, ax = plt.subplots(figsize=(8, 8))\n",
    "        ax.set_aspect('equal', adjustable='box')\n",
    "\n",
    "        plot_tree_nodes5(random_spatial_tree_root, ax)\n",
    "\n",
    "        # Set plot limits based on the global occupied_coords set\n",
    "        if occupied_coords:\n",
    "            all_current_coords_list = list(occupied_coords)\n",
    "            all_current_coords_array = Array(all_current_coords_list)\n",
    "\n",
    "            min_x = min(c[0] for c in all_current_coords_array) - 1\n",
    "            max_x = max(c[0] for c in all_current_coords_array) + 2\n",
    "            min_y = min(c[1] for c in all_current_coords_array) - 1\n",
    "            max_y = max(c[1] for c in all_current_coords_array) + 2\n",
    "\n",
    "            ax.set_xlim(min_x, max_x)\n",
    "            ax.set_ylim(min_y, max_y)\n",
    "            ax.set_xticks(range(int(min_x), int(max_x)))\n",
    "            ax.set_yticks(range(int(min_y), int(max_y)))\n",
    "        else:\n",
    "            ax.set_xlim(-2, 2) # Default limits if no coordinates were added\n",
    "            ax.set_ylim(-2, 2)\n",
    "\n",
    "        ax.grid(True)\n",
    "        ax.set_title(\"Random Tree of Spatially Arranged Cells\")\n",
    "        plt.xlabel(\"X Coordinate\")\n",
    "        plt.ylabel(\"Y Coordinate\")\n",
    "        plt.show()\n",
    "    else:\n",
    "        print(\"Could not generate a spatial tree (e.g., no available neighbors for the root).\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "lS8S6WXb5xes"
   },
   "source": [
    "**Challenge.** Play with the code to verify that it is OK.\n",
    "\n",
    "We already know how to generate random morphological or spatial trees. This allows us to begin our study of Evolution, which begins with the generation of a population of trees generated at random."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "uAAt7XIE_6q-"
   },
   "source": [
    "# SIMULATION OF EVOLUTION OF 2D SPATIAL TREES\n",
    "\n",
    "Evolution and morphological trees are connected as follows:\n",
    "\n",
    "Forms in Biology are, in general, not capricious. Instead, they fulfill a mission, a function. For instance, my skull protects my brain, and my spherical end of the humerus in the shoulder allows me to move my arm in almost any direction. According to the Evolutionary Theory, these and all structures appeared by Evolution, in which a function would have appeared and won in the battle for being passed to the next generation. In that way and with the passing of generations, perfection resulted as a duty of nature. If we look at the mechanism behind morphogenesis, we have:\n",
    "\n",
    "All organisms are formed from one single cell, that for mammals is the zygote. This cell fires a reproductive process, depicted by a tree, that ends in the corresponding form. Our bet is therefore: reproductive trees give rise to morphological patterns. This amounts to a **prediction: Morphological trees must be encoded as part of the genome and being transmitted from parents to offspring**.\n",
    "\n",
    "We already know how to produce individual morphological trees in 2D. For the study of Evolution we need a population of arbitrary trees.\n",
    "\n",
    "**Exercise.** Develop the code to synthesize a population of random trees that determine a morphological pattern in the plane. We asked Gemini for help, and it inserted its proposal in the next subsection."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Ts2qaB4gAIzO"
   },
   "source": [
    "### Generating a Population of Random Spatial Trees\n",
    "\n",
    "To create a population of trees, we need to modify the `SpatialTreeNode` class and the tree generation function slightly. Each tree in the population should be generated independently, occupying its own space without overlapping with other nodes *within the same tree*. However, when plotting the entire population, we'll collect all coordinates to ensure the plot limits encompass all trees.\n",
    "\n",
    "We'll introduce a new global set, `overall_occupied_coords_for_plotting`, to collect all coordinates from all trees for the final plot limits. Each individual tree generation will use a `local_occupied_set` to manage its own space. The `SpatialTreeNode`'s `__init__` method will update both the local and the global sets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "9806c644"
   },
   "outputs": [],
   "source": [
    "# Program random_spatial_tree_population.py\n",
    "# Generates a population of random spatial trees.\n",
    "# The entire population is plotted.\n",
    "# By Gemini.\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "from numpy import array as Array\n",
    "\n",
    "# Global set to store all occupied coordinates from ALL trees for overall plot limits\n",
    "overall_occupied_coords_for_plotting = set()\n",
    "\n",
    "class SpatialTreeNode6:\n",
    "    def __init__(self, value, x, y, local_occupied_set):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "        # Add current node's coordinates to its local set upon creation\n",
    "        local_occupied_set.add((x, y))\n",
    "        # Also add to the global set for plotting the entire population\n",
    "        overall_occupied_coords_for_plotting.add((x, y))\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode6):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue  # Exclude the current square itself\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix, local_occupied_set):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "        available_neighbors = [coord for coord in coordinates_neighbors if coord not in local_occupied_set]\n",
    "\n",
    "        if not available_neighbors:\n",
    "            return None\n",
    "\n",
    "        nx, ny = random.choice(available_neighbors)\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        # Pass the local_occupied_set to the child when creating it\n",
    "        child_node = SpatialTreeNode6(child_value, nx, ny, local_occupied_set)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode(value={self.value}, x={self.x}, y={self.y}, children={[child.value for child in self.children]})\"\n",
    "\n",
    "    def update_value(self, new_value):\n",
    "        self.value = new_value\n",
    "\n",
    "def generate_random_spatial_tree6(max_depth, max_children, current_depth=0, parent_node=None, node_prefix=\"Cell\", local_occupied_set=None):\n",
    "    \"\"\"\n",
    "    Generates a random spatial tree using the SpatialTreeNode class.\n",
    "    Each tree generation uses a local_occupied_set to prevent self-overlap within the tree.\n",
    "\n",
    "    Args:\n",
    "        max_depth (int): The maximum depth of the tree.\n",
    "        max_children (int): The maximum number of children a node can have.\n",
    "        current_depth (int): The current depth of the node being created (for internal use).\n",
    "        parent_node (SpatialTreeNode, optional): The parent node to which new children will be added.\n",
    "                                                 If None, a root node is created at (0,0).\n",
    "        node_prefix (str): A prefix for the node values.\n",
    "        local_occupied_set (set, optional): A set tracking occupied coordinates for the current tree generation.\n",
    "                                          If None, a new set is initialized for the root.\n",
    "\n",
    "    Returns:\n",
    "        SpatialTreeNode: The root of the randomly generated tree.\n",
    "    \"\"\"\n",
    "    if local_occupied_set is None:\n",
    "        local_occupied_set = set() # Initialize a new set for this tree's generation\n",
    "\n",
    "    if parent_node is None:\n",
    "        # Create the root node at (0,0) if it's the initial call\n",
    "        node_value = f\"{node_prefix}_Root_{random.randint(0, 99)}\"\n",
    "        current_node = SpatialTreeNode6(node_value, 0, 0, local_occupied_set)\n",
    "    else:\n",
    "        # For children, the parent_node will attempt to add a child in a random neighbor\n",
    "        current_node = parent_node.add_child_in_random_neighbor(f\"{node_prefix}_{current_depth}\", local_occupied_set)\n",
    "        if current_node is None: # No available neighbors, terminate this branch\n",
    "            return None\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        num_children = random.randint(0, max_children) # Random number of children for this node\n",
    "        for _ in range(num_children):\n",
    "            # Recursively call for children, passing the current node as parent and the local_occupied_set\n",
    "            generate_random_spatial_tree6(max_depth, max_children, current_depth + 1, current_node, node_prefix, local_occupied_set)\n",
    "\n",
    "    return current_node # Return the created node (root or child)\n",
    "\n",
    "def print_spatial_tree6(node, level=0):\n",
    "    \"\"\"\n",
    "    Helper function to print the spatial tree structure with coordinates.\n",
    "    \"\"\"\n",
    "    if node is None:\n",
    "        return\n",
    "    indent = \"  \" * level\n",
    "    print(f\"{indent}- {node.value} ({node.x},{node.y})\")\n",
    "    for child in node.children:\n",
    "        print_spatial_tree6(child, level + 1)\n",
    "\n",
    "# --- Plotting functions (reused and slightly adapted from previous examples) ---\n",
    "def draw_square6(ax, x, y, color='blue', alpha=0.7, label=None):\n",
    "    rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=1)\n",
    "    ax.add_patch(rect)\n",
    "    if label:\n",
    "        ax.text(x + 0.5, y + 0.5, label, ha='center', va='center', color='white', fontsize=8)\n",
    "\n",
    "def plot_tree_nodes6(node, ax, root_color='skyblue', child_color='lightcoral'):\n",
    "    if node is None:\n",
    "        return\n",
    "    # Plot the current node\n",
    "    draw_square6(ax, node.x, node.y, color=root_color if \"Root\" in node.value else child_color, label=node.value)\n",
    "    # Recursively plot children and draw lines\n",
    "    for child in node.children:\n",
    "        # Draw a line connecting parent to child (from center of squares)\n",
    "        ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--')\n",
    "        plot_tree_nodes6(child, ax, root_color, child_color) # Recursive call for children\n",
    "\n",
    "\n",
    "# --- Example Usage: Generating a Population of Random Spatial Trees ---\n",
    "if __name__ == \"__main__\":\n",
    "    # Clear the global occupied_coords set before generating the entire population\n",
    "    overall_occupied_coords_for_plotting.clear()\n",
    "\n",
    "    # Parameters for population and random tree generation\n",
    "    POPULATION_SIZE = 5\n",
    "    MAX_DEPTH_PER_TREE = 3\n",
    "    MAX_CHILDREN_PER_NODE = 2\n",
    "\n",
    "    tree_population = []\n",
    "    print(f\"Generating a population of {POPULATION_SIZE} random spatial trees:\")\n",
    "\n",
    "    for i in range(POPULATION_SIZE):\n",
    "        print(f\"\\n--- Generating Tree {i+1} ---\")\n",
    "        # Each tree generation starts with its own local_occupied_set to prevent self-overlap within itself\n",
    "        # The overall_occupied_coords_for_plotting will gather all coords from all trees.\n",
    "        random_tree_root = generate_random_spatial_tree6(\n",
    "            max_depth=MAX_DEPTH_PER_TREE,\n",
    "            max_children=MAX_CHILDREN_PER_NODE,\n",
    "            node_prefix=f\"Tree{i+1}_Cell\"\n",
    "        )\n",
    "\n",
    "        if random_tree_root:\n",
    "            tree_population.append(random_tree_root)\n",
    "            print_spatial_tree6(random_tree_root)\n",
    "        else:\n",
    "            print(f\"Could not generate Tree {i+1} (e.g., no available neighbors for its root).\")\n",
    "\n",
    "    # Plotting the entire population\n",
    "    if tree_population:\n",
    "        fig, ax = plt.subplots(figsize=(10, 10))\n",
    "        ax.set_aspect('equal', adjustable='box')\n",
    "\n",
    "        for tree_root in tree_population:\n",
    "            plot_tree_nodes6(tree_root, ax)\n",
    "\n",
    "        # Set plot limits based on the accumulated overall_occupied_coords_for_plotting\n",
    "        if overall_occupied_coords_for_plotting:\n",
    "            all_coords_list = list(overall_occupied_coords_for_plotting)\n",
    "            all_coords_array = Array(all_coords_list)\n",
    "\n",
    "            min_x = min(c[0] for c in all_coords_array) - 2 # Add some padding\n",
    "            max_x = max(c[0] for c in all_coords_array) + 3 # Add some padding\n",
    "            min_y = min(c[1] for c in all_coords_array) - 2\n",
    "            max_y = max(c[1] for c in all_coords_array) + 3\n",
    "\n",
    "            ax.set_xlim(min_x, max_x)\n",
    "            ax.set_ylim(min_y, max_y)\n",
    "            ax.set_xticks(range(int(min_x), int(max_x)))\n",
    "            ax.set_yticks(range(int(min_y), int(max_y)))\n",
    "        else:\n",
    "            ax.set_xlim(-5, 5)\n",
    "            ax.set_ylim(-5, 5)\n",
    "\n",
    "        ax.grid(True)\n",
    "        ax.set_title(f\"Population of {POPULATION_SIZE} Random Spatial Trees\")\n",
    "        plt.xlabel(\"X Coordinate\")\n",
    "        plt.ylabel(\"Y Coordinate\")\n",
    "        plt.show()\n",
    "    else:\n",
    "        print(\"No trees were successfully generated to plot.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "zJf6Qrc_3TbS"
   },
   "source": [
    "**Exercise.** Run the code to see what it does.\n",
    ">\n",
    "> *Answer.* The program produced a superposition of all cells that were created by all trees.\n",
    "\n",
    "**Exercise.** Modify the previous program so that each tree have its own collection of addresses from the occupied squares. Make a draw of the morphological pattern generated by only one tree that is chosen at random.\n",
    ">\n",
    "> *Answer.* Gemini offered various activities, and we selected `Modify the code to select and plot only one random tree from the population`. Its response was:\n",
    ">> I will modify the code to generate a population of random trees, but then select and plot only one of them, ensuring its plot limits are correctly set based on its own occupied cells.\n",
    ">\n",
    "> Gemini published the following code:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "8967664d"
   },
   "outputs": [],
   "source": [
    "# Program random_spatial_tree_population7.py\n",
    "# Generates a population of random spatial trees.\n",
    "# Each tree has its own set of occupancy.\n",
    "# Only one tree is plotted.\n",
    "# By Gemini.\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "from numpy import array as Array\n",
    "\n",
    "# Removed the global overall_occupied_coords_for_plotting\n",
    "\n",
    "class SpatialTreeNode7: # Renamed back to SpatialTreeNode as it's a new context\n",
    "    def __init__(self, value, x, y, local_occupied_set):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "        # Add current node's coordinates to its local set upon creation\n",
    "        local_occupied_set.add((x, y))\n",
    "        # Removed addition to overall_occupied_coords_for_plotting\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode7):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue  # Exclude the current square itself\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix, local_occupied_set):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "        available_neighbors = [coord for coord in coordinates_neighbors if coord not in local_occupied_set]\n",
    "\n",
    "        if not available_neighbors:\n",
    "            return None\n",
    "\n",
    "        nx, ny = random.choice(available_neighbors)\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        # Pass the local_occupied_set to the child when creating it\n",
    "        child_node = SpatialTreeNode7(child_value, nx, ny, local_occupied_set)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode(value={self.value}, x={self.x}, y={self.y}, children={[child.value for child in self.children]})\"\n",
    "\n",
    "    def update_value(self, new_value):\n",
    "        self.value = new_value\n",
    "\n",
    "def generate_random_spatial_tree7(max_depth, max_children, initial_x, initial_y, current_depth=0, parent_node=None, node_prefix=\"Cell\", local_occupied_set=None):\n",
    "    \"\"\"\n",
    "    Generates a random spatial tree using the SpatialTreeNode class.\n",
    "\n",
    "    Args:\n",
    "        max_depth (int): The maximum depth of the tree.\n",
    "        max_children (int): The maximum number of children a node can have.\n",
    "        initial_x (int): X-coordinate for the root node.\n",
    "        initial_y (int): Y-coordinate for the root node.\n",
    "        current_depth (int): The current depth of the node being created (for internal use).\n",
    "        parent_node (SpatialTreeNode, optional): The parent node to which new children will be added.\n",
    "                                                 If None, a root node is created at (initial_x, initial_y).\n",
    "        node_prefix (str): A prefix for the node values.\n",
    "        local_occupied_set (set, optional): A set tracking occupied coordinates for the current tree generation.\n",
    "                                          If None, a new set is initialized for the root.\n",
    "\n",
    "    Returns:\n",
    "        SpatialTreeNode: The root of the randomly generated tree.\n",
    "        set: The local_occupied_set containing all coordinates of the generated tree.\n",
    "    \"\"\"\n",
    "    if local_occupied_set is None:\n",
    "        local_occupied_set = set() # Initialize a new set for this tree's generation\n",
    "\n",
    "    if parent_node is None:\n",
    "        # Create the root node at (initial_x, initial_y) if it's the initial call\n",
    "        node_value = f\"{node_prefix}_Root_{random.randint(0, 99)}\"\n",
    "        current_node = SpatialTreeNode7(node_value, initial_x, initial_y, local_occupied_set)\n",
    "    else:\n",
    "        # For children, the parent_node will attempt to add a child in a random neighbor\n",
    "        current_node = parent_node.add_child_in_random_neighbor(f\"{node_prefix}_{current_depth}\", local_occupied_set)\n",
    "        if current_node is None: # No available neighbors, terminate this branch\n",
    "            return None, local_occupied_set # Return current set even if no child was added\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        num_children = random.randint(0, max_children) # Random number of children for this node\n",
    "        for _ in range(num_children):\n",
    "            # Recursively call for children, passing the current node as parent and the local_occupied_set\n",
    "            generate_random_spatial_tree7(max_depth, max_children, initial_x, initial_y, current_depth + 1, current_node, node_prefix, local_occupied_set)\n",
    "\n",
    "    return current_node, local_occupied_set # Return the created node (root or child) and the populated set\n",
    "\n",
    "def print_spatial_tree7(node, level=0):\n",
    "    \"\"\"\n",
    "    Helper function to print the spatial tree structure with coordinates.\n",
    "    \"\"\"\n",
    "    if node is None:\n",
    "        return\n",
    "    indent = \"  \" * level\n",
    "    print(f\"{indent}- {node.value} ({node.x},{node.y})\")\n",
    "    for child in node.children:\n",
    "        print_spatial_tree7(child, level + 1)\n",
    "\n",
    "# --- Plotting functions (reused and slightly adapted from previous examples) ---\n",
    "def draw_square7(ax, x, y, color='blue', alpha=0.7, label=None):\n",
    "    rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=1)\n",
    "    ax.add_patch(rect)\n",
    "    if label:\n",
    "        ax.text(x + 0.5, y + 0.5, label, ha='center', va='center', color='white', fontsize=8)\n",
    "\n",
    "def plot_tree_nodes7(node, ax, root_color='skyblue', child_color='lightcoral'):\n",
    "    if node is None:\n",
    "        return\n",
    "    # Plot the current node\n",
    "    draw_square7(ax, node.x, node.y, color=root_color if \"Root\" in node.value else child_color, label=node.value)\n",
    "    # Recursively plot children and draw lines\n",
    "    for child in node.children:\n",
    "        # Draw a line connecting parent to child (from center of squares)\n",
    "        ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--')\n",
    "        plot_tree_nodes7(child, ax, root_color, child_color) # Recursive call for children\n",
    "\n",
    "\n",
    "# --- Example Usage: Generating a Population and Plotting One Random Spatial Tree ---\n",
    "if __name__ == \"__main__\":\n",
    "    # Parameters for population and random tree generation\n",
    "    POPULATION_SIZE = 5\n",
    "    MAX_DEPTH_PER_TREE = 5\n",
    "    MAX_CHILDREN_PER_NODE = 2\n",
    "\n",
    "    tree_population_details = [] # To store (root_node, local_occupied_set) for each tree\n",
    "\n",
    "    print(f\"Generating a population of {POPULATION_SIZE} random spatial trees:\")\n",
    "\n",
    "    for i in range(POPULATION_SIZE):\n",
    "        # Each tree needs its own starting coordinates and local occupied set\n",
    "        start_x = i * 5 # Offset each tree's root for visual separation if needed, or keep (0,0)\n",
    "        start_y = 0\n",
    "        current_tree_occupied_coords = set() # New set for each tree\n",
    "\n",
    "        random_tree_root, final_occupied_set = generate_random_spatial_tree7(\n",
    "            max_depth=MAX_DEPTH_PER_TREE,\n",
    "            max_children=MAX_CHILDREN_PER_NODE,\n",
    "            initial_x=start_x,\n",
    "            initial_y=start_y,\n",
    "            node_prefix=f\"Tree{i+1}_Cell\",\n",
    "            local_occupied_set=current_tree_occupied_coords # Pass the new set\n",
    "        )\n",
    "\n",
    "        if random_tree_root:\n",
    "            tree_population_details.append((random_tree_root, final_occupied_set))\n",
    "            print(f\"\\n--- Generated Tree {i+1} ---\")\n",
    "            print_spatial_tree7(random_tree_root)\n",
    "        else:\n",
    "            print(f\"\\nCould not generate Tree {i+1} (e.g., no available neighbors for its root).\")\n",
    "\n",
    "    # Select and plot only one random tree from the population\n",
    "    if tree_population_details:\n",
    "        chosen_tree_root, chosen_tree_coords_set = random.choice(tree_population_details)\n",
    "        print(f\"\\n\\nPlotting a randomly selected tree (Root: {chosen_tree_root.value}):\")\n",
    "\n",
    "        fig, ax = plt.subplots(figsize=(8, 8))\n",
    "        ax.set_aspect('equal', adjustable='box')\n",
    "\n",
    "        plot_tree_nodes7(chosen_tree_root, ax)\n",
    "\n",
    "        # Set plot limits based on the chosen tree's specific occupied_coords_set\n",
    "        if chosen_tree_coords_set:\n",
    "            all_coords_list = list(chosen_tree_coords_set)\n",
    "            all_coords_array = Array(all_coords_list)\n",
    "\n",
    "            min_x = min(c[0] for c in all_coords_array) - 2 # Add some padding\n",
    "            max_x = max(c[0] for c in all_coords_array) + 3 # Add some padding\n",
    "            min_y = min(c[1] for c in all_coords_array) - 2\n",
    "            max_y = max(c[1] for c in all_coords_array) + 3\n",
    "\n",
    "            ax.set_xlim(min_x, max_x)\n",
    "            ax.set_ylim(min_y, max_y)\n",
    "            ax.set_xticks(range(int(min_x), int(max_x)))\n",
    "            ax.set_yticks(range(int(min_y), int(max_y)))\n",
    "        else:\n",
    "            ax.set_xlim(-5, 5)\n",
    "            ax.set_ylim(-5, 5)\n",
    "\n",
    "        ax.grid(True)\n",
    "        ax.set_title(f\"Single Random Spatial Tree (Root: {chosen_tree_root.value})\")\n",
    "        plt.xlabel(\"X Coordinate\")\n",
    "        plt.ylabel(\"Y Coordinate\")\n",
    "        plt.show()\n",
    "    else:\n",
    "        print(\"No trees were successfully generated to plot.\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "uV5Vny_mVbCS"
   },
   "source": [
    "**Exercise.** Play with the code to verify whether it is correct.\n",
    ">\n",
    "> *Answer.* For a maximal depth of 3, it looked good at first sight. Next, we modified the maximal depth from 3 to 5. A more complex tree with a complex spatial pattern was generated, nevertheless, after plotting in a paper the selected tree, no failure was encountered. Everything was right, and this is our opinion, so we will continue.\n",
    "\n",
    "> **Challenge.** Improve the clarity of the plotting of the previous program by changing lineal strokes by arrows, or by some indicator of direction, from the center of the mother square to the center of the child square.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "lnSfCA18FjjR"
   },
   "source": [
    "## The task for Evolution\n",
    "\n",
    "The perfectly spherical form of the end of the humerus in the shoulder, or of the femurs in the hip invites us to charge Evolution with the task of synthesizing a specific form.\n",
    "\n",
    "**The task.** We pose to Evolution the following task:\n",
    ">\n",
    "> To refill a square of length 2, then another of length 3, and so on. We measure the cost in generations of doing that for a determined population size.\n",
    "\n",
    "**Exercise.** Develop the code for the Evolution of 2D spatial trees that must refill a square of width 2, then other of length 3 and so on. Keep track of the cost of fulfilling the task for each $k$.\n",
    ">\n",
    "> *Answer.* We transmitted the task To Gemini, and it inserted its answer in the following subsection."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "18a02147"
   },
   "source": [
    "### Defining the Target Shapes and Fitness Function\n",
    "\n",
    "To begin our evolutionary simulation, we need a clear definition of the target shapes that our spatial trees will attempt to 'fill'. The task specifies squares of increasing length (e.g., length 2, then length 3). We also need a way to quantify how 'good' a particular tree is at filling a given target square. This is where a **fitness function** comes in.\n",
    "\n",
    "*Observation.* Gemini divided the great task in subtasks, but this causes troubles with the Python kernel. So, in the next program, we concatenated everything."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "H0yhSNKFJmd0"
   },
   "outputs": [],
   "source": [
    "# Program spatial_trees_evolution.py\n",
    "# A target area is defined and a random spatial tree is generated.\n",
    "# The two areas are drawn to be compared.\n",
    "# By Gemini 2.5 Flash\n",
    "\n",
    "\n",
    "# PART I: SPATIAL TREES\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "from numpy import array as Array\n",
    "\n",
    "# Reuse the SpatialTreeNode7 class from the previous exercise, or adapt it if necessary\n",
    "# For simplicity, I'll copy the necessary parts of SpatialTreeNode7 here.\n",
    "# In a real notebook, you might define it once and reuse.\n",
    "\n",
    "# Global set to store all occupied coordinates from ALL trees for overall plot limits\n",
    "# (This will be managed carefully within the evolutionary loop)\n",
    "# overall_occupied_coords_for_plotting = set() # This was for population plotting, not individual tree fitness\n",
    "\n",
    "class SpatialTreeNode_Evolution2(object):\n",
    "    def __init__(self, value, x, y, local_occupied_set):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "        local_occupied_set.add((x, y))\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode_Evolution2):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode_Evolution\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix, local_occupied_set):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "        available_neighbors = [coord for coord in coordinates_neighbors if coord not in local_occupied_set]\n",
    "\n",
    "        if not available_neighbors:\n",
    "            return None\n",
    "\n",
    "        nx, ny = random.choice(available_neighbors)\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        child_node = SpatialTreeNode_Evolution2(child_value, nx, ny, local_occupied_set)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode(value={self.value}, x={self.x}, y={self.y}, children={[child.value for child in self.children]})\"\n",
    "\n",
    "    def update_value(self, new_value):\n",
    "        self.value = new_value\n",
    "\n",
    "    # Method to collect all coordinates of the current tree\n",
    "    def collect_all_coordinates(self):\n",
    "        all_coords = set()\n",
    "        stack = [self]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            all_coords.add((node.x, node.y))\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "        return all_coords\n",
    "\n",
    "\n",
    "def generate_random_spatial_tree_evolution2(\n",
    "    max_depth, max_children, initial_x, initial_y, current_depth=0, parent_node=None, node_prefix=\"Cell\", local_occupied_set=None\n",
    "):\n",
    "    if local_occupied_set is None:\n",
    "        local_occupied_set = set() # Initialize a new set for this tree's generation\n",
    "\n",
    "    if parent_node is None:\n",
    "        node_value = f\"{node_prefix}_Root_{random.randint(0, 99)}\"\n",
    "        current_node = SpatialTreeNode_Evolution2(node_value, initial_x, initial_y, local_occupied_set)\n",
    "    else:\n",
    "        current_node = parent_node.add_child_in_random_neighbor(f\"{node_prefix}_{current_depth}\", local_occupied_set)\n",
    "        if current_node is None:\n",
    "            return None, local_occupied_set\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        num_children = random.randint(0, max_children)\n",
    "        for _ in range(num_children):\n",
    "            generate_random_spatial_tree_evolution2(\n",
    "                max_depth, max_children, initial_x, initial_y, current_depth + 1, current_node, node_prefix, local_occupied_set\n",
    "            )\n",
    "\n",
    "    return current_node, local_occupied_set\n",
    "\n",
    "\n",
    "# Helper functions for plotting\n",
    "def draw_square_evolution2(ax, x, y, color='blue', alpha=0.7, label=None):\n",
    "    rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=1)\n",
    "    ax.add_patch(rect)\n",
    "    if label:\n",
    "        ax.text(x + 0.5, y + 0.5, label, ha='center', va='center', color='white', fontsize=8)\n",
    "\n",
    "def plot_tree_nodes_evolution2(node, ax, root_color='skyblue', child_color='lightcoral'):\n",
    "    if node is None:\n",
    "        return\n",
    "    draw_square_evolution2(ax, node.x, node.y, color=root_color if \"Root\" in node.value else child_color, label=node.value)\n",
    "    for child in node.children:\n",
    "        ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--')\n",
    "        plot_tree_nodes_evolution2(child, ax, root_color, child_color)\n",
    "\n",
    "# PART II: OBJECTIVE FUNCTION AND FITNESS\n",
    "\n",
    "def generate_target_square_coords2(side_length, origin_x=0, origin_y=0):\n",
    "    \"\"\"\n",
    "    Generates a set of (x, y) coordinates representing a filled square.\n",
    "\n",
    "    Args:\n",
    "        side_length (int): The side length of the square.\n",
    "        origin_x (int): The x-coordinate of the bottom-left corner of the square.\n",
    "        origin_y (int): The y-coordinate of the bottom-left corner of the square.\n",
    "\n",
    "    Returns:\n",
    "        set: A set of (x, y) tuples representing the occupied cells of the target square.\n",
    "    \"\"\"\n",
    "    target_coords = set()\n",
    "    for x in range(origin_x, origin_x + side_length):\n",
    "        for y in range(origin_y, origin_y + side_length):\n",
    "            target_coords.add((x, y))\n",
    "    return target_coords\n",
    "\n",
    "def calculate_fitness2(tree_root, target_coords):\n",
    "    \"\"\"\n",
    "    Calculates the fitness of a spatial tree based on how well it fills a target square.\n",
    "    Fitness is higher for better matches.\n",
    "\n",
    "    Args:\n",
    "        tree_root (SpatialTreeNode_Evolution): The root of the generated spatial tree.\n",
    "        target_coords (set): A set of (x, y) tuples representing the target square.\n",
    "\n",
    "    Returns:\n",
    "        float: A fitness score. Higher is better.\n",
    "    \"\"\"\n",
    "    if tree_root is None:\n",
    "        return 0.0\n",
    "\n",
    "    tree_coords = tree_root.collect_all_coordinates()\n",
    "\n",
    "    # Calculate overlaps (correctly placed cells)\n",
    "    overlaps = len(tree_coords.intersection(target_coords))\n",
    "\n",
    "    # Calculate missing cells (cells in target but not in tree)\n",
    "    missing_cells = len(target_coords - tree_coords)\n",
    "\n",
    "    # Calculate extra cells (cells in tree but not in target)\n",
    "    extra_cells = len(tree_coords - target_coords)\n",
    "\n",
    "    # A simple fitness function: prioritize overlaps, penalize missing and extra cells\n",
    "    # You can adjust weights based on what aspects of 'filling' are most important.\n",
    "    fitness = overlaps - (missing_cells + extra_cells)\n",
    "\n",
    "    # Normalize fitness to be non-negative and potentially within a range (e.g., 0 to 1)\n",
    "    # A perfect match would have fitness = len(target_coords)\n",
    "    # The minimum possible fitness would be -len(target_coords) - a very large number of extra cells\n",
    "    max_possible_fitness = len(target_coords)\n",
    "    min_possible_fitness = -len(target_coords) - len(tree_coords) # rough estimate for worst case\n",
    "\n",
    "    # Scale to 0-1 for easier comparison in evolutionary algorithms\n",
    "    if max_possible_fitness == 0 and fitness == 0: # handle empty target\n",
    "        normalized_fitness = 1.0\n",
    "    elif max_possible_fitness == 0: # target empty, but tree not\n",
    "        normalized_fitness = 0.0\n",
    "    else:\n",
    "        normalized_fitness = (fitness + max_possible_fitness) / (2 * max_possible_fitness + extra_cells) # rudimentary normalization\n",
    "        # A simpler normalization might be just overlaps / len(target_coords) if we only care about filling without extras\n",
    "        normalized_fitness = overlaps / (len(target_coords) + extra_cells + missing_cells) # Jaccard-like index\n",
    "\n",
    "    return normalized_fitness\n",
    "\n",
    "# PART III: # Example usage:\n",
    "\n",
    "# Define a target square of length 2\n",
    "target_side_length = 2\n",
    "target_coords_s2 = generate_target_square_coords2(target_side_length, origin_x=0, origin_y=0)\n",
    "print(f\"Target Square (length {target_side_length}): {target_coords_s2}\")\n",
    "\n",
    "# Generate a random spatial tree\n",
    "# Note: local_occupied_set will be managed by generate_random_spatial_tree_evolution\n",
    "random_seed = random.randint(0, 1000)\n",
    "print(f\"Using random seed: {random_seed}\")\n",
    "random.seed(random_seed)\n",
    "\n",
    "MAX_DEPTH = 3\n",
    "MAX_CHILDREN_PER_NODE = 2\n",
    "initial_x, initial_y = 0, 0 # Start tree generation at the origin\n",
    "\n",
    "root_node, _ = generate_random_spatial_tree_evolution2(\n",
    "    max_depth=MAX_DEPTH,\n",
    "    max_children=MAX_CHILDREN_PER_NODE,\n",
    "    initial_x=initial_x,\n",
    "    initial_y=initial_y,\n",
    "    node_prefix=\"TestCell\"\n",
    ")\n",
    "\n",
    "if root_node:\n",
    "    print(\"\\nGenerated Test Tree Structure:\")\n",
    "    # print_spatial_tree_evolution(root_node) # This can be verbose for larger trees\n",
    "    tree_coordinates = root_node.collect_all_coordinates()\n",
    "    print(f\"Tree Coordinates: {tree_coordinates}\")\n",
    "\n",
    "    # Calculate fitness\n",
    "    fitness_score = calculate_fitness2(root_node, target_coords_s2)\n",
    "    print(f\"\\nFitness for target square (length {target_side_length}): {fitness_score:.4f}\")\n",
    "\n",
    "    # Plotting for visualization\n",
    "    fig, ax = plt.subplots(1, 2, figsize=(14, 7))\n",
    "    ax[0].set_aspect('equal', adjustable='box')\n",
    "    ax[1].set_aspect('equal', adjustable='box')\n",
    "\n",
    "    # Plot Target Square\n",
    "    for cx, cy in target_coords_s2:\n",
    "        draw_square_evolution2(ax[0], cx, cy, color='green', alpha=0.5, label='Target')\n",
    "    ax[0].set_title(f\"Target Square (L={target_side_length})\")\n",
    "    ax[0].grid(True)\n",
    "\n",
    "    # Plot Generated Tree\n",
    "    plot_tree_nodes_evolution2(root_node, ax[1], root_color='purple', child_color='orange')\n",
    "    ax[1].set_title(f\"Generated Tree (Fitness: {fitness_score:.4f})\")\n",
    "\n",
    "    # Set limits for plotting\n",
    "    all_coords = list(target_coords_s2.union(tree_coordinates))\n",
    "    if all_coords:\n",
    "        all_coords_array = Array(all_coords)\n",
    "        min_x = min(c[0] for c in all_coords_array) - 1\n",
    "        max_x = max(c[0] for c in all_coords_array) + 2\n",
    "        min_y = min(c[1] for c in all_coords_array) - 1\n",
    "        max_y = max(c[1] for c in all_coords_array) + 2\n",
    "    else:\n",
    "        min_x, max_x, min_y, max_y = -2, 2, -2, 2\n",
    "\n",
    "    for a in ax:\n",
    "        a.set_xlim(min_x, max_x)\n",
    "        a.set_ylim(min_y, max_y)\n",
    "        a.set_xticks(range(int(min_x), int(max_x)))\n",
    "        a.set_yticks(range(int(min_y), int(max_y)))\n",
    "\n",
    "    plt.tight_layout()\n",
    "    plt.show()\n",
    "else:\n",
    "    print(\"Could not generate a spatial tree for testing fitness.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "wD_ZIS3LL3Z2"
   },
   "source": [
    "Next, we asked Colab to add mutation, reproduction, and, if possible, recombination. All in a self-contained program. Gemini answered with a code that plotted only the final best tree for the last target length. So we asked:\n",
    ">\n",
    "> Please, rewrite the code to plot the best tree for each target length.\n",
    ">\n",
    "> When one plot was displayed for each target length, we noticed that there are redundant lines. These have two possible explanations. First, there is an error in the code. Second: they are a byproduct of recombination. So, we asked:\n",
    ">\n",
    "> Redundant connected lines to far neighbors appear. Please, prevent their appearance.\n",
    "\n",
    "Gemini answered:\n",
    ">\n",
    "> I will update the plotting function to use arrows instead of dashed lines for connections between parent and child nodes. This will clearly indicate the direction of growth and improve the clarity of the tree structure. I'll also ensure proper layering of elements using zorder so that arrows are visible on top of the squares.\n",
    "\n",
    "The code follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "executionInfo": {
     "elapsed": 2171,
     "status": "ok",
     "timestamp": 1788288570049,
     "user": {
      "displayName": "jose rodriguez",
      "userId": "08454562216435392883"
     },
     "user_tz": 300
    },
    "id": "8afda218",
    "outputId": "3910ce20-296c-4a76-d11f-79bb3458ae4e"
   },
   "outputs": [],
   "source": [
    "# Program spatial_trees_evolution3.py\n",
    "# By Gemini 2.5 Flash\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "from numpy import array as Array\n",
    "import copy # For deep copying trees during reproduction and mutation\n",
    "\n",
    "class SpatialTreeNode_Evolution3(object):\n",
    "    def __init__(self, value, x, y, local_occupied_set):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "        local_occupied_set.add((x, y))\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode_Evolution3):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode_Evolution3\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix, local_occupied_set):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "        available_neighbors = [coord for coord in coordinates_neighbors if coord not in local_occupied_set]\n",
    "\n",
    "        if not available_neighbors:\n",
    "            return None\n",
    "\n",
    "        nx, ny = random.choice(available_neighbors)\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        child_node = SpatialTreeNode_Evolution3(child_value, nx, ny, local_occupied_set)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode(value={self.value}, x={self.x}, y={self.y}, children={[child.value for child in self.children]})\"\n",
    "\n",
    "    def update_value(self, new_value):\n",
    "        self.value = new_value\n",
    "\n",
    "    # Method to collect all coordinates of the current tree\n",
    "    def collect_all_coordinates(self):\n",
    "        all_coords = set()\n",
    "        stack = [self]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            all_coords.add((node.x, node.y))\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "        return all_coords\n",
    "\n",
    "    def get_all_nodes(self):\n",
    "        all_nodes = []\n",
    "        stack = [self]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            all_nodes.append(node)\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "        return all_nodes\n",
    "\n",
    "def generate_random_spatial_tree_evolution3(\n",
    "    max_depth, max_children, initial_x, initial_y, current_depth=0, parent_node=None, node_prefix=\"Cell\", local_occupied_set=None\n",
    "):\n",
    "    if local_occupied_set is None:\n",
    "        local_occupied_set = set() # Initialize a new set for this tree's generation\n",
    "\n",
    "    if parent_node is None:\n",
    "        node_value = f\"{node_prefix}_Root_{random.randint(0, 99)}\"\n",
    "        current_node = SpatialTreeNode_Evolution3(node_value, initial_x, initial_y, local_occupied_set)\n",
    "    else:\n",
    "        current_node = parent_node.add_child_in_random_neighbor(f\"{node_prefix}_{current_depth}\", local_occupied_set)\n",
    "        if current_node is None:\n",
    "            return None\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        num_children = random.randint(0, max_children)\n",
    "        for _ in range(num_children):\n",
    "            generate_random_spatial_tree_evolution3(\n",
    "                max_depth, max_children, initial_x, initial_y, current_depth + 1, current_node, node_prefix, local_occupied_set\n",
    "            )\n",
    "\n",
    "    return current_node\n",
    "\n",
    "\n",
    "# Helper functions for plotting\n",
    "def draw_square_evolution3(ax, x, y, color='blue', alpha=0.7, label=None):\n",
    "    rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=1, zorder=1)\n",
    "    ax.add_patch(rect)\n",
    "    if label:\n",
    "        ax.text(x + 0.5, y + 0.5, label, ha='center', va='center', color='white', fontsize=8, zorder=2)\n",
    "\n",
    "def plot_tree_nodes_evolution3(node, ax, root_color='skyblue', child_color='lightcoral'):\n",
    "    if node is None:\n",
    "        return\n",
    "    draw_square_evolution3(ax, node.x, node.y, color=root_color if \"Root\" in node.value else child_color, label=node.value)\n",
    "    for child in node.children:\n",
    "        # Draw an arrow from parent to child\n",
    "        ax.annotate(\n",
    "            '',\n",
    "            xy=(child.x + 0.5, child.y + 0.5), # Child's center\n",
    "            xytext=(node.x + 0.5, node.y + 0.5), # Parent's center\n",
    "            arrowprops=dict(facecolor='black', edgecolor='black', arrowstyle='->', lw=1, connectionstyle='arc3,rad=0'), # 'arc3,rad=0' for straight arrow\n",
    "            zorder=2 # Ensure arrows are drawn above squares\n",
    "        )\n",
    "        plot_tree_nodes_evolution3(child, ax, root_color, child_color)\n",
    "\n",
    "\n",
    "# PART II: OBJECTIVE FUNCTION AND FITNESS\n",
    "\n",
    "def generate_target_square_coords3(side_length, origin_x=0, origin_y=0):\n",
    "    \"\"\"\n",
    "    Generates a set of (x, y) coordinates representing a filled square.\n",
    "    \"\"\"\n",
    "    target_coords = set()\n",
    "    for x in range(origin_x, origin_x + side_length):\n",
    "        for y in range(origin_y, origin_y + side_length):\n",
    "            target_coords.add((x, y))\n",
    "    return target_coords\n",
    "\n",
    "def calculate_fitness3(tree_root, target_coords):\n",
    "    \"\"\"\n",
    "    Calculates the fitness of a spatial tree based on how well it fills a target square.\n",
    "    Fitness is higher for better matches.\n",
    "    \"\"\"\n",
    "    if tree_root is None:\n",
    "        return 0.0\n",
    "\n",
    "    tree_coords = tree_root.collect_all_coordinates()\n",
    "\n",
    "    overlaps = len(tree_coords.intersection(target_coords))\n",
    "    missing_cells = len(target_coords - tree_coords)\n",
    "    extra_cells = len(tree_coords - target_coords)\n",
    "\n",
    "    # A simple fitness function: prioritize overlaps, penalize missing and extra cells\n",
    "    # You can adjust weights based on what aspects of 'filling' are most important.\n",
    "    # Using Jaccard-like index: (intersection / union)\n",
    "    union_size = len(tree_coords.union(target_coords))\n",
    "    if union_size == 0:\n",
    "        return 0.0 # Should not happen if target_coords is non-empty\n",
    "\n",
    "    # Penalize large trees that overfill, or small trees that underfill\n",
    "    # fitness = overlaps - (missing_cells * 0.5) - (extra_cells * 0.5)\n",
    "    # A simple overlap ratio might be enough for a start\n",
    "\n",
    "    # normalized_fitness = overlaps / len(target_coords) if len(target_coords) > 0 else 0.0\n",
    "    # Consider a more balanced fitness that encourages matching both presence and absence\n",
    "    # F-measure type score\n",
    "    precision = overlaps / len(tree_coords) if len(tree_coords) > 0 else 0.0\n",
    "    recall = overlaps / len(target_coords) if len(target_coords) > 0 else 0.0\n",
    "\n",
    "    # Harmonic mean of precision and recall\n",
    "    if precision + recall == 0:\n",
    "        f_score = 0.0\n",
    "    else:\n",
    "        f_score = 2 * (precision * recall) / (precision + recall)\n",
    "\n",
    "    # Optionally, add a small penalty for tree size if it's much larger than the target\n",
    "    # if len(tree_coords) > len(target_coords) * 1.5:\n",
    "    #    f_score -= 0.1 * (len(tree_coords) - len(target_coords))\n",
    "\n",
    "    return f_score\n",
    "\n",
    "\n",
    "# PART III: EVOLUTIONARY ALGORITHM COMPONENTS\n",
    "\n",
    "def create_initial_population3(pop_size, max_depth, max_children, initial_x, initial_y, node_prefix):\n",
    "    population = []\n",
    "    for i in range(pop_size):\n",
    "        local_occupied_set = set()\n",
    "        tree = generate_random_spatial_tree_evolution3(max_depth, max_children, initial_x, initial_y, node_prefix=f\"{node_prefix}_{i}\", local_occupied_set=local_occupied_set)\n",
    "        if tree:\n",
    "            population.append(tree)\n",
    "    return population\n",
    "\n",
    "def select_parents3(population, fitness_scores, num_parents):\n",
    "    # Using tournament selection for simplicity\n",
    "    parents = []\n",
    "    for _ in range(num_parents):\n",
    "        tournament_size = min(5, len(population)) # Tournament size\n",
    "        tournament_candidates = random.sample(list(zip(population, fitness_scores)), tournament_size)\n",
    "        winner = max(tournament_candidates, key=lambda x: x[1])[0] # Select tree with highest fitness\n",
    "        parents.append(winner)\n",
    "    return parents\n",
    "\n",
    "def mutate_tree3(tree_root, max_depth, max_children, mutation_rate=0.1):\n",
    "    mutated_tree = copy.deepcopy(tree_root) # Work on a copy\n",
    "    all_nodes = mutated_tree.get_all_nodes()\n",
    "\n",
    "    if not all_nodes:\n",
    "        return mutated_tree\n",
    "\n",
    "    # Choose a random node to mutate\n",
    "    node_to_mutate = random.choice(all_nodes)\n",
    "\n",
    "    if random.random() < mutation_rate: # Chance to add a child\n",
    "        # Need a fresh local_occupied_set for mutation check\n",
    "        temp_occupied_set = mutated_tree.collect_all_coordinates() # Get all coords after deepcopy\n",
    "        added_child = node_to_mutate.add_child_in_random_neighbor(\"MutatedChild\", temp_occupied_set)\n",
    "        if added_child:\n",
    "            # If a child was added, its coords were added to temp_occupied_set\n",
    "            # This deepcopy and rebuild of local_occupied_set is a bit clunky but ensures consistency\n",
    "            pass # The new node has its coords in temp_occupied_set\n",
    "\n",
    "    if random.random() < mutation_rate and len(node_to_mutate.children) > 0: # Chance to remove a child\n",
    "        child_to_remove = random.choice(node_to_mutate.children)\n",
    "        node_to_mutate.children.remove(child_to_remove)\n",
    "        # Removing a child means its coordinates might no longer be occupied. This is harder to track\n",
    "        # for a deepcopied tree without re-validating the entire tree's coordinates. For simplicity,\n",
    "        # we will assume the fitness function re-calculates actual occupied space.\n",
    "\n",
    "    return mutated_tree\n",
    "\n",
    "def crossover_trees3(parent1_root, parent2_root, crossover_rate=0.7):\n",
    "    if random.random() > crossover_rate:\n",
    "        return copy.deepcopy(parent1_root), copy.deepcopy(parent2_root)\n",
    "\n",
    "    # Simple one-point crossover: swap random subtrees\n",
    "    child1_root = copy.deepcopy(parent1_root)\n",
    "    child2_root = copy.deepcopy(parent2_root)\n",
    "\n",
    "    all_nodes_child1 = child1_root.get_all_nodes()\n",
    "    all_nodes_child2 = child2_root.get_all_nodes()\n",
    "\n",
    "    if len(all_nodes_child1) < 2 or len(all_nodes_child2) < 2: # Need at least root and one other node to swap\n",
    "        return child1_root, child2_root\n",
    "\n",
    "    # Choose random nodes (not roots) to be crossover points\n",
    "    cross_point1 = random.choice([n for n in all_nodes_child1 if n != child1_root])\n",
    "    cross_point2 = random.choice([n for n in all_nodes_child2 if n != child2_root])\n",
    "\n",
    "    # Find parent of cross_point1 in child1_root tree\n",
    "    parent_cross_point1 = None\n",
    "    for node in all_nodes_child1:\n",
    "        if cross_point1 in node.children:\n",
    "            parent_cross_point1 = node\n",
    "            break\n",
    "\n",
    "    # Find parent of cross_point2 in child2_root tree\n",
    "    parent_cross_point2 = None\n",
    "    for node in all_nodes_child2:\n",
    "        if cross_point2 in node.children:\n",
    "            parent_cross_point2 = node\n",
    "            break\n",
    "\n",
    "    if parent_cross_point1 and parent_cross_point2: # Perform swap\n",
    "        # Swap children in parents\n",
    "        parent_cross_point1.children.remove(cross_point1)\n",
    "        parent_cross_point1.add_child(cross_point2)\n",
    "\n",
    "        parent_cross_point2.children.remove(cross_point2)\n",
    "        parent_cross_point2.add_child(cross_point1)\n",
    "\n",
    "    # Re-validate coordinates after crossover might be needed for fitness calculation\n",
    "    # The collect_all_coordinates function handles this for fitness, so no explicit action here.\n",
    "\n",
    "    return child1_root, child2_root\n",
    "\n",
    "\n",
    "# PART IV: EVOLUTIONARY SIMULATION LOOP\n",
    "\n",
    "def run_evolution3(target_side_lengths, pop_size, generations_per_target, max_depth, max_children, mutation_rate, crossover_rate):\n",
    "\n",
    "    evolution_results = [] # Store best fitness and tree for each target\n",
    "    overall_best_tree = None\n",
    "    overall_best_fitness = -1.0\n",
    "\n",
    "    for target_length in target_side_lengths:\n",
    "        print(f\"\\n--- Evolving for Target Square of Length {target_length} ---\")\n",
    "        target_coords = generate_target_square_coords3(target_length, origin_x=0, origin_y=0)\n",
    "        print(f\"Target coordinates: {target_coords}\")\n",
    "\n",
    "        population = create_initial_population3(pop_size, max_depth, max_children, 0, 0, \"InitialTree\")\n",
    "        best_fitness_for_target = -1.0\n",
    "        best_tree_for_target = None\n",
    "\n",
    "        generation_costs = [] # To track cost (generations) per target\n",
    "\n",
    "        for generation in range(generations_per_target):\n",
    "            fitness_scores = [calculate_fitness3(tree, target_coords) for tree in population]\n",
    "\n",
    "            current_best_fitness = max(fitness_scores)\n",
    "            current_best_tree = population[np.argmax(fitness_scores)]\n",
    "\n",
    "            if current_best_fitness > best_fitness_for_target:\n",
    "                best_fitness_for_target = current_best_fitness\n",
    "                best_tree_for_target = current_best_tree\n",
    "\n",
    "            print(f\"Generation {generation+1}: Best Fitness = {current_best_fitness:.4f}\")\n",
    "\n",
    "            # Check for convergence or satisfactory fitness\n",
    "            if current_best_fitness >= 0.95: # Arbitrary high fitness threshold\n",
    "                print(f\"Target reached or near optimal in {generation+1} generations!\")\n",
    "                break\n",
    "\n",
    "            # Selection\n",
    "            parents = select_parents3(population, fitness_scores, pop_size // 2) # Select half population as parents\n",
    "\n",
    "            # Create next generation\n",
    "            next_population = []\n",
    "            for i in range(0, len(parents), 2):\n",
    "                if i + 1 < len(parents):\n",
    "                    p1 = parents[i]\n",
    "                    p2 = parents[i+1]\n",
    "\n",
    "                    # Crossover\n",
    "                    child1, child2 = crossover_trees3(p1, p2, crossover_rate)\n",
    "\n",
    "                    # Mutation\n",
    "                    next_population.append(mutate_tree3(child1, max_depth, max_children, mutation_rate))\n",
    "                    next_population.append(mutate_tree3(child2, max_depth, max_children, mutation_rate))\n",
    "                else:\n",
    "                    # If odd number of parents, just mutate the last one\n",
    "                    next_population.append(mutate_tree3(copy.deepcopy(parents[i]), max_depth, max_children, mutation_rate))\n",
    "\n",
    "            # Fill remaining slots with new random trees if population size decreased due to unviable children\n",
    "            while len(next_population) < pop_size:\n",
    "                local_occupied_set = set()\n",
    "                new_tree = generate_random_spatial_tree_evolution3(max_depth, max_children, 0, 0, node_prefix=f\"RandomGen_{len(next_population)}\", local_occupied_set=local_occupied_set)\n",
    "                if new_tree: # Ensure a tree was actually generated\n",
    "                    next_population.append(new_tree)\n",
    "                else:\n",
    "                    # Fallback if random generation fails too often, to avoid infinite loop\n",
    "                    # This indicates an issue with tree generation parameters or space constraints\n",
    "                    break\n",
    "\n",
    "            population = next_population[:pop_size] # Ensure population size remains constant\n",
    "            generation_costs.append(generation + 1) # Track generations taken\n",
    "\n",
    "        evolution_results.append({\n",
    "            'target_length': target_length,\n",
    "            'best_tree': best_tree_for_target,\n",
    "            'best_fitness': best_fitness_for_target,\n",
    "            'generations_taken': len(generation_costs) # This will be the number of generations it ran for\n",
    "        })\n",
    "\n",
    "        if best_tree_for_target and best_fitness_for_target > overall_best_fitness:\n",
    "            overall_best_fitness = best_fitness_for_target\n",
    "            overall_best_tree = best_tree_for_target\n",
    "\n",
    "    return evolution_results, overall_best_tree\n",
    "\n",
    "\n",
    "# Main simulation run\n",
    "if __name__ == \"__main__\":\n",
    "    random.seed(42) # For reproducibility\n",
    "    np.random.seed(42)\n",
    "\n",
    "    TARGET_SIDE_LENGTHS = [2, 3, 4] # Squares of length 2, 3, and 4\n",
    "    POPULATION_SIZE = 50\n",
    "    GENERATIONS_PER_TARGET = 100\n",
    "    MAX_TREE_DEPTH = 5\n",
    "    MAX_CHILDREN_PER_NODE = 3\n",
    "    MUTATION_RATE = 0.15 # Probability of a node adding/removing a child\n",
    "    CROSSOVER_RATE = 0.7 # Probability of crossover occurring between two parents\n",
    "\n",
    "    results, overall_best_tree = run_evolution3(\n",
    "        TARGET_SIDE_LENGTHS, POPULATION_SIZE, GENERATIONS_PER_TARGET,\n",
    "        MAX_TREE_DEPTH, MAX_CHILDREN_PER_NODE, MUTATION_RATE, CROSSOVER_RATE\n",
    "    )\n",
    "\n",
    "    print(\"\\n--- Evolution Summary ---\")\n",
    "    for res in results:\n",
    "        print(f\"Target L={res['target_length']}: Best Fitness = {res['best_fitness']:.4f}, Generations = {res['generations_taken']}\")\n",
    "\n",
    "    print(\"\\n--- Plotting Best Tree for Each Target Length ---\")\n",
    "    for res in results:\n",
    "        target_length = res['target_length']\n",
    "        best_tree = res['best_tree']\n",
    "        best_fitness = res['best_fitness']\n",
    "\n",
    "        if best_tree:\n",
    "            target_coords = generate_target_square_coords3(target_length, origin_x=0, origin_y=0)\n",
    "\n",
    "            fig, ax = plt.subplots(1, 2, figsize=(16, 8))\n",
    "            ax[0].set_aspect('equal', adjustable='box')\n",
    "            ax[1].set_aspect('equal', adjustable='box')\n",
    "\n",
    "            # Plot the target\n",
    "            for cx, cy in target_coords:\n",
    "                draw_square_evolution3(ax[0], cx, cy, color='green', alpha=0.5, label='Target')\n",
    "            ax[0].set_title(f\"Target Square (L={target_length})\")\n",
    "            ax[0].grid(True)\n",
    "\n",
    "            # Plot the best tree for this target\n",
    "            plot_tree_nodes_evolution3(best_tree, ax[1], root_color='purple', child_color='orange')\n",
    "            ax[1].set_title(f\"Best Evolved Tree for L={target_length} (Fitness: {best_fitness:.4f})\")\n",
    "\n",
    "            # Set limits for plotting\n",
    "            tree_coords_for_plot = best_tree.collect_all_coordinates()\n",
    "            all_coords_union = target_coords.union(tree_coords_for_plot)\n",
    "\n",
    "            if all_coords_union:\n",
    "                all_coords_array = Array(list(all_coords_union))\n",
    "                min_x = min(c[0] for c in all_coords_array) - 1\n",
    "                max_x = max(c[0] for c in all_coords_array) + 2\n",
    "                min_y = min(c[1] for c in all_coords_array) - 1\n",
    "                max_y = max(c[1] for c in all_coords_array) + 2\n",
    "            else:\n",
    "                min_x, max_x, min_y, max_y = -2, 2, -2, 2\n",
    "\n",
    "            for a in ax:\n",
    "                a.set_xlim(min_x, max_x)\n",
    "                a.set_ylim(min_y, max_y)\n",
    "                a.set_xticks(range(int(min_x), int(max_x)))\n",
    "                a.set_yticks(range(int(min_y), int(max_y)))\n",
    "\n",
    "            plt.tight_layout()\n",
    "            plt.show()\n",
    "        else:\n",
    "            print(f\"No successful tree evolved for target length {target_length}.\")\n",
    "\n",
    "    # The previous plotting for overall best tree against final target is removed as it's redundant\n",
    "    # with the new per-target plotting."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "9Xj4MBB5QyiY"
   },
   "source": [
    "*Observation.* Plots show redundant lines, and also lines that do not connect first neighbors. The Author was unable to find an error in the code. So, they seem to be a byproduct of recombination. Let us keep an eye on this trouble.\n",
    "\n",
    "**Recommendation for running the program.** The program will always produce the same output. This is reproducibility, a precious stone of the Scientific Method. To change the output, change the seed of the random generator in line 357. Put any value but not very large.\n",
    "\n",
    "**Exercise.** To continue, Gemini proposed three options:\n",
    ">\n",
    "> 1. Plot the average generations required to reach fitness 1.0 against target lengths.\n",
    "> 2. Visualize fitness progression over generations for specific target length.\n",
    "> 3. Modify the mutation rate to see how it affects convergence speed.\n",
    "\n",
    "Choose one option and work it out.\n",
    ">\n",
    "> *Answer.* We chose the first option that produces an estimation of the cost of getting perfection as a function of the edge of the target square. Gemini inserted the corresponding code in various code cells. The Python kernel protested because it needed the complete code. So, we pasted everything together in a new code cell.\n",
    ">\n",
    "> After executing the code, we extended the length of size of the target square to 10, but a recursion error was reported at length 6. So, Gemini proposed various suggestions that we accepted:\n",
    ">\n",
    "> 1. Refactor the evolution loop to store results in a global variable for easier plotting.\n",
    "> 2. To increase the recursion limit.\n",
    "> 3. Relocate the plotting code right after the `run_evolution` call, so the `results` variable is properly defined in scope.\n",
    "> 4. To increase the recombination rate. In that way, more space will be covered, and the task would get ready earlier in time.\n",
    "> 5. Increase the maximal generation limit to help the model converge for length 6.  \n",
    "> 6. Modify the population size from 50 to 100 and then to 200 to improve convergence for length 6 and 7.\n",
    "> 7. Increase the value of the parameter `generations per target` to 200 to give the algorithm more time to converge for length 7.\n",
    ">\n",
    "> We also noticed that at length 6 a disproportionate growth of the cost happened. So, we asked Gemini to add an exponential regression model to fit the data of the cost in generations against target length.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "-G7aZWe8uuio"
   },
   "outputs": [],
   "source": [
    "# Program cost_of_evolution.py\n",
    "# The cost of fitting a square is estimated.\n",
    "# By Gemini 2.5\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "from numpy import array as Array\n",
    "import copy # For deep copying trees during reproduction and mutation\n",
    "import sys # Import sys module to adjust recursion limit\n",
    "from scipy.optimize import curve_fit # For exponential regression\n",
    "\n",
    "sys.setrecursionlimit(2000) # Increase the recursion limit\n",
    "\n",
    "class SpatialTreeNode_Evolution4(object):\n",
    "    def __init__(self, value, x, y, local_occupied_set):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "        local_occupied_set.add((x, y))\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode_Evolution4):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode_Evolution3\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix, local_occupied_set):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "        available_neighbors = [coord for coord in coordinates_neighbors if coord not in local_occupied_set]\n",
    "\n",
    "        if not available_neighbors:\n",
    "            return None\n",
    "\n",
    "        nx, ny = random.choice(available_neighbors)\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        child_node = SpatialTreeNode_Evolution4(child_value, nx, ny, local_occupied_set)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode(value={self.value}, x={self.x}, y={self.y}, children={[child.value for child in self.children]})\"\n",
    "        # You can also see that if you choose to go to a child that has no other children, then you will have to create a new tree, in which case the parent of the child is `none`.\n",
    "\n",
    "    def update_value(self, new_value):\n",
    "        self.value = new_value\n",
    "\n",
    "    # Method to collect all coordinates of the current tree\n",
    "    def collect_all_coordinates(self):\n",
    "        all_coords = set()\n",
    "        stack = [self]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            all_coords.add((node.x, node.y))\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "        return all_coords\n",
    "\n",
    "    def get_all_nodes(self):\n",
    "        all_nodes = []\n",
    "        stack = [self]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            all_nodes.append(node)\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "        return all_nodes\n",
    "\n",
    "def generate_random_spatial_tree_evolution4(\n",
    "    max_depth, max_children, initial_x, initial_y, current_depth=0, parent_node=None, node_prefix=\"Cell\", local_occupied_set=None\n",
    "):\n",
    "    if local_occupied_set is None:\n",
    "        local_occupied_set = set() # Initialize a new set for this tree's generation\n",
    "\n",
    "    if parent_node is None:\n",
    "        node_value = f\"{node_prefix}_Root_{random.randint(0, 99)}\"\n",
    "        current_node = SpatialTreeNode_Evolution4(node_value, initial_x, initial_y, local_occupied_set)\n",
    "    else:\n",
    "        current_node = parent_node.add_child_in_random_neighbor(f\"{node_prefix}_{current_depth}\", local_occupied_set)\n",
    "        if current_node is None:\n",
    "            return None\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        num_children = random.randint(0, max_children)\n",
    "        for _ in range(num_children):\n",
    "            generate_random_spatial_tree_evolution4(\n",
    "                max_depth, max_children, initial_x, initial_y, current_depth + 1, current_node, node_prefix, local_occupied_set\n",
    "            )\n",
    "\n",
    "    return current_node\n",
    "\n",
    "\n",
    "# Helper functions for plotting\n",
    "def draw_square_evolution4(ax, x, y, color='blue', alpha=0.7, label=None):\n",
    "    rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=1, zorder=1)\n",
    "    ax.add_patch(rect)\n",
    "    if label:\n",
    "        ax.text(x + 0.5, y + 0.5, label, ha='center', va='center', color='white', fontsize=8, zorder=2)\n",
    "\n",
    "def plot_tree_nodes_evolution4(node, ax, root_color='skyblue', child_color='lightcoral'):\n",
    "    if node is None:\n",
    "        return\n",
    "    draw_square_evolution4(ax, node.x, node.y, color=root_color if \"Root\" in node.value else child_color, label=node.value)\n",
    "    for child in node.children:\n",
    "        # Draw an arrow from parent to child\n",
    "        ax.annotate(\n",
    "            '',\n",
    "            xy=(child.x + 0.5, child.y + 0.5), # Child's center\n",
    "            xytext=(node.x + 0.5, node.y + 0.5), # Parent's center\n",
    "            arrowprops=dict(facecolor='black', edgecolor='black', arrowstyle='->', lw=1, connectionstyle='arc3,rad=0'), # 'arc3,rad=0' for straight arrow\n",
    "            zorder=2 # Ensure arrows are drawn above squares\n",
    "        )\n",
    "        plot_tree_nodes_evolution4(child, ax, root_color, child_color)\n",
    "\n",
    "\n",
    "# PART II: OBJECTIVE FUNCTION AND FITNESS\n",
    "\n",
    "def generate_target_square_coords4(side_length, origin_x=0, origin_y=0):\n",
    "    \"\"\"\n",
    "    Generates a set of (x, y) coordinates representing a filled square.\n",
    "    \"\"\"\n",
    "    target_coords = set()\n",
    "    for x in range(origin_x, origin_x + side_length):\n",
    "        for y in range(origin_y, origin_y + side_length):\n",
    "            target_coords.add((x, y))\n",
    "    return target_coords\n",
    "\n",
    "def calculate_fitness4(tree_root, target_coords):\n",
    "    \"\"\"\n",
    "    Calculates the fitness of a spatial tree based on how well it fills a target square.\n",
    "    Fitness is higher for better matches.\n",
    "    \"\"\"\n",
    "    if tree_root is None:\n",
    "        return 0.0\n",
    "\n",
    "    tree_coords = tree_root.collect_all_coordinates()\n",
    "\n",
    "    overlaps = len(tree_coords.intersection(target_coords))\n",
    "    missing_cells = len(target_coords - tree_coords)\n",
    "    extra_cells = len(tree_coords - target_coords)\n",
    "\n",
    "    # A simple fitness function: prioritize overlaps, penalize missing and extra cells\n",
    "    # You can adjust weights based on what aspects of 'filling' are most important.\n",
    "    # Using Jaccard-like index: (intersection / union)\n",
    "    union_size = len(tree_coords.union(target_coords))\n",
    "    if union_size == 0:\n",
    "        return 0.0 # Should not happen if target_coords is non-empty\n",
    "\n",
    "    # Penalize large trees that overfill, or small trees that underfill\n",
    "    # fitness = overlaps - (missing_cells * 0.5) - (extra_cells * 0.5)\n",
    "    # A simple overlap ratio might be enough for a start\n",
    "\n",
    "    # normalized_fitness = overlaps / len(target_coords) if len(target_coords) > 0 else 0.0\n",
    "    # Consider a more balanced fitness that encourages matching both presence and absence\n",
    "    # F-measure type score\n",
    "    precision = overlaps / len(tree_coords) if len(tree_coords) > 0 else 0.0\n",
    "    recall = overlaps / len(target_coords) if len(target_coords) > 0 else 0.0\n",
    "\n",
    "    # Harmonic mean of precision and recall\n",
    "    if precision + recall == 0:\n",
    "        f_score = 0.0\n",
    "    else:\n",
    "        f_score = 2 * (precision * recall) / (precision + recall)\n",
    "\n",
    "    # Optionally, add a small penalty for tree size if it's much larger than the target\n",
    "    # if len(tree_coords) > len(target_coords) * 1.5:\n",
    "    #    f_score -= 0.1 * (len(tree_coords) - len(target_coords))\n",
    "\n",
    "    return f_score\n",
    "\n",
    "\n",
    "# PART III: EVOLUTIONARY ALGORITHM COMPONENTS\n",
    "\n",
    "def create_initial_population4(pop_size, max_depth, max_children, initial_x, initial_y, node_prefix):\n",
    "    population = []\n",
    "    for i in range(pop_size):\n",
    "        local_occupied_set = set()\n",
    "        tree = generate_random_spatial_tree_evolution4(max_depth, max_children, initial_x, initial_y, node_prefix=f\"{node_prefix}_{i}\", local_occupied_set=local_occupied_set)\n",
    "        if tree:\n",
    "            population.append(tree)\n",
    "    return population\n",
    "\n",
    "def select_parents4(population, fitness_scores, num_parents):\n",
    "    # Using tournament selection for simplicity\n",
    "    parents = []\n",
    "    for _ in range(num_parents):\n",
    "        tournament_size = min(5, len(population)) # Tournament size\n",
    "        tournament_candidates = random.sample(list(zip(population, fitness_scores)), tournament_size)\n",
    "        winner = max(tournament_candidates, key=lambda x: x[1])[0] # Select tree with highest fitness\n",
    "        parents.append(winner)\n",
    "    return parents\n",
    "\n",
    "def mutate_tree4(tree_root, max_depth, max_children, mutation_rate=0.1):\n",
    "    mutated_tree = copy.deepcopy(tree_root) # Work on a copy\n",
    "    all_nodes = mutated_tree.get_all_nodes()\n",
    "\n",
    "    if not all_nodes:\n",
    "        return mutated_tree\n",
    "\n",
    "    # Choose a random node to mutate\n",
    "    node_to_mutate = random.choice(all_nodes)\n",
    "\n",
    "    if random.random() < mutation_rate: # Chance to add a child\n",
    "        # Need a fresh local_occupied_set for mutation check\n",
    "        temp_occupied_set = mutated_tree.collect_all_coordinates() # Get all coords after deepcopy\n",
    "        added_child = node_to_mutate.add_child_in_random_neighbor(\"MutatedChild\", temp_occupied_set)\n",
    "        if added_child:\n",
    "            # If a child was added, its coords were added to temp_occupied_set\n",
    "            # This deepcopy and rebuild of local_occupied_set is a bit clunky but ensures consistency\n",
    "            pass # The new node has its coords in temp_occupied_set\n",
    "\n",
    "    if random.random() < mutation_rate and len(node_to_mutate.children) > 0: # Chance to remove a child\n",
    "        child_to_remove = random.choice(node_to_mutate.children)\n",
    "        node_to_mutate.children.remove(child_to_remove)\n",
    "        # Removing a child means its coordinates might no longer be occupied. This is harder to track\n",
    "        # for a deepcopied tree without re-validating the entire tree's coordinates. For simplicity,\n",
    "        # we will assume the fitness function re-calculates actual occupied space.\n",
    "\n",
    "    return mutated_tree\n",
    "\n",
    "def crossover_trees4(parent1_root, parent2_root, crossover_rate=0.7):\n",
    "    if random.random() > crossover_rate:\n",
    "        return copy.deepcopy(parent1_root), copy.deepcopy(parent2_root)\n",
    "\n",
    "    # Simple one-point crossover: swap random subtrees\n",
    "    child1_root = copy.deepcopy(parent1_root)\n",
    "    child2_root = copy.deepcopy(parent2_root)\n",
    "\n",
    "    all_nodes_child1 = child1_root.get_all_nodes()\n",
    "    all_nodes_child2 = child2_root.get_all_nodes()\n",
    "\n",
    "    if len(all_nodes_child1) < 2 or len(all_nodes_child2) < 2: # Need at least root and one other node to swap\n",
    "        return child1_root, child2_root\n",
    "\n",
    "    # Choose random nodes (not roots) to be crossover points\n",
    "    cross_point1 = random.choice([n for n in all_nodes_child1 if n != child1_root])\n",
    "    cross_point2 = random.choice([n for n in all_nodes_child2 if n != child2_root])\n",
    "\n",
    "    # Find parent of cross_point1 in child1_root tree\n",
    "    parent_cross_point1 = None\n",
    "    for node in all_nodes_child1:\n",
    "        if cross_point1 in node.children:\n",
    "            parent_cross_point1 = node\n",
    "            break\n",
    "\n",
    "    # Find parent of cross_point2 in child2_root tree\n",
    "    parent_cross_point2 = None\n",
    "    for node in all_nodes_child2:\n",
    "        if cross_point2 in node.children:\n",
    "            parent_cross_point2 = node\n",
    "            break\n",
    "\n",
    "    if parent_cross_point1 and parent_cross_point2: # Perform swap\n",
    "        # Swap children in parents\n",
    "        parent_cross_point1.children.remove(cross_point1)\n",
    "        parent_cross_point1.add_child(cross_point2)\n",
    "\n",
    "        parent_cross_point2.children.remove(cross_point2)\n",
    "        parent_cross_point2.add_child(cross_point1)\n",
    "\n",
    "    # Re-validate coordinates after crossover might be needed for fitness calculation\n",
    "    # The collect_all_coordinates function handles this for fitness, so no explicit action here.\n",
    "\n",
    "    return child1_root, child2_root\n",
    "\n",
    "\n",
    "# PART IV: EVOLUTIONARY SIMULATION LOOP\n",
    "\n",
    "def run_evolution4(target_side_lengths, pop_size, generations_per_target, max_depth, max_children, mutation_rate, crossover_rate):\n",
    "\n",
    "    evolution_results = [] # Store best fitness and tree for each target\n",
    "    overall_best_tree = None\n",
    "    overall_best_fitness = -1.0\n",
    "\n",
    "    for target_length in target_side_lengths:\n",
    "        print(f\"\\n--- Evolving for Target Square of Length {target_length} ---\")\n",
    "        target_coords = generate_target_square_coords4(target_length, origin_x=0, origin_y=0)\n",
    "        print(f\"Target coordinates: {target_coords}\")\n",
    "\n",
    "        population = create_initial_population4(pop_size, max_depth, max_children, 0, 0, \"InitialTree\")\n",
    "        best_fitness_for_target = -1.0\n",
    "        best_tree_for_target = None\n",
    "\n",
    "        generation_costs = [] # To track cost (generations) per target\n",
    "\n",
    "        for generation in range(generations_per_target):\n",
    "            fitness_scores = [calculate_fitness4(tree, target_coords) for tree in population]\n",
    "\n",
    "            current_best_fitness = max(fitness_scores)\n",
    "            current_best_tree = population[np.argmax(fitness_scores)]\n",
    "\n",
    "            if current_best_fitness > best_fitness_for_target:\n",
    "                best_fitness_for_target = current_best_fitness\n",
    "                best_tree_for_target = current_best_tree\n",
    "\n",
    "            print(f\"Generation {generation+1}: Best Fitness = {current_best_fitness:.4f}\")\n",
    "\n",
    "            # Check for convergence or satisfactory fitness\n",
    "            if current_best_fitness >= 0.95: # Arbitrary high fitness threshold\n",
    "                print(f\"Target reached or near optimal in {generation+1} generations!\")\n",
    "                break\n",
    "\n",
    "            # Selection\n",
    "            parents = select_parents4(population, fitness_scores, pop_size // 2) # Select half population as parents\n",
    "\n",
    "            # Create next generation\n",
    "            next_population = []\n",
    "            for i in range(0, len(parents), 2):\n",
    "                if i + 1 < len(parents):\n",
    "                    p1 = parents[i]\n",
    "                    p2 = parents[i+1]\n",
    "\n",
    "                    # Crossover\n",
    "                    child1, child2 = crossover_trees4(p1, p2, crossover_rate)\n",
    "\n",
    "                    # Mutation\n",
    "                    next_population.append(mutate_tree4(child1, max_depth, max_children, mutation_rate))\n",
    "                    next_population.append(mutate_tree4(child2, max_depth, max_children, mutation_rate))\n",
    "                else:\n",
    "                    # If odd number of parents, just mutate the last one\n",
    "                    next_population.append(mutate_tree4(copy.deepcopy(parents[i]), max_depth, max_children, mutation_rate))\n",
    "\n",
    "            # Fill remaining slots with new random trees if population size decreased due to unviable children\n",
    "            while len(next_population) < pop_size:\n",
    "                local_occupied_set = set()\n",
    "                new_tree = generate_random_spatial_tree_evolution4(max_depth, max_children, 0, 0, node_prefix=f\"RandomGen_{len(next_population)}\", local_occupied_set=local_occupied_set)\n",
    "                if new_tree: # Ensure a tree was actually generated\n",
    "                    next_population.append(new_tree)\n",
    "                else:\n",
    "                    # Fallback if random generation fails too often, to avoid infinite loop\n",
    "                    # This indicates an issue with tree generation parameters or space constraints\n",
    "                    break\n",
    "\n",
    "            population = next_population[:pop_size] # Ensure population size remains constant\n",
    "            generation_costs.append(generation + 1) # Track generations taken\n",
    "\n",
    "        evolution_results.append({\n",
    "            'target_length': target_length,\n",
    "            'best_tree': best_tree_for_target,\n",
    "            'best_fitness': best_fitness_for_target,\n",
    "            'generations_taken': len(generation_costs) # This will be the number of generations it ran for\n",
    "        })\n",
    "\n",
    "        if best_tree_for_target and best_fitness_for_target > overall_best_fitness:\n",
    "            overall_best_fitness = best_fitness_for_target\n",
    "            overall_best_tree = best_tree_for_target\n",
    "\n",
    "    return evolution_results, overall_best_tree\n",
    "\n",
    "\n",
    "# Main simulation run\n",
    "if __name__ == \"__main__\":\n",
    "    random.seed(42) # For reproducibility\n",
    "    np.random.seed(42)\n",
    "\n",
    "    TARGET_SIDE_LENGTHS = [2, 3, 4, 5, 6, 7] # Squares of length 2, 3, 4, 5, and 6\n",
    "    POPULATION_SIZE = 200 # Increased population size\n",
    "    GENERATIONS_PER_TARGET = 200 # Increased max generations to aid convergence for length 7\n",
    "    MAX_TREE_DEPTH = 5\n",
    "    MAX_CHILDREN_PER_NODE = 3\n",
    "    MUTATION_RATE = 0.15 # Probability of a node adding/removing a child\n",
    "    CROSSOVER_RATE = 0.7 # Probability of crossover occurring between two parents\n",
    "\n",
    "    results, overall_best_tree = run_evolution4(\n",
    "        TARGET_SIDE_LENGTHS, POPULATION_SIZE, GENERATIONS_PER_TARGET,\n",
    "        MAX_TREE_DEPTH, MAX_CHILDREN_PER_NODE, MUTATION_RATE, CROSSOVER_RATE\n",
    "    )\n",
    "\n",
    "    print(\"\\n--- Evolution Summary ---\")\n",
    "    for res in results:\n",
    "        print(f\"Target L={res['target_length']}: Best Fitness = {res['best_fitness']:.4f}, Generations = {res['generations_taken']}\")\n",
    "\n",
    "    print(\"\\n--- Plotting Best Tree for Each Target Length ---\")\n",
    "    for res in results:\n",
    "        target_length = res['target_length']\n",
    "        best_tree = res['best_tree']\n",
    "        best_fitness = res['best_fitness']\n",
    "\n",
    "        if best_tree:\n",
    "            target_coords = generate_target_square_coords4(target_length, origin_x=0, origin_y=0)\n",
    "\n",
    "            fig, ax = plt.subplots(1, 2, figsize=(16, 8))\n",
    "            ax[0].set_aspect('equal', adjustable='box')\n",
    "            ax[1].set_aspect('equal', adjustable='box')\n",
    "\n",
    "            # Plot the target\n",
    "            for cx, cy in target_coords:\n",
    "                draw_square_evolution4(ax[0], cx, cy, color='green', alpha=0.5, label='Target')\n",
    "            ax[0].set_title(f\"Target Square (L={target_length})\")\n",
    "            ax[0].grid(True)\n",
    "\n",
    "            # Plot the best tree for this target\n",
    "            plot_tree_nodes_evolution4(best_tree, ax[1], root_color='purple', child_color='orange')\n",
    "            ax[1].set_title(f\"Best Evolved Tree for L={target_length} (Fitness: {best_fitness:.4f})\")\n",
    "\n",
    "            # Set limits for plotting\n",
    "            tree_coords_for_plot = best_tree.collect_all_coordinates()\n",
    "            all_coords_union = target_coords.union(tree_coords_for_plot)\n",
    "\n",
    "            if all_coords_union:\n",
    "                all_coords_array = Array(list(all_coords_union))\n",
    "                min_x = min(c[0] for c in all_coords_array) - 1\n",
    "                max_x = max(c[0] for c in all_coords_array) + 2\n",
    "                min_y = min(c[1] for c in all_coords_array) - 1\n",
    "                max_y = max(c[1] for c in all_coords_array) + 2\n",
    "            else:\n",
    "                min_x, max_x, min_y, max_y = -2, 2, -2, 2\n",
    "\n",
    "            for a in ax:\n",
    "                a.set_xlim(min_x, max_x)\n",
    "                a.set_ylim(min_y, max_y)\n",
    "                a.set_xticks(range(int(min_x), int(max_x)))\n",
    "                a.set_yticks(range(int(min_y), int(max_y)))\n",
    "\n",
    "            plt.tight_layout()\n",
    "            plt.show()\n",
    "        else:\n",
    "            print(f\"No successful tree evolved for target length {target_length}.\")\n",
    "\n",
    "\n",
    "    # The previous plotting for overall best tree against final target is removed as it's redundant\n",
    "    # with the new per-target plotting.\n",
    "\n",
    "    # Extract data for plotting\n",
    "    target_lengths = np.array([res['target_length'] for res in results])\n",
    "    generations_taken = np.array([res['generations_taken'] for res in results])\n",
    "\n",
    "    # Define the exponential function\n",
    "    def exponential_func(x, a, b):\n",
    "        return a * np.exp(b * x)\n",
    "\n",
    "    # Fit the data to the exponential function\n",
    "    # Provide initial guess for 'a' and 'b' to help the optimizer\n",
    "    # For exponential growth, 'a' can be the intercept at x=0, 'b' is the growth rate.\n",
    "    # A rough guess: a = generations_taken[0], b = 0.1 (or some small positive number)\n",
    "    try:\n",
    "        popt, pcov = curve_fit(exponential_func, target_lengths, generations_taken, p0=[1, 0.1])\n",
    "        a_fit, b_fit = popt\n",
    "        print(f\"\\nFitted exponential function: y = {a_fit:.2f} * exp({b_fit:.2f} * x)\")\n",
    "\n",
    "        # Generate points for the fitted curve\n",
    "        x_fit = np.linspace(min(target_lengths), max(target_lengths), 100)\n",
    "        y_fit = exponential_func(x_fit, a_fit, b_fit)\n",
    "\n",
    "        # Create the plot\n",
    "        fig, ax = plt.subplots(figsize=(10, 6))\n",
    "        ax.plot(target_lengths, generations_taken, marker='o', linestyle='-', color='blue', label='Actual Generations')\n",
    "        ax.plot(x_fit, y_fit, linestyle='--', color='red', label='Exponential Fit')\n",
    "\n",
    "        # Add labels and title\n",
    "        ax.set_title('Generations Required vs. Target Square Length with Exponential Fit')\n",
    "        ax.set_xlabel('Target Square Length')\n",
    "        ax.set_ylabel('Generations Taken')\n",
    "        ax.set_xticks(target_lengths)\n",
    "        ax.grid(True)\n",
    "        ax.legend()\n",
    "\n",
    "        plt.tight_layout()\n",
    "        plt.show()\n",
    "\n",
    "    except RuntimeError as e:\n",
    "        print(f\"\\nCould not fit exponential model: {e}\")\n",
    "        # If fitting fails, just plot the original data as a fallback\n",
    "        fig, ax = plt.subplots(figsize=(10, 6))\n",
    "        ax.plot(target_lengths, generations_taken, marker='o', linestyle='-', color='blue')\n",
    "        ax.set_title('Generations Required vs. Target Square Length (Fitness >= 0.95)')\n",
    "        ax.set_xlabel('Target Square Length')\n",
    "        ax.set_ylabel('Generations Taken')\n",
    "        ax.set_xticks(target_lengths)\n",
    "        ax.grid(True)\n",
    "        plt.tight_layout()\n",
    "        plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "UOvKKCuBF1Te"
   },
   "source": [
    "**Recommendation for running the program.** Change the seed of the random generator in line 363 to see a new output.\n",
    "\n",
    "**Unconformity.** We feel very uncomfortable with the Evolutionary Process that creates a mesh. This is contrary to the orderly process that we expect.\n",
    "\n",
    "**Observation:** The exponential fit looks good. This means that the cost that Evolution must pay to fit a square of length $n$ is an exponential function in $n$.\n",
    "\n",
    "**Observations by Gemini about the disproportionate growth of cost by length 6 and 7.**\n",
    ">\n",
    "> The disproportionate growth in generations taken for target length 6, compared to lengths 2, 3, 4, and 5, can be attributed to several factors:\n",
    ">\n",
    "> 1. Increased Search Space Complexity: As the target square's side length increases, the number of possible configurations for a tree to perfectly fill that square grows exponentially. Length 6 represents a significantly larger and more complex target than length 5, making it harder for the evolutionary algorithm to find an optimal solution quickly.\n",
    ">\n",
    "> 2. Edge Cases and Connectivity: Filling a square perfectly requires precise placement and connectivity of nodes. For larger squares, the boundary conditions and the need to connect distant parts of the square become more challenging for the random generation, mutation, and crossover operations to consistently achieve.\n",
    ">\n",
    "> 3. Local Optima: The evolutionary algorithm might get trapped in local optima, where trees are highly fit for a portion of the target square but struggle to adapt to fill the remaining areas without significant changes that are unlikely to occur through random mutations or crossovers in a reasonable number of generations.\n",
    ">\n",
    "> 4. Parameter Tuning Limitations: While POPULATION_SIZE and GENERATIONS_PER_TARGET were increased, these parameters might still be insufficient to consistently overcome the increased complexity for length 6 within the given number of generations. The MUTATION_RATE and CROSSOVER_RATE also play a crucial role, and their current values might not be ideal for navigating the larger search space effectively for length 6.\n",
    ">\n",
    "> 5. Stagnation of Evolution: For length 6, the algorithm might have experienced periods of stagnation where the fitness improvements were minimal across many generations, indicating that the population might not be exploring new, promising regions of the solution space efficiently enough.\n",
    "\n",
    "**Exercise.** Express your opinion about the most important factor that causes cost overgrowing.\n",
    ">\n",
    "> *Answer.*  As the length of the square grows, we need longer trees. This implies an exponential number of nodes to work with, and also an exponential number of insertion modes of the tree into the plane. In fact, the number of nodes grows exponentially because reproduction generates an exponential number of children. Also, the number of modes of representation in a plane of a tree is related to permutations, which are count by factorials that are related to exponentials, according to the Stirling formula. Thus, the search space also growths exponentially. The search cannot be a shallow one because the stringent conditions on the edges of the target square.\n",
    "\n",
    "\n",
    "**Rejection of the printing model.** Colab has troubles running the program to fit a square of edge 7. From this difficulty, it must be clear that the Printing Model of Morphogenesis has nothing to do with Biology. Or, how can we explain the form of the humerus or a hip, each one with millions of cells?\n",
    "\n",
    "Let us research the literature to see what can we learn.\n",
    "\n",
    "**Exercise.** Make a literature review of the synthesis of the form of bones and extract ideas that could guide simple and realizable simulations.\n",
    ">\n",
    "> *Answer.* Following an indication of Google, we browsed the following documents:\n",
    "\n",
    "- Wikipedia contributors. (2026, July 13). Hox gene. In Wikipedia, The Free Encyclopedia. Retrieved 13:32, July 24, 2026, from https://en.wikipedia.org/w/index.php?title=Hox_gene&oldid=1363987412\n",
    "\n",
    "- Wikipedia contributors. (2025, September 8). Discredited hypotheses for the Cambrian explosion. In Wikipedia, The Free Encyclopedia. Retrieved 13:33, July 24, 2026, from https://en.wikipedia.org/w/index.php?title=Discredited_hypotheses_for_the_Cambrian_explosion&oldid=1310220744\n",
    "\n",
    "- Eyal S, Kult S, Rubin S, Krief S, Felsenthal N, Pineault KM, Leshkowitz D, Salame TM, Addadi Y, Wellik DM, Zelzer E. Bone morphology is regulated modularly by global and regional genetic programs. Development. 2019 Jul 26;146(14):dev167882. doi: 10.1242/dev.167882. PMID: 31221640; PMCID: PMC6679367. https://pubmed.ncbi.nlm.nih.gov/31221640/\n",
    "\n",
    "\n",
    "- Gerard Karsently, Erwin F. Wagner (2002). Reaching a Genetic and Molecular Understanding of Skeletal Development. Developmental Cell. Volume 2, Issue 4, April 2002, Pages 389-406 https://doi.org/10.1016/S1534-5807(02)00157-0\n",
    "\n",
    "Our critical review is the following:\n",
    "\n",
    "Everything about biological shape is by far much more complex than one would desire. Complexity arises from the large quantity of actors and of the intricacies of their interaction. Just let us point out that all types of cells come from a single cell, the zygote, through a process of reproduction with differentiation, death and replacement by local division or by migrants of another type of cell from afar.  \n",
    "\n",
    "Some points that might give rise to ideas for simple simulations are the following:\n",
    "\n",
    "- Do not try to produce giant structures at once. Instead, make a tiny model and enlarge it. So, babies are extremely similar to adults.\n",
    "\n",
    "- Do not program specificities from the start. Rather, build complexity by modification of extant material in an extension as large as possible. This is the epistatic mode of building complexity, making modifications over modifications.\n",
    "\n",
    "- Bone shape is formed under the influx of genes that work under hierarchy for both temporal trends and spatial patterns of module formation.  The whole system is regulated genetically by hormones, with global effect, and by specific genes, with distal and proximal effects that produce molecules that are targeted to neighboring cells. Astonishingly, the whole process of morphogenesis is triggered by maternal mRNA and influenced by various types of maternal proteins. This is contrary to the default belief that the DNA contains the information to create life. This is false. The truth is that the DNA contains information only to continue life.\n",
    "\n",
    "- The most studied genes are the *homeobox* family that specify the order of parts of the body plan along the axis defined by the vertebral spine of animals.  \n",
    "\n",
    "- Predictions of the Evolutionary Theory: if the system of shape formation appeared by Evolution, there must be diverse radiations of new species (true) that modify lower levels more frequently than higher ones (true), and a massive production of ill made fossils of every kind (false).\n",
    "\n",
    "- One usual mechanism of epistasis in the formation of shape is similar to drawing over a sheet of paper. This represents a background tissue, and the drawing is made by a messenger molecule that modifies a group of cells. For example, the messenger can cause cells to strongly adhere one to another to form, say, a metacarpal bone. If two separate structures are needed, for instance maxilla and mandible, or in a joint, separation is obtained through induction of apoptosis or suicide of intermediate cells.\n",
    "\n",
    "- Activation or inhibition of shape genes depends on the concentration of diverse proteins, some of which are of maternal origin. For example, a high concentration of one protein together with a low concentration of another can serve as a switch signal for a specific gene. And, how are large regions of tissue regulated? By gradients of proteins that are produced by specific centers that are located, maybe, in distant places. Fingers are formed in this way plus the drawing mechanism.\n",
    "\n",
    "- Bones are dynamic structures that seem to be in equilibrium by a birth-death process. Osteoclasts are responsible for mineral degradation, while repair comes from reproduction and differentiation of cells. For instance, the feminine hormone estrogen brakes the action of osteoclasts so, when the woman gets old, this braking activity diminishes, and bones lose mineral substrate. As a consequence, osteoporosis appears.\n",
    "\n",
    "While the general frame of bone formation is sufficiently understood, no one knows how specific shapes are determined."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "WlnMy5s7MgOQ"
   },
   "source": [
    "**Exercise.** Using the ideas of your review, propose a simple model to synthesize the form of a square of whatever length.\n",
    ">\n",
    "> *Answer.* We present two models. The first is based on messengers that produce inhibition of growth in the immediate neighborhood. The second is based on messengers that act over the cells around which their concentration is high enough.\n",
    "\n",
    "\n",
    "## The inhibitor model\n",
    "\n",
    "We are born small and with time get enlarged while the fundamental traits are conserved. Let us turn this fact into a model for generating form.\n",
    "\n",
    "**Example.** Let us show how we can generate a large square by enlarging a small one. This means to add cells in a given fashion to produce squares larger and larger. Our key point is that we use a messenger that inhibits the growth of cells.\n",
    "\n",
    "The *inhibitor model* to build a squared shape in silico is the following:\n",
    "\n",
    "1. Each cell is squared and occupies one unit square.\n",
    "2. All cells, young and old alike, excrete a molecule that is a messenger that says: *This place is already occupied.* This messenger inhibits division when it is found in very high concentration, say, when a neighboring site is occupied.\n",
    "3. Each mature cell divides and gives origin to a daughter that fills the void in one neighboring square that is not chosen at random. Instead, the space of less concentration of the inhibitor messenger is chosen.\n",
    "4. Cells need time for maturation before reproduction.\n",
    "5. The process begins with one primordial cell that has a squared shape. So, for a while, the only cell that reproduces is the primordial one, and it can do so sufficient times to fill all of its neighborhood before daughters mature. Diagonal cells can eventually be generated by daughter cells. If a problem with double generation is found, apoptosis is used to resolve the conflict. The final result is a square of side 3.\n",
    "6. In a second round, the external cells of the square of side 3 get divided. Each daughter immediately fills the square in front. Diagonal cells may appear by reproduction of the daughters once they mature. The result is another populated row around the square of side 3 forming a square of side 5. And so on.\n",
    "7. The system of cells can count how many divisions have occurred since the primordial cell. Human cells can divide between 40 and 60 times. The mechanism is through deletion of some final sequence in the telomeres, the terminal ends of chromosomes, after each cellular division.\n",
    "8. Cells divide on until the predefined division limit is achieved. When this happens, the process stops and the final shape freezes.\n",
    "\n",
    "**Exercise.** Simulate the inhibitor model to build a squared shape.\n",
    ">\n",
    "> *Answer.* We asked Colab to develop the simulation of the inhibitor model. Its answer was:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "executionInfo": {
     "elapsed": 5296,
     "status": "ok",
     "timestamp": 1788365626230,
     "user": {
      "displayName": "jose rodriguez",
      "userId": "08454562216435392883"
     },
     "user_tz": 300
    },
    "id": "_ANzidHlkMgU",
    "outputId": "e35a91ec-49be-4a48-b4b6-d5907da80f07"
   },
   "outputs": [],
   "source": [
    "# Program inhibitor_model.py\n",
    "# Cell can reproduce if an inhibitor does not reach them.\n",
    "# A square of length 5 must be fitted by this process\n",
    "# beginning from a unitary square.\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import random\n",
    "import copy\n",
    "\n",
    "class InhibitorCell:\n",
    "    def __init__(self, x, y, generation=0, maturation_time=1):\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.generation = generation\n",
    "        self.maturation_time = maturation_time\n",
    "        self.age = 0\n",
    "        self.is_mature = False\n",
    "\n",
    "    def age_cell(self):\n",
    "        self.age += 1\n",
    "        if self.age >= self.maturation_time:\n",
    "            self.is_mature = True\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"Cell({self.x},{self.y}, Gen:{self.generation}, Age:{self.age}, Mature:{self.is_mature})\"\n",
    "\n",
    "class InhibitorModel:\n",
    "    def __init__(self, initial_cell_x=0, initial_cell_y=0, maturation_time=1):\n",
    "        self.grid = {}\n",
    "        self.cells = []\n",
    "        self.generation_count = 0\n",
    "        self.maturation_time = maturation_time\n",
    "\n",
    "        # Initialize with one primordial cell\n",
    "        primordial_cell = InhibitorCell(initial_cell_x, initial_cell_y, generation=0, maturation_time=maturation_time)\n",
    "        self.add_cell(primordial_cell)\n",
    "\n",
    "    def add_cell(self, cell):\n",
    "        self.grid[(cell.x, cell.y)] = cell\n",
    "        self.cells.append(cell)\n",
    "\n",
    "    def is_occupied(self, x, y):\n",
    "        return (x, y) in self.grid\n",
    "\n",
    "    def get_neighbors_with_concentration(self, x, y):\n",
    "        # Returns potential neighbor coordinates and a 'concentration' score\n",
    "        # Lower score means less occupied neighbors, thus a 'void' preference\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue # Exclude self\n",
    "\n",
    "                nx, ny = x + dx, y + dy\n",
    "                concentration = 0\n",
    "                # Check direct neighbors of the potential neighbor\n",
    "                for nn_dx in [-1, 0, 1]:\n",
    "                    for nn_dy in [-1, 0, 1]:\n",
    "                        if nn_dx == 0 and nn_dy == 0:\n",
    "                            continue\n",
    "                        if self.is_occupied(nx + nn_dx, ny + nn_dy):\n",
    "                            concentration += 1\n",
    "                neighbors.append(((nx, ny), concentration))\n",
    "        return neighbors\n",
    "\n",
    "    def simulate_step(self):\n",
    "        self.generation_count += 1\n",
    "        new_cells_this_step = []\n",
    "        cells_to_reproduce = []\n",
    "\n",
    "        # Age all cells\n",
    "        for cell in self.cells:\n",
    "            cell.age_cell()\n",
    "            if cell.is_mature and cell.age == self.generation_count: # Only reproduce once per maturation cycle\n",
    "                cells_to_reproduce.append(cell)\n",
    "\n",
    "        # Process reproduction\n",
    "        for mother_cell in cells_to_reproduce:\n",
    "            potential_neighbors = self.get_neighbors_with_concentration(mother_cell.x, mother_cell.y)\n",
    "\n",
    "            # Filter for unoccupied neighbors\n",
    "            unoccupied_neighbors = [(coord, conc) for coord, conc in potential_neighbors if not self.is_occupied(coord[0], coord[1])]\n",
    "\n",
    "            if unoccupied_neighbors:\n",
    "                # Choose the space of least concentration (least occupied neighbors)\n",
    "                min_concentration = min(n[1] for n in unoccupied_neighbors)\n",
    "                best_voids = [n[0] for n in unoccupied_neighbors if n[1] == min_concentration]\n",
    "\n",
    "                # If multiple best voids, choose one randomly\n",
    "                if best_voids:\n",
    "                    chosen_x, chosen_y = random.choice(best_voids)\n",
    "\n",
    "                    # Create daughter cell\n",
    "                    daughter_cell = InhibitorCell(chosen_x, chosen_y, generation=self.generation_count, maturation_time=self.maturation_time)\n",
    "                    new_cells_this_step.append(daughter_cell)\n",
    "\n",
    "        for cell in new_cells_this_step:\n",
    "            if not self.is_occupied(cell.x, cell.y): # Double check before adding\n",
    "                self.add_cell(cell)\n",
    "            # else: # Apoptosis for conflicting cells\n",
    "            #    print(f\"Conflict: Cell at ({cell.x},{cell.y}) already occupied. Apoptosis for {cell}\")\n",
    "\n",
    "        return len(new_cells_this_step) > 0\n",
    "\n",
    "    def get_current_grid_coords(self):\n",
    "        return list(self.grid.keys())\n",
    "\n",
    "# --- Plotting Function --- #\n",
    "def plot_grid(grid_coords, title, ax):\n",
    "    ax.clear()\n",
    "    if not grid_coords:\n",
    "        ax.set_title(title)\n",
    "        ax.set_aspect('equal', adjustable='box')\n",
    "        ax.set_xlim(-2, 2)\n",
    "        ax.set_ylim(-2, 2)\n",
    "        ax.grid(True)\n",
    "        return\n",
    "\n",
    "    min_x = min(c[0] for c in grid_coords) - 1\n",
    "    max_x = max(c[0] for c in grid_coords) + 2\n",
    "    min_y = min(c[1] for c in grid_coords) - 1\n",
    "    max_y = max(c[1] for c in grid_coords) + 2\n",
    "\n",
    "    for x, y in grid_coords:\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor='lightblue', edgecolor='black', linewidth=1)\n",
    "        ax.add_patch(rect)\n",
    "        ax.text(x + 0.5, y + 0.5, 'C', ha='center', va='center', color='darkblue', fontsize=8)\n",
    "\n",
    "    ax.set_xlim(min_x, max_x)\n",
    "    ax.set_ylim(min_y, max_y)\n",
    "    ax.set_xticks(range(int(min_x), int(max_x)))\n",
    "    ax.set_yticks(range(int(min_y), int(max_y)))\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "    ax.grid(True)\n",
    "    ax.set_title(title)\n",
    "\n",
    "# --- Simulation and Visualization --- #\n",
    "if __name__ == \"__main__\":\n",
    "    random.seed(42) # For reproducibility\n",
    "\n",
    "    maturation_time_param = 1 # Cells mature after 1 generation\n",
    "    model = InhibitorModel(maturation_time=maturation_time_param)\n",
    "\n",
    "    fig, ax = plt.subplots(figsize=(8, 8))\n",
    "    plt.ion() # Turn on interactive mode for live plotting\n",
    "    plt.show(block=False)\n",
    "\n",
    "    print(\"Starting inhibitor model simulation...\")\n",
    "\n",
    "    for step in range(1, 10): # Simulate for 10 steps\n",
    "        print(f\"\\n--- Simulation Step {step} ---\")\n",
    "        initial_cell_count = len(model.cells)\n",
    "        cells_added = model.simulate_step()\n",
    "\n",
    "        print(f\"Cells before reproduction: {initial_cell_count}\")\n",
    "        print(f\"Cells after reproduction: {len(model.cells)}\")\n",
    "\n",
    "        current_coords = model.get_current_grid_coords()\n",
    "        plot_grid(current_coords, f\"Inhibitor Model Growth - Step {step}\", ax)\n",
    "        fig.canvas.draw()\n",
    "        fig.canvas.flush_events()\n",
    "        plt.pause(0.5) # Pause to visualize each step\n",
    "\n",
    "        # Optional: Stop if no new cells are added, assuming stability\n",
    "        if not cells_added and step > 1: # Only stop if it's not the very first step of cell addition\n",
    "            print(\"No new cells added, model reached stable state or filled available space.\")\n",
    "            break\n",
    "\n",
    "    print(\"\\nSimulation finished.\")\n",
    "    plt.ioff() # Turn off interactive mode\n",
    "    plt.show(block=True) # Keep the final plot open"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "N4_uQ-z4uc1k"
   },
   "source": [
    "**Observation.** The printed output displayed an Evolution of a growing structure. But nothing else.\n",
    "\n",
    "We consider that there is no fundamental problem with the generation of squares by means of diffusion to first neighbors. But, what about other more complex geometries?\n",
    "\n",
    "In the next model, we rely on diffusion of messengers that enable reproduction of cells.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The Lighting Network Model of morphogenesis\n",
    "\n",
    "To the best of our imagination, we cannot figure out how to make an arbitrary shape if not with the help of trees. We already discarded the Printing Model in which the positioning of all cells is predetermined by the genetic program that determines every step of the reproduction process that is itself described by a tree. The reason is that this model demands too many resources. Influenced by the literature, we are studying the role of diffusion of messengers.\n",
    "\n",
    "**Example.** Let us propose a model for the generation of arbitrary shapes using diffusion of messengers that act wherever its concentration surpasses a given threshold.\n",
    ">>\n",
    ">> Let us think of an embryo in development that has no background tissue to modify. It just grows by cellular division, which is described by a tree. Inside it, let us suppose that there is a subtree that contains information to modify surrounding cells up to a certain radius. This is determined by a threshold in a messenger concentration.  Messengers are produced by the nodes of the subtree and diffuse towards its neighborhood. So, a node is similar to a lamp that satisfactorily illuminates its surroundings up to a certain radius. To fully illuminate a given region, we need to install a lighting network with lamps whose wattage may be different. The logic implies that the lamp power is greater where the area is greater, and diminishes in lateral branches. In the same way, to generate a region with specific cells, we need a subtree whose nodes irradiate messengers. If the concentration of the messenger is below a certain threshold, cells stop their division.\n",
    "\n",
    "**Exercise.** Adapt the model to the case in which the subtree conveys the information to modify surrounding cells of a matrix tissue.\n",
    ">\n",
    "> *Answer.* Let us consider a 2D tissue that extends over the plane. The tissue is similar to a sheet of paper divided by a rectangular matrix, in which each member square is occupied by a cell. The drawer is a tree already present in the matrix that is composed of a specific type of cell. It operates through diffusion of molecular messengers whose concentration must be above a certain threshold. When a molecule in sufficient concentration reaches a neighboring cell, it is converted into a specific type of cell. It is just like a lamp that illuminates its surrounding space, and the whole structure is like an illuminated area that changes its color according to the type of lamp.\n",
    "\n",
    "**Exercise.** Illustrate a lighting network showing the circles of influence of each node, which serve as generation center of messengers.\n",
    ">\n",
    "> *Answer.* We asked for help from Colab:\n",
    ">\n",
    "> Please, generate and draw a random spatial tree whose nodes simulate a center of diffusion of molecular messengers with a predefined radius of influence.  \n",
    ">\n",
    "> Gemini developed a code where the root had no children. Then, more children were added, and \"too much illumination\" was prevented. The final output was:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "ce994463"
   },
   "outputs": [],
   "source": [
    "# Program lighting_network.py\n",
    "# The program generates a lighting network based on a tree\n",
    "# and with lamps of different power.\n",
    "# This is a simulation of the generation of form in morphogenesis.\n",
    "# The lamps represent the nodes of the tree that can expel chemical messengers.\n",
    "# The circles represent the regions in which\n",
    "# the density of the messengers is high enough to affect the cell.\n",
    "# An affected cell can have a license to divide,\n",
    "# or, if a previous cellular matrix exists,\n",
    "# it can acquire specific characteristics proper of cell differentiation.\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "\n",
    "# Global set to store all occupied coordinates for unique cell placement\n",
    "# (No longer directly used for overlap check within tree generation, but might be useful for plotting limits)\n",
    "occupied_coords_diffusion = set()\n",
    "\n",
    "class SpatialTreeNode_Diffusion:\n",
    "    def __init__(self, value, x, y, radius, occupied_squares_set, diffusion_nodes_info):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.radius = radius\n",
    "        self.children = []\n",
    "\n",
    "        self.occupied_squares_set = occupied_squares_set\n",
    "        self.diffusion_nodes_info = diffusion_nodes_info # List of (x, y, radius) for all nodes in the tree\n",
    "\n",
    "        self.occupied_squares_set.add((x, y)) # Add current node's (x,y) square to the set\n",
    "        self.diffusion_nodes_info.append((x, y, radius)) # Add current node's (x,y,radius) to the list\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode_Diffusion):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode_Diffusion\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue  # Exclude the current square itself\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def _is_diffusion_overlapping(self, potential_nx, potential_ny, potential_radius, overlap_factor):\n",
    "        \"\"\"\n",
    "        Checks if a potential new node's diffusion circle overlaps \"too much\" with existing nodes.\n",
    "        \"Too much overlap\" is defined by the overlap_factor.\n",
    "        \"\"\"\n",
    "        potential_center_x, potential_center_y = potential_nx + 0.5, potential_ny + 0.5\n",
    "\n",
    "        for ex, ey, er in self.diffusion_nodes_info:\n",
    "            # Skip checking against self if self is already in diffusion_nodes_info\n",
    "            if (ex, ey) == (self.x, self.y):\n",
    "                continue\n",
    "\n",
    "            existing_center_x, existing_center_y = ex + 0.5, ey + 0.5\n",
    "\n",
    "            # Calculate distance between centers\n",
    "            distance = np.sqrt((potential_center_x - existing_center_x)**2 + (potential_center_y - existing_center_y)**2)\n",
    "\n",
    "            # Check for significant overlap\n",
    "            # If distance is less than a fraction of the sum of radii, it's too much overlap.\n",
    "            if distance < overlap_factor * (potential_radius + er):\n",
    "                return True # Significant overlap detected\n",
    "        return False\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix, max_node_radius, overlap_factor):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "\n",
    "        # First, filter for unoccupied grid squares\n",
    "        available_square_neighbors = [coord for coord in coordinates_neighbors if coord not in self.occupied_squares_set]\n",
    "\n",
    "        valid_child_candidates = [] # Store (nx, ny, child_radius) for candidates that pass overlap check\n",
    "\n",
    "        for nx, ny in available_square_neighbors:\n",
    "            child_radius = random.uniform(0.5, max_node_radius) # Generate potential radius for this child\n",
    "            if not self._is_diffusion_overlapping(nx, ny, child_radius, overlap_factor):\n",
    "                valid_child_candidates.append((nx, ny, child_radius))\n",
    "\n",
    "        if not valid_child_candidates:\n",
    "            return None # No available neighbors that satisfy both square and diffusion overlap conditions\n",
    "\n",
    "        # Choose a random valid candidate\n",
    "        chosen_nx, chosen_ny, chosen_child_radius = random.choice(valid_child_candidates)\n",
    "\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        child_node = SpatialTreeNode_Diffusion(child_value, chosen_nx, chosen_ny, chosen_child_radius, self.occupied_squares_set, self.diffusion_nodes_info)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode_Diffusion(value={self.value}, x={self.x}, y={self.y}, R={self.radius:.2f}, children={[child.value for child in self.children]})\"\n",
    "\n",
    "\n",
    "def generate_random_diffusion_tree(\n",
    "    max_depth, max_children, max_node_radius, current_depth=0, parent_node=None, node_prefix=\"Node\",\n",
    "    occupied_squares_set=None, diffusion_nodes_info=None, overlap_factor=0.7\n",
    "):\n",
    "    if occupied_squares_set is None:\n",
    "        occupied_squares_set = set() # Initialize a new set for this tree's square coordinates\n",
    "    if diffusion_nodes_info is None:\n",
    "        diffusion_nodes_info = [] # Initialize a new list for this tree's node (x,y,radius) information\n",
    "\n",
    "    if parent_node is None:\n",
    "        # Root node at (0,0) with a random initial radius\n",
    "        node_value = f\"{node_prefix}_Root_{random.randint(0, 99)}\"\n",
    "        initial_radius = random.uniform(0.5, max_node_radius)\n",
    "        current_node = SpatialTreeNode_Diffusion(node_value, 0, 0, initial_radius, occupied_squares_set, diffusion_nodes_info)\n",
    "    else:\n",
    "        # Children are added by the parent's method, which handles their coordinates and radius\n",
    "        current_node = parent_node.add_child_in_random_neighbor(f\"{node_prefix}_{current_depth}\", max_node_radius, overlap_factor)\n",
    "        if current_node is None:\n",
    "            return None # Branch terminated if no available neighbor\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        # Ensure at least two children if max_children >= 2, else at least one if max_children = 1, else 0\n",
    "        num_children = random.randint(min(max_children, 2) if max_children > 0 else 0, max_children)\n",
    "        for _ in range(num_children):\n",
    "            generate_random_diffusion_tree(\n",
    "                max_depth, max_children, max_node_radius, current_depth + 1, current_node,\n",
    "                node_prefix, occupied_squares_set, diffusion_nodes_info, overlap_factor\n",
    "            )\n",
    "    return current_node\n",
    "\n",
    "# --- Plotting functions for Diffusion Trees ---\n",
    "def plot_diffusion_tree_nodes(node, ax):\n",
    "    if node is None:\n",
    "        return\n",
    "\n",
    "    # Plot the square representing the cell\n",
    "    rect = patches.Rectangle((node.x, node.y), 1, 1, facecolor='lightblue', edgecolor='black', linewidth=1, zorder=1)\n",
    "    ax.add_patch(rect)\n",
    "    ax.text(node.x + 0.5, node.y + 0.5, node.value.split('_')[-1], ha='center', va='center', color='darkblue', fontsize=7, zorder=2)\n",
    "\n",
    "    # Plot the circle representing the radius of influence\n",
    "    circle = patches.Circle((node.x + 0.5, node.y + 0.5), node.radius, color='red', alpha=0.2, zorder=0) # Zorder 0 to be behind squares\n",
    "    ax.add_patch(circle)\n",
    "\n",
    "    # Draw lines connecting parent to children\n",
    "    for child in node.children:\n",
    "        ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--', linewidth=0.8, zorder=3)\n",
    "        plot_diffusion_tree_nodes(child, ax)\n",
    "\n",
    "def print_diffusion_tree(node, level=0):\n",
    "    if node is None:\n",
    "        return\n",
    "    indent = \"  \" * level\n",
    "    print(f\"{indent}- {node.value} (x={node.x}, y={node.y}, R={node.radius:.2f})\")\n",
    "    for child in node.children:\n",
    "        print_diffusion_tree(child, level + 1)\n",
    "\n",
    "# --- Example Usage ---\n",
    "if __name__ == \"__main__\":\n",
    "    # Clear the global occupied_coords for each run (still useful for total count but tree logic manages its own)\n",
    "\n",
    "    # Parameters to modify\n",
    "    occupied_coords_diffusion.clear()\n",
    "    my_seed = 175\n",
    "    random.seed(my_seed) # For reproducibility\n",
    "    MAX_DEPTH = 8 # Increased for a denser tree\n",
    "    MAX_CHILDREN_PER_NODE = 3\n",
    "    MAX_NODE_RADIUS = 5.0 # Max radius of influence for nodes\n",
    "    OVERLAP_FACTOR = 0.5 # Increased to allow more overlap for a denser tree\n",
    "\n",
    "    print(f\"Generating a random diffusion tree with max_depth={MAX_DEPTH}, max_children={MAX_CHILDREN_PER_NODE}, max_node_radius={MAX_NODE_RADIUS}, overlap_factor={OVERLAP_FACTOR}\")\n",
    "    root_diffusion_tree = generate_random_diffusion_tree(\n",
    "        max_depth=MAX_DEPTH,\n",
    "        max_children=MAX_CHILDREN_PER_NODE,\n",
    "        max_node_radius=MAX_NODE_RADIUS,\n",
    "        overlap_factor=OVERLAP_FACTOR\n",
    "        # occupied_squares_set and diffusion_nodes_info are initialized within the function if None\n",
    "    )\n",
    "\n",
    "    if root_diffusion_tree:\n",
    "        print(\"\\nGenerated Diffusion Tree Structure:\")\n",
    "        print_diffusion_tree(root_diffusion_tree)\n",
    "\n",
    "        # Access the diffusion_nodes_info from the root node to get all (x,y,radius) for plotting limits\n",
    "        all_node_coords_radii = root_diffusion_tree.diffusion_nodes_info\n",
    "        all_x = [info[0] for info in all_node_coords_radii]\n",
    "        all_y = [info[1] for info in all_node_coords_radii]\n",
    "        all_radii_values = [info[2] for info in all_node_coords_radii]\n",
    "\n",
    "        # Plotting the tree with diffusion circles\n",
    "        fig, ax = plt.subplots(figsize=(10, 10))\n",
    "        ax.set_aspect('equal', adjustable='box')\n",
    "\n",
    "        plot_diffusion_tree_nodes(root_diffusion_tree, ax)\n",
    "\n",
    "        # Set plot limits based on occupied cells and radii\n",
    "        if all_x and all_y:\n",
    "            min_x_val = min(all_x) - 1\n",
    "            max_x_val = max(all_x) + 2\n",
    "            min_y_val = min(all_y) - 1\n",
    "            max_y_val = max(all_y) + 2\n",
    "\n",
    "            # Adjust limits to include max radius if it extends beyond cell coords\n",
    "            if all_radii_values:\n",
    "                # Consider the maximum extent of any circle: center + radius\n",
    "                max_extent_x = max([x + 0.5 + r for x, y, r in all_node_coords_radii])\n",
    "                min_extent_x = min([x + 0.5 - r for x, y, r in all_node_coords_radii])\n",
    "                max_extent_y = max([y + 0.5 + r for x, y, r in all_node_coords_radii])\n",
    "                min_extent_y = min([y + 0.5 - r for x, y, r in all_node_coords_radii])\n",
    "\n",
    "                min_x_val = min(min_x_val, min_extent_x - 0.5) # Add some padding\n",
    "                max_x_val = max(max_x_val, max_extent_x + 0.5)\n",
    "                min_y_val = min(min_y_val, min_extent_y - 0.5)\n",
    "                max_y_val = max(max_y_val, max_extent_y + 0.5)\n",
    "\n",
    "            ax.set_xlim(min_x_val, max_x_val)\n",
    "            ax.set_ylim(min_y_val, max_y_val)\n",
    "\n",
    "            # Set sensible ticks\n",
    "            ax.set_xticks(range(int(min_x_val) - 1, int(max_x_val) + 1))\n",
    "            ax.set_yticks(range(int(min_y_val) - 1, int(max_y_val) + 1))\n",
    "\n",
    "        ax.grid(True)\n",
    "        ax.set_title(\"Random Spatial Tree with Diffusion Circles (Overlap Restricted)\")\n",
    "        plt.xlabel(\"X Coordinate\")\n",
    "        plt.ylabel(\"Y Coordinate\")\n",
    "        plt.show()\n",
    "    else:\n",
    "        print(\"Could not generate a diffusion tree.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "6wxYykt3O7XE"
   },
   "source": [
    "*Observations.*\n",
    "\n",
    "1. The program has various parameters, line 162 and below, that one can change to see the effect. The most important one is the seed for the random generator that produces different patterns if one changes it in line 163. If a graphic likes you, you can reproduce it with the corresponding seed.\n",
    "2. If the messengers convey a license for reproduction, the read area is intended to be the final morph. When we have a cellular matrix, the read area represents the differentiated structure.\n",
    "3. The model seems to be reach enough to be an acceptable candidate of generator of shape. That is why we present the following\n",
    "\n",
    "**Definition.** A morphological tree is a tree that implements a lighting or morphological network, in which each node can produce molecules that can command other cells to follow a predefined behavior if the concentration of the messenger is higher than a given threshold.\n",
    "\n",
    "Let us explore now the possibilities that Evolution has to explain our morphology.\n",
    "\n",
    "## Evolution of morphological trees\n",
    "\n",
    "According to the Evolutionary Theory and in strict sense, the only function of living beings is to reproduce. Biochemical tests and mathematical models represent an effort to assign function to substructures, say, to prove that the mitochondrion breathes and produces ATP. What is the function of a given bone? Its function is to co-form an ensemble that permits movement. Biomechanics suggest sub-functions to, say, the spine: it serves as shaft for the whole body to move as a unity.\n",
    "\n",
    "By looking to a playful baby cat, one immediately sees what a marvel it is. From this, we infer that the present state of the art of morphology in living beings is beyond excellence. This is another form of saying that we have no idea as how to design a skeleton and the only thing that we can do is to take each bone as the optimal option. This seems to be a good election because many robots look just as we.\n",
    "\n",
    "**Exercise.** Express your opinion about the question: Can Evolution explain our morphology?\n",
    ">\n",
    "> *Answer.* Yes. Evolution can explain our morphology in a universe of unbounded resources and infinite time.\n",
    "\n",
    "**Exercise.** Convert the idea that Evolution is the creator of our morphology into a scientific inquiry. This implies reproducibility under the habitual constraints of resources in our planet Earth, time included.\n",
    ">\n",
    "> *Answer.* We give to Evolution the task of designing a lighting network in the form of a tree to illuminate a given area with a specific shape that is predefined by another tree that we call the target tree.\n",
    ">\n",
    "> Our concrete procedure is the following:\n",
    "> 1. A random morphological tree is generated. Its illuminated region is recorded as $A$. This is the target area.\n",
    "> 2. We give to Evolution the task of illuminate $A$, exactly $A$. To achieve this, Evolution generates many trees and evolves them for many generations. So, if a test tree illuminates the region $B$, the error region in the illumination task is $A \\Delta  B $, where the operator $\\Delta$ produces the set that contains all the elements that are only in $A$ together with those that are only in $B$. It is the natural measure of the difference between two sets. It is called the *symmetric difference*. The region $A \\Delta  B$ has an area. It is the error caused by the test tree. From this error, the fitness can be defined.\n",
    "\n",
    "To implement our project, we asked for help from Colab:\n",
    ">\n",
    "> Develop a program that generates a morphological tree together with its region of illumination. This is the target area to be illuminated. Optimize by Evolution the illumination of the target region by evolved trees. The error of a test tree is the area of the symmetric difference between the target region and the test illuminated region that is produced by the test tree. Compute the fitness of a tree from that error.\n",
    ">\n",
    "> Gemini published its answer as a separate subsection:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "00ba07aa"
   },
   "source": [
    "### Evolutionary Algorithm for the Illumination Task\n",
    "\n",
    "To address the challenge of evolving morphological trees to illuminate a specific target area, we will design an evolutionary algorithm with the following components:\n",
    "\n",
    "1.  **Target Generation**: First, a 'ground truth' morphological tree will be randomly generated, and its illuminated region will be determined. This region will serve as our target for the evolutionary process.\n",
    "\n",
    "2.  **Individual Representation**: Each individual in our population will be a `SpatialTreeNode_Diffusion` (or a similar class), representing a morphological tree. Its genotype will implicitly include its structure (nodes, children, positions) and the radii of its nodes.\n",
    "\n",
    "3.  **Fitness Function**: The fitness of a candidate tree will be inversely proportional to the area of the symmetric difference between its illuminated region and the target illuminated region. A smaller symmetric difference means a better fit and thus higher fitness.\n",
    "\n",
    "    *   **Symmetric Difference**: This is the area of pixels that are illuminated by *either* the target *or* the candidate tree, but not both. It effectively measures the 'error' in illumination.\n",
    "\n",
    "4.  **Population Initialization**: We will create an initial population of `N` random `SpatialTreeNode_Diffusion` trees. These trees will be generated with random structures (depth, number of children) and random node radii, similar to previous exercises.\n",
    "\n",
    "5.  **Selection**: Parents for the next generation will be selected based on their fitness. Higher-fitness individuals will have a greater chance of being selected (e.g., using tournament selection).\n",
    "\n",
    "6.  **Crossover (Recombination)**: New individuals (offspring) will be created by combining genetic material from two parent trees. A common approach for tree structures is to swap subtrees between parents. This might involve deep copying subtrees and reattaching them.\n",
    "\n",
    "7.  **Mutation**: To introduce diversity and explore new parts of the search space, individuals will undergo mutation. This can include:\n",
    "    *   Adding a new child node to an existing node.\n",
    "    *   Removing an existing child node.\n",
    "    *   Changing the radius of an existing node.\n",
    "    *   Slightly perturbing the (x, y) coordinates of a node (within bounds).\n",
    "\n",
    "8.  **Simulation Loop**: The algorithm will run for a fixed number of generations or until a satisfactory fitness level is reached.\n",
    "\n",
    "    *   In each generation:\n",
    "        *   Calculate fitness for all individuals.\n",
    "        *   Select parents.\n",
    "        *   Perform crossover to create offspring.\n",
    "        *   Perform mutation on offspring.\n",
    "        *   Form the new population from selected parents and/or offspring.\n",
    "\n",
    "**Corrections.** Gemini developed the corresponding program. An inconsistency was found. It was reported to Gemini with the following message:\n",
    ">\n",
    "> Please, help me with the following inconsistency: The circle of illumination and the region of the illuminated cells do not correspond one to another in the graphic of the Best Evolved Tree (Fitness: 0.7321) of the last program. For instance, the square (2,0) is illuminated but is not reported.\n",
    ">\n",
    "> Gemini responded:\n",
    ">>\n",
    ">> I understand the inconsistency you're seeing. To address this, I'll increase the illumination_resolution in the GA_PARAMS. This parameter controls how many points are sampled within each unit square to determine if it's illuminated. A higher resolution should lead to a more accurate calculation of the `evolved_best_area`, ensuring that squares that are visually illuminated by a diffusion circle are also reported as such. I will set the resolution to 200.\n",
    ">\n",
    "> The plan was approved, implemented and ran. It was tested ten times using 2 generations, population size 10, and different seeds for the Random Generator. No error was found.\n",
    ">\n",
    "> Much later, the problem was found anew in another example. My report was:\n",
    ">\n",
    "> Please, help me again with this trouble: in the graphic of the best Evolved Tree (Fitness: 1.0000) that was output by the previous program there are various cells that are illuminated but not recolored with an intense color.\n",
    ">\n",
    "> Gemini responded:\n",
    ">>\n",
    ">> You're right, the illuminated cells weren't standing out as much as they should. I've adjusted the plotting function to make the illuminated areas appear with a more intense color. This should make the visualization clearer.\n",
    "\n",
    "The plan was approved, implemented, two syntactic errors were corrected, and then ran with the same parameters as before. Our diagnostics is that the fitness function has a small error. If it is corrected, the program must produce a quite different input.\n",
    "\n",
    "Result: the program repeated the same steps as before until generation 3 and then another path was taken.\n",
    "\n",
    "Assessment: Since the program followed a different path than before, we considered that a correction was made. But, we had troubles with the dark colors of rectangles that do not let the colors of the circles to be perceived. After a long negotiation, including colors and incongruences, we ended with the following program:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "executionInfo": {
     "elapsed": 25826966,
     "status": "ok",
     "timestamp": 1785782106347,
     "user": {
      "displayName": "jose rodriguez",
      "userId": "08454562216435392883"
     },
     "user_tz": 300
    },
    "id": "fbe90c4d",
    "outputId": "d1551bc8-6f10-46cc-dfc0-a7c0f96e8ee6"
   },
   "outputs": [],
   "source": [
    "# Program evolution_of_morphological_trees.py\n",
    "# Morphological trees considered here are like lighting trees:\n",
    "# a tree extends the electrical thread and at each node there is lamp.\n",
    "# Each lamp has a given power and a circle of illumination,\n",
    "# whose radius is determined by a threshold intensity.\n",
    "# In morphology, this corresponds with a threshold concentration of a messenger.\n",
    "# Evolution is given the task of illuminating\n",
    "# the area determined by a random tree.\n",
    "\n",
    "\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "from numpy import array as Array\n",
    "import copy # For deep copying trees during reproduction and mutation\n",
    "import sys # Import sys module to adjust recursion limit\n",
    "\n",
    "sys.setrecursionlimit(3000) # Increase the recursion limit for potentially deep trees\n",
    "\n",
    "# --- SPATIAL TREE NODE FOR DIFFUSION ---\n",
    "\n",
    "class SpatialTreeNode_Evolution_Diffusion:\n",
    "    def __init__(self, value, x, y, radius, occupied_squares_set, diffusion_nodes_info):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "\n",
    "        self.radius = radius\n",
    "        self.occupied_squares_set = occupied_squares_set  # Reference to the set of squares occupied by *this* tree's nodes\n",
    "        self.diffusion_nodes_info = diffusion_nodes_info  # Reference to the list of (x,y,radius) for *all* nodes in *this* tree\n",
    "\n",
    "        self.occupied_squares_set.add((x, y))  # Add current node's (x,y) square to the set\n",
    "        self.diffusion_nodes_info.append((x, y, radius))  # Add current node's (x,y,radius) to the list\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode_Evolution_Diffusion):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode_Evolution_Diffusion\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue  # Exclude the current square itself\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def _is_diffusion_overlapping_local(self, potential_nx, potential_ny, potential_radius, overlap_factor):\n",
    "        \"\"\"\n",
    "        Checks if a potential new node's diffusion circle overlaps \"too much\" with EXISTING nodes IN THE SAME TREE.\n",
    "        \"Too much overlap\" is defined by the overlap_factor.\n",
    "        \"\"\"\n",
    "        potential_center_x, potential_center_y = potential_nx + 0.5, potential_ny + 0.5\n",
    "\n",
    "        for ex, ey, er in self.diffusion_nodes_info:\n",
    "            # Skip checking against self if self is already in diffusion_nodes_info\n",
    "            if (ex, ey) == (self.x, self.y):\n",
    "                continue\n",
    "\n",
    "            existing_center_x, existing_center_y = ex + 0.5, ey + 0.5\n",
    "\n",
    "            # Calculate distance between centers\n",
    "            distance = np.sqrt((potential_center_x - existing_center_x)**2 + (potential_ny - existing_center_y)**2)\n",
    "\n",
    "            # Check for significant overlap\n",
    "            # If distance is less than a fraction of the sum of radii, it's too much overlap.\n",
    "            if distance < overlap_factor * (potential_radius + er):\n",
    "                return True # Significant overlap detected\n",
    "        return False\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix, max_node_radius, overlap_factor):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "\n",
    "        # First, filter for unoccupied grid squares *within this tree*\n",
    "        available_square_neighbors = [coord for coord in coordinates_neighbors if coord not in self.occupied_squares_set]\n",
    "\n",
    "        valid_child_candidates = []  # Store (nx, ny, child_radius) for candidates that pass overlap check\n",
    "\n",
    "        for nx, ny in available_square_neighbors:\n",
    "            # Generate potential radius for this child, ensuring it's not too large or small\n",
    "            child_radius = random.uniform(0.5, max_node_radius)\n",
    "            if not self._is_diffusion_overlapping_local(nx, ny, child_radius, overlap_factor):\n",
    "                valid_child_candidates.append((nx, ny, child_radius))\n",
    "\n",
    "        if not valid_child_candidates:\n",
    "            return None  # No available neighbors that satisfy both square and diffusion overlap conditions\n",
    "\n",
    "        # Choose a random valid candidate\n",
    "        chosen_nx, chosen_ny, chosen_child_radius = random.choice(valid_child_candidates)\n",
    "\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        # Create child node; its __init__ will update occupied_squares_set and diffusion_nodes_info\n",
    "        child_node = SpatialTreeNode_Evolution_Diffusion(child_value, chosen_nx, chosen_ny, chosen_child_radius, self.occupied_squares_set, self.diffusion_nodes_info)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def get_all_nodes(self):\n",
    "        all_nodes = []\n",
    "        stack = [self]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            all_nodes.append(node)\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "        return all_nodes\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode_Evolution_Diffusion(value={self.value}, x={self.x}, y={self.y}, R={self.radius:.2f}, children={[child.value for child in self.children]!r})\"\n",
    "\n",
    "\n",
    "# --- TREE GENERATION ---\n",
    "\n",
    "def generate_random_spatial_tree_diffusion(\n",
    "    max_depth, max_children, max_node_radius, initial_x, initial_y, node_prefix=\"Node\",\n",
    "    current_depth=0, parent_node=None, occupied_squares_set=None, diffusion_nodes_info=None, overlap_factor=0.7\n",
    "):\n",
    "    if occupied_squares_set is None:\n",
    "        occupied_squares_set = set() # Initialize a new set for this tree's square coordinates\n",
    "    if diffusion_nodes_info is None:\n",
    "        diffusion_nodes_info = [] # Initialize a new list for this tree's node (x,y,radius) information\n",
    "\n",
    "    if parent_node is None:\n",
    "        # Root node at (initial_x, initial_y) with a random initial radius\n",
    "        node_value = f\"{node_prefix}_Root_{random.randint(0, 99)}\"\n",
    "        initial_radius = random.uniform(0.5, max_node_radius)\n",
    "        current_node = SpatialTreeNode_Evolution_Diffusion(node_value, initial_x, initial_y, initial_radius, occupied_squares_set, diffusion_nodes_info)\n",
    "    else:\n",
    "        # Children are added by the parent's method, which handles their coordinates and radius\n",
    "        current_node = parent_node.add_child_in_random_neighbor(f\"{node_prefix}_{current_depth}\", max_node_radius, overlap_factor)\n",
    "        if current_node is None:\n",
    "            return None # Branch terminated if no available neighbor\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        num_children = random.randint(0, max_children) # Random number of children for this node\n",
    "        for _ in range(num_children):\n",
    "            generate_random_spatial_tree_diffusion(\n",
    "                max_depth, max_children, max_node_radius, initial_x, initial_y, node_prefix,\n",
    "                current_depth + 1, current_node, occupied_squares_set, diffusion_nodes_info, overlap_factor\n",
    "            )\n",
    "    return current_node\n",
    "\n",
    "\n",
    "# --- ILLUMINATION AND FITNESS FUNCTIONS ---\n",
    "\n",
    "def get_illuminated_area(tree_root, resolution=100):\n",
    "    \"\"\"\n",
    "    Calculates the set of (x,y) integer coordinates illuminated by the tree.\n",
    "    resolution: determines how many points to sample within a unit square to check illumination.\n",
    "    \"\"\"\n",
    "    if tree_root is None:\n",
    "        return set()\n",
    "\n",
    "    illuminated_coords = set()\n",
    "    all_nodes_info = tree_root.diffusion_nodes_info # (x, y, radius) for all nodes in the tree\n",
    "\n",
    "    # Determine the bounding box for efficient sampling\n",
    "    all_x = [info[0] for info in all_nodes_info]\n",
    "    all_y = [info[1] for info in all_nodes_info]\n",
    "    all_radii = [info[2] for info in all_nodes_info]\n",
    "\n",
    "    if not all_x or not all_y:\n",
    "        return set()\n",
    "\n",
    "    min_x_bound = int(min(x - r for x, _, r in all_nodes_info)) - 1\n",
    "    max_x_bound = int(max(x + r for x, _, r in all_nodes_info)) + 1\n",
    "    min_y_bound = int(min(y - r for _, y, r in all_nodes_info)) - 1\n",
    "    max_y_bound = int(max(y + r for _, y, r in all_nodes_info)) + 1\n",
    "\n",
    "    # Iterate through potential integer square coordinates within the bounding box\n",
    "    for ix in range(min_x_bound, max_x_bound + 1):\n",
    "        for iy in range(min_y_bound, max_y_bound + 1):\n",
    "            # Sample points within this unit square\n",
    "            is_square_illuminated = False\n",
    "            for i in range(resolution):\n",
    "                for j in range(resolution):\n",
    "                    sample_x = ix + (i / resolution)\n",
    "                    sample_y = iy + (j / resolution)\n",
    "\n",
    "                    for node_x, node_y, node_radius in all_nodes_info:\n",
    "                        center_x, center_y = node_x + 0.5, node_y + 0.5\n",
    "                        distance = np.sqrt((sample_x - center_x)**2 + (sample_y - center_y)**2)\n",
    "                        if distance <= node_radius:\n",
    "                            is_square_illuminated = True\n",
    "                            break\n",
    "                if is_square_illuminated:\n",
    "                    break\n",
    "            if is_square_illuminated:\n",
    "                illuminated_coords.add((ix, iy))\n",
    "\n",
    "    return illuminated_coords\n",
    "\n",
    "def calculate_fitness_illumination(candidate_tree_root, target_illuminated_area):\n",
    "    \"\"\"\n",
    "    Calculates fitness based on the symmetric difference between illuminated areas.\n",
    "    Fitness is 1.0 for a perfect match, and decreases as symmetric difference increases.\n",
    "    \"\"\"\n",
    "    if candidate_tree_root is None:\n",
    "        # If the tree generation failed, assign a very low fitness\n",
    "        return 0.0001 # A small non-zero value to avoid division by zero issues later\n",
    "\n",
    "    candidate_illuminated_area = get_illuminated_area(candidate_tree_root)\n",
    "\n",
    "    # Symmetric difference: (A U B) - (A intersect B)\n",
    "    # Or, the elements in A but not B, plus elements in B but not A.\n",
    "    symmetric_difference = candidate_illuminated_area.symmetric_difference(target_illuminated_area)\n",
    "\n",
    "    # Union size: used for normalization\n",
    "    union_size = len(candidate_illuminated_area.union(target_illuminated_area))\n",
    "\n",
    "    if union_size == 0:\n",
    "        if not target_illuminated_area and not candidate_illuminated_area:\n",
    "            return 1.0 # Perfect match if both are empty\n",
    "        else:\n",
    "            return 0.0001 # Should not happen if target is non-empty, but handles cases where both are empty but expected non-empty\n",
    "\n",
    "    # Fitness is 1.0 - (len(symmetric_difference) / union_size)\n",
    "    # This gives 1.0 for a perfect match (symmetric_difference_area = 0)\n",
    "    # and approaches 0.0 for large differences.\n",
    "    fitness = 1.0 - (len(symmetric_difference) / union_size)\n",
    "    return max(0.0001, fitness) # Ensure fitness is always positive\n",
    "\n",
    "\n",
    "# --- EVOLUTIONARY ALGORITHM COMPONENTS ---\n",
    "\n",
    "def create_initial_population_diffusion(pop_size, max_depth, max_children, max_node_radius, initial_x, initial_y, overlap_factor, node_prefix=\"Individual\"):\n",
    "    population = []\n",
    "    for i in range(pop_size):\n",
    "        # Each tree needs its own occupied_squares_set and diffusion_nodes_info for independent generation\n",
    "        occupied_squares = set()\n",
    "        diffusion_info = []\n",
    "        tree = generate_random_spatial_tree_diffusion(\n",
    "            max_depth=max_depth, max_children=max_children, max_node_radius=max_node_radius,\n",
    "            initial_x=initial_x, initial_y=initial_y, node_prefix=f\"{node_prefix}_{i}\",\n",
    "            occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info, overlap_factor=overlap_factor\n",
    "        )\n",
    "        if tree:\n",
    "            population.append(tree)\n",
    "    # If not enough trees generated due to space constraints, fill with more random ones (or handle error)\n",
    "    while len(population) < pop_size:\n",
    "        occupied_squares = set()\n",
    "        diffusion_info = []\n",
    "        new_tree = generate_random_spatial_tree_diffusion(\n",
    "            max_depth=max_depth, max_children=max_children, max_node_radius=max_node_radius,\n",
    "            initial_x=initial_x, initial_y=initial_y, node_prefix=f\"RandomFill_{len(population)}\",\n",
    "            occupied_squares_set=occupied_squares, diffusion_info=diffusion_info,\n",
    "            overlap_factor=overlap_factor\n",
    "        )\n",
    "        if new_tree:\n",
    "            population.append(new_tree)\n",
    "        else:\n",
    "            # Handle case where a new tree could not be generated\n",
    "            # This might happen if parameters are too restrictive or space is exhausted\n",
    "            break # Exit if we can't generate enough valid trees\n",
    "    return population\n",
    "\n",
    "def select_parents_diffusion(population, fitness_scores, num_parents):\n",
    "    parents = []\n",
    "    # Use roulette wheel selection or tournament selection. Tournament is generally robust.\n",
    "    for _ in range(num_parents):\n",
    "        tournament_size = min(5, len(population))\n",
    "        if tournament_size == 0:\n",
    "            break\n",
    "        tournament_candidates = random.sample(list(zip(population, fitness_scores)), tournament_size)\n",
    "        winner = max(tournament_candidates, key=lambda x: x[1])[0]\n",
    "        parents.append(winner)\n",
    "    return parents\n",
    "\n",
    "def mutate_tree_diffusion(tree_root, max_depth, max_children, max_node_radius, mutation_rate, overlap_factor):\n",
    "    mutated_tree = copy.deepcopy(tree_root) # Work on a deep copy\n",
    "    all_nodes = mutated_tree.get_all_nodes()\n",
    "\n",
    "    if not all_nodes:\n",
    "        return mutated_tree\n",
    "\n",
    "    node_to_mutate = random.choice(all_nodes)\n",
    "\n",
    "    # Mutation 1: Add a child\n",
    "    if random.random() < mutation_rate:\n",
    "        # Need to regenerate the local_occupied_set and diffusion_nodes_info for the deepcopy\n",
    "        # This is a bit inefficient but ensures correctness after deepcopy/mutation operations\n",
    "        temp_occupied_set = set()\n",
    "        temp_diffusion_info = []\n",
    "        # Re-populate temp_occupied_set and temp_diffusion_info by traversing the deepcopied tree\n",
    "        stack = [mutated_tree]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            temp_occupied_set.add((node.x, node.y))\n",
    "            temp_diffusion_info.append((node.x, node.y, node.radius))\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "\n",
    "        # Now, try to add a child to the chosen node\n",
    "        node_to_mutate.occupied_squares_set = temp_occupied_set # Update reference for chosen node\n",
    "        node_to_mutate.diffusion_nodes_info = temp_diffusion_info # Update reference for chosen node\n",
    "\n",
    "        node_to_mutate.add_child_in_random_neighbor(\"MutatedChild\", max_node_radius, overlap_factor)\n",
    "\n",
    "    # Mutation 2: Change node radius\n",
    "    if random.random() < mutation_rate:\n",
    "        node_to_mutate.radius = random.uniform(0.5, max_node_radius)\n",
    "\n",
    "    # Mutation 3: Remove a child (if any)\n",
    "    if random.random() < mutation_rate and node_to_mutate.children:\n",
    "        child_to_remove = random.choice(node_to_mutate.children)\n",
    "        node_to_mutate.children.remove(child_to_remove)\n",
    "        # Note: Removing a child means its coordinates and diffusion info are no longer strictly part of the tree\n",
    "        # The fitness function will re-evaluate the actual illuminated area, handling this implicitly.\n",
    "\n",
    "    return mutated_tree\n",
    "\n",
    "def crossover_trees_diffusion(parent1_root, parent2_root, crossover_rate, max_node_radius, overlap_factor):\n",
    "    if random.random() > crossover_rate:\n",
    "        return copy.deepcopy(parent1_root), copy.deepcopy(parent2_root)\n",
    "\n",
    "    child1_root = copy.deepcopy(parent1_root)\n",
    "    child2_root = copy.deepcopy(parent2_root)\n",
    "\n",
    "    all_nodes_child1 = child1_root.get_all_nodes()\n",
    "    all_nodes_child2 = child2_root.get_all_nodes()\n",
    "\n",
    "    # Ensure there are nodes to swap beyond just the root\n",
    "    if len(all_nodes_child1) < 2 or len(all_nodes_child2) < 2:\n",
    "        return child1_root, child2_root\n",
    "\n",
    "    # Choose random nodes (not roots) to be crossover points\n",
    "    cross_point1 = random.choice([n for n in all_nodes_child1 if n != child1_root])\n",
    "    cross_point2 = random.choice([n for n in all_nodes_child2 if n != child2_root])\n",
    "\n",
    "    # Find parent of cross_point1 in child1_root tree\n",
    "    parent_cross_point1 = None\n",
    "    for node in all_nodes_child1:\n",
    "        if cross_point1 in node.children:\n",
    "            parent_cross_point1 = node\n",
    "            break\n",
    "\n",
    "    # Find parent of cross_point2 in child2_root tree\n",
    "    parent_cross_point2 = None\n",
    "    for node in all_nodes_child2:\n",
    "        if cross_point2 in node.children:\n",
    "            parent_cross_point2 = node\n",
    "            break\n",
    "\n",
    "    if parent_cross_point1 and parent_cross_point2:  # Perform swap\n",
    "        # Remove subtrees from parents\n",
    "        parent_cross_point1.children.remove(cross_point1)\n",
    "        parent_cross_point2.children.remove(cross_point2)\n",
    "\n",
    "        # Attach swapped subtrees\n",
    "        parent_cross_point1.add_child(cross_point2)\n",
    "        parent_cross_point2.add_child(cross_point1)\n",
    "\n",
    "        # After crossover, the `occupied_squares_set` and `diffusion_nodes_info` of the affected trees\n",
    "        # (child1_root, child2_root, and their subtrees) might be inconsistent.\n",
    "        # These will be implicitly re-calculated by `get_illuminated_area` for fitness evaluation.\n",
    "        # For mutation, we explicitly rebuild them (as seen in mutate_tree_diffusion).\n",
    "\n",
    "    return child1_root, child2_root\n",
    "\n",
    "\n",
    "# --- PLOTTING FUNCTIONS ---\n",
    "\n",
    "def plot_illuminated_area(ax, illuminated_coords, title, color='blue', alpha=0.5):\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "    if not illuminated_coords:\n",
    "        ax.set_title(title)\n",
    "        ax.grid(True)\n",
    "        return\n",
    "\n",
    "    for x, y in illuminated_coords:\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=0.5)\n",
    "        ax.add_patch(rect)\n",
    "\n",
    "    min_x = min(c[0] for c in illuminated_coords) - 1\n",
    "    max_x = max(c[0] for c in illuminated_coords) + 2\n",
    "    min_y = min(c[1] for c in illuminated_coords) - 1\n",
    "    max_y = max(c[1] for c in illuminated_coords) + 2\n",
    "\n",
    "    ax.set_xlim(min_x, max_x)\n",
    "    ax.set_ylim(min_y, max_y)\n",
    "    ax.set_xticks(range(int(min_x), int(max_x)))\n",
    "    ax.set_yticks(range(int(min_y), int(max_y)))\n",
    "    ax.grid(True)\n",
    "    ax.set_title(title)\n",
    "\n",
    "def plot_tree_with_illumination(tree_root, illuminated_coords, ax, tree_color='lightblue', diff_color='red', title=\"\"):\n",
    "    # Plot illuminated area first (background)\n",
    "    for x, y in illuminated_coords:\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=diff_color, alpha=0.5, zorder=0) # Changed alpha for more transparency\n",
    "        ax.add_patch(rect)\n",
    "\n",
    "    if tree_root is None:\n",
    "        return\n",
    "\n",
    "    # Plot tree nodes and their diffusion circles\n",
    "    all_nodes = tree_root.get_all_nodes()\n",
    "    for node in all_nodes:\n",
    "        # Plot the square representing the cell\n",
    "        rect = patches.Rectangle((node.x, node.y), 1, 1, facecolor=tree_color, edgecolor='black', linewidth=1, zorder=1)\n",
    "        ax.add_patch(rect)\n",
    "        ax.text(node.x + 0.5, node.y + 0.5, node.value.split('_')[-1], ha='center', va='center', color='darkblue', fontsize=7, zorder=2)\n",
    "\n",
    "        # Plot the circle representing the radius of influence\n",
    "        circle = patches.Circle((node.x + 0.5, node.y + 0.5), node.radius, color='red', alpha=0.2, zorder=2)\n",
    "        ax.add_patch(circle)\n",
    "\n",
    "    # Draw lines connecting parent to children\n",
    "    for node in all_nodes:\n",
    "        for child in node.children:\n",
    "            ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--', linewidth=0.8, zorder=3)\n",
    "\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "    ax.set_title(title)\n",
    "\n",
    "    # Set plot limits based on the illuminated coordinates\n",
    "    if illuminated_coords:\n",
    "        all_x = [c[0] for c in illuminated_coords]\n",
    "        all_y = [c[1] for c in illuminated_coords]\n",
    "\n",
    "        min_x_val = min(all_x) - 1\n",
    "        max_x_val = max(all_x) + 2\n",
    "        min_y_val = min(all_y) - 1\n",
    "        max_y_val = max(all_y) + 2\n",
    "\n",
    "        ax.set_xlim(min_x_val, max_x_val)\n",
    "        ax.set_ylim(min_y_val, max_y_val)\n",
    "        ax.set_xticks(range(int(min_x_val), int(max_x_val)))\n",
    "        ax.set_yticks(range(int(min_y_val), int(max_y_val)))\n",
    "    ax.grid(True)\n",
    "\n",
    "\n",
    "# --- MAIN EVOLUTIONARY SIMULATION LOOP ---\n",
    "\n",
    "def run_evolutionary_lighting(target_tree_params, ga_params):\n",
    "\n",
    "    # 1. Generate Target Tree and its Illuminated Area\n",
    "    print(\"\\n--- Generating Target Tree ---\")\n",
    "    random.seed(ga_params['seed'] + 1) # Use a different seed for target generation\n",
    "    target_occupied_squares = set()\n",
    "    target_diffusion_info = []\n",
    "    target_tree_root = generate_random_spatial_tree_diffusion(\n",
    "        max_depth=target_tree_params['max_depth'], max_children=target_tree_params['max_children'],\n",
    "        max_node_radius=target_tree_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "        node_prefix=\"Target\", occupied_squares_set=target_occupied_squares,\n",
    "        diffusion_nodes_info=target_diffusion_info, overlap_factor=target_tree_params['overlap_factor']\n",
    "    )\n",
    "\n",
    "    if not target_tree_root:\n",
    "        print(\"Failed to generate target tree. Exiting.\")\n",
    "        return None, None, None, None, []\n",
    "\n",
    "    target_illuminated_area = get_illuminated_area(target_tree_root, resolution=ga_params['illumination_resolution'])\n",
    "    print(f\"Target Tree Generated with {len(target_tree_root.get_all_nodes())} nodes. Illuminated area size: {len(target_illuminated_area)}\")\n",
    "\n",
    "    # 2. Initialize Population\n",
    "    random.seed(ga_params['seed']) # Reset seed for GA population generation\n",
    "    print(f\"\\n--- Initializing Population of {ga_params['pop_size']} Trees ---\")\n",
    "    population = create_initial_population_diffusion(\n",
    "        pop_size=ga_params['pop_size'], max_depth=ga_params['max_depth'], max_children=ga_params['max_children'],\n",
    "        max_node_radius=ga_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "        overlap_factor=ga_params['overlap_factor']\n",
    "    )\n",
    "    print(f\"Population initialized with {len(population)} individuals.\")\n",
    "\n",
    "    best_tree_overall = None\n",
    "    best_fitness_overall = -1.0\n",
    "    history = []\n",
    "\n",
    "    # 3. Evolutionary Loop\n",
    "    print(f\"\\n--- Starting Evolutionary Loop for {ga_params['generations']} Generations ---\")\n",
    "    for generation in range(ga_params['generations']):\n",
    "        fitness_scores = [calculate_fitness_illumination(tree, target_illuminated_area) for tree in population]\n",
    "\n",
    "        current_best_fitness = max(fitness_scores)\n",
    "        current_best_tree = population[np.argmax(fitness_scores)]\n",
    "\n",
    "        if current_best_fitness > best_fitness_overall:\n",
    "            best_fitness_overall = current_best_fitness\n",
    "            best_tree_overall = copy.deepcopy(current_best_tree) # Deepcopy to save the best tree\n",
    "\n",
    "        history.append(current_best_fitness)\n",
    "\n",
    "        print(f\"Generation {generation+1}/{ga_params['generations']}: Best Fitness = {current_best_fitness:.4f} (Overall Best: {best_fitness_overall:.4f})\")\n",
    "\n",
    "        if best_fitness_overall >= 0.999: # Almost perfect match\n",
    "            print(\"Target illumination achieved (or very close)! Stopping evolution.\")\n",
    "            break\n",
    "\n",
    "        # Selection\n",
    "        parents = select_parents_diffusion(population, fitness_scores, ga_params['pop_size'] // 2)\n",
    "\n",
    "        # Create next generation\n",
    "        next_population = []\n",
    "        # Elitism: Keep the best individual from the current generation\n",
    "        if best_tree_overall and current_best_fitness == best_fitness_overall: # Only if it's the current best in this generation\n",
    "            next_population.append(copy.deepcopy(current_best_tree))\n",
    "\n",
    "        while len(next_population) < ga_params['pop_size']:\n",
    "            if len(parents) < 2: # Not enough parents for crossover, fill with new random trees\n",
    "                occupied_squares = set()\n",
    "                diffusion_info = []\n",
    "                new_tree = generate_random_spatial_tree_diffusion(\n",
    "                    max_depth=ga_params['max_depth'], max_children=ga_params['max_children'],\n",
    "                    max_node_radius=ga_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "                    node_prefix=f\"RandomFill_{len(next_population)}\",\n",
    "                    occupied_squares_set=occupied_squares, diffusion_info=diffusion_info,\n",
    "                    overlap_factor=ga_params['overlap_factor']\n",
    "                )\n",
    "                if new_tree:\n",
    "                    next_population.append(new_tree)\n",
    "                continue\n",
    "\n",
    "            # Randomly pick two parents (can be the same parent multiple times with replacement for simplicity)\n",
    "            p1 = random.choice(parents)\n",
    "            p2 = random.choice(parents)\n",
    "\n",
    "            # Crossover\n",
    "            child1, child2 = crossover_trees_diffusion(p1, p2, ga_params['crossover_rate'], ga_params['max_node_radius'], ga_params['overlap_factor'])\n",
    "\n",
    "            # Mutation\n",
    "            mutated_child1 = mutate_tree_diffusion(child1, ga_params['max_depth'], ga_params['max_children'], ga_params['max_node_radius'], ga_params['mutation_rate'], ga_params['overlap_factor'])\n",
    "            mutated_child2 = mutate_tree_diffusion(child2, ga_params['max_depth'], ga_params['max_children'], ga_params['max_node_radius'], ga_params['mutation_rate'], ga_params['overlap_factor'])\n",
    "\n",
    "            next_population.append(mutated_child1)\n",
    "            if len(next_population) < ga_params['pop_size']:\n",
    "                next_population.append(mutated_child2)\n",
    "\n",
    "        population = next_population[:ga_params['pop_size']]\n",
    "\n",
    "    print(\"\\n--- Evolution Finished ---\")\n",
    "    print(f\"Final Best Fitness: {best_fitness_overall:.4f}\")\n",
    "\n",
    "    return target_tree_root, target_illuminated_area, best_tree_overall, best_fitness_overall, history\n",
    "\n",
    "\n",
    "# --- MAIN EXECUTION ---\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    # Parameters for the target tree generation\n",
    "    TARGET_TREE_PARAMS = {\n",
    "        'max_depth': 7,\n",
    "        'max_children': 4,\n",
    "        'max_node_radius': 6.0,\n",
    "        'overlap_factor': 0.7\n",
    "    }\n",
    "\n",
    "    # Parameters for the Genetic Algorithm\n",
    "    GA_PARAMS = {\n",
    "        'seed': 123,\n",
    "        'pop_size': 100,\n",
    "        'generations': 100,\n",
    "        'max_depth': 8,\n",
    "        'max_children': 4,\n",
    "        'max_node_radius': 6.0,\n",
    "        'mutation_rate': 0.1,\n",
    "        'crossover_rate': 0.7,\n",
    "        'overlap_factor': 0.7,\n",
    "        'illumination_resolution': 400 # Increased resolution for more accurate illumination calculation\n",
    "    }\n",
    "    target_tree, target_area, evolved_best_tree, evolved_best_fitness, history = run_evolutionary_lighting(TARGET_TREE_PARAMS, GA_PARAMS)\n",
    "\n",
    "    # --- Plotting Results ---\n",
    "    if target_tree and evolved_best_tree:\n",
    "        fig, axes = plt.subplots(1, 3, figsize=(24, 8))\n",
    "\n",
    "        # Plot 1: Target Tree Structure and its Illumination\n",
    "        plot_tree_with_illumination(target_tree, target_area, axes[0], tree_color='skyblue', diff_color='green', title=\"Target Tree and Illuminated Area\")\n",
    "\n",
    "        # Plot 2: Best Evolved Tree Structure and its Illumination\n",
    "        evolved_best_area = get_illuminated_area(evolved_best_tree, resolution=GA_PARAMS['illumination_resolution'])\n",
    "        plot_tree_with_illumination(evolved_best_tree, evolved_best_area, axes[1], tree_color='lightcoral', diff_color='purple', title=f\"Best Evolved Tree (Fitness: {evolved_best_fitness:.4f})\")\n",
    "\n",
    "        # Plot 3: Symmetric Difference Area\n",
    "        symmetric_diff_area = target_area.symmetric_difference(evolved_best_area)\n",
    "        plot_illuminated_area(axes[2], symmetric_diff_area, title=f\"Symmetric Difference (Error Area: {len(symmetric_diff_area)})\")\n",
    "\n",
    "        plt.tight_layout()\n",
    "        plt.show()\n",
    "\n",
    "        # Plot Fitness History\n",
    "        plt.figure(figsize=(10, 6))\n",
    "        plt.plot(history, marker='o', linestyle='-', color='blue')\n",
    "        plt.title('Best Fitness Progression Over Generations')\n",
    "        plt.xlabel('Generation')\n",
    "        plt.ylabel('Fitness')\n",
    "        plt.grid(True)\n",
    "        plt.show()\n",
    "    else:\n",
    "        print(\"No plots generated due to issues with tree evolution.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "YYBgrbEC6iE9"
   },
   "source": [
    "Colab worked during 7 hours to run the previous program.\n",
    "\n",
    "**Exercise.** Examine the plots that were output by the previous program. Are they correct? Cells must be darkened when they are illuminated, enclosed by the illumination circles.  If this procedure is not correctly implemented, make a diagnostics, carry out the corresponding correction, and test it thoroughly.\n",
    ">\n",
    "> *Answer.* That procedure is correct for the target tree but not for the best evolved tree because many cells are illuminated but not darkened. Example, cell with lower-left vertex (-4,1).\n",
    ">\n",
    "> Our diagnostics is that the revised area to check illumination is not sufficiently large. So, we symmetrically enlarged it in lines 175 and 176. Some minor errors of referencing of names were also corrected.\n",
    "\n",
    "We tested this new version more than 12 times with 2 generations and population size of 5, and diverse values related to complexity. An example follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "executionInfo": {
     "elapsed": 15119437,
     "status": "ok",
     "timestamp": 1785861933230,
     "user": {
      "displayName": "jose rodriguez",
      "userId": "08454562216435392883"
     },
     "user_tz": 300
    },
    "id": "QZkv_eBELV5F",
    "outputId": "ad4b4d4d-53ae-42f6-a5ff-87b553f4003b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- Generating Target Tree ---\n",
      "Target Tree Generated with 6 nodes. Illuminated area size: 33\n",
      "\n",
      "--- Initializing Population of 10 Trees ---\n",
      "Population initialized with 10 individuals.\n",
      "\n",
      "--- Starting Evolutionary Loop for 500 Generations ---\n",
      "Generation 1/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 2/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 3/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 4/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 5/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 6/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 7/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 8/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 9/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 10/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 11/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 12/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 13/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 14/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 15/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 16/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 17/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 18/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 19/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 20/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 21/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 22/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 23/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 24/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 25/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 26/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 27/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 28/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 29/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 30/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 31/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 32/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 33/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 34/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 35/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 36/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 37/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 38/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 39/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 40/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 41/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 42/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 43/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 44/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 45/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 46/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 47/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 48/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 49/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 50/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 51/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 52/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 53/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 54/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 55/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 56/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 57/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 58/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 59/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 60/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 61/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 62/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 63/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 64/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 65/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 66/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 67/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 68/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 69/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 70/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 71/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 72/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 73/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 74/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 75/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 76/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 77/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 78/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 79/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 80/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 81/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 82/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 83/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 84/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 85/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 86/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 87/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 88/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 89/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 90/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 91/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 92/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 93/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 94/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 95/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 96/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 97/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 98/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 99/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 100/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 101/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 102/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 103/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 104/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 105/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 106/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 107/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 108/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 109/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 110/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 111/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 112/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 113/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 114/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 115/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 116/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 117/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 118/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 119/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 120/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 121/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 122/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 123/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 124/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 125/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 126/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 127/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 128/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 129/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 130/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 131/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 132/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 133/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 134/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 135/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 136/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 137/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 138/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 139/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 140/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 141/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 142/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 143/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 144/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 145/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 146/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 147/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 148/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 149/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 150/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 151/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 152/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 153/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 154/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 155/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 156/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 157/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 158/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 159/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 160/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 161/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 162/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 163/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 164/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 165/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 166/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 167/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 168/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 169/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 170/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 171/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 172/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 173/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 174/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 175/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 176/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 177/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 178/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 179/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 180/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 181/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 182/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 183/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 184/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 185/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 186/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 187/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 188/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 189/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 190/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 191/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 192/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 193/500: Best Fitness = 0.6316 (Overall Best: 0.6316)\n",
      "Generation 194/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 195/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 196/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 197/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 198/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 199/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 200/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 201/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 202/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 203/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 204/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 205/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 206/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 207/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 208/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 209/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 210/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 211/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 212/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 213/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 214/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 215/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 216/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 217/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 218/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 219/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 220/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 221/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 222/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 223/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 224/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 225/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 226/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 227/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 228/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 229/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 230/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 231/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 232/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 233/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 234/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 235/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 236/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 237/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 238/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 239/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 240/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 241/500: Best Fitness = 0.6410 (Overall Best: 0.6410)\n",
      "Generation 242/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 243/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 244/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 245/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 246/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 247/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 248/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 249/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 250/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 251/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 252/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 253/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 254/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 255/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 256/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 257/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 258/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 259/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 260/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 261/500: Best Fitness = 0.6944 (Overall Best: 0.6944)\n",
      "Generation 262/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 263/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 264/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 265/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 266/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 267/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 268/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 269/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 270/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 271/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 272/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 273/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 274/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 275/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 276/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 277/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 278/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 279/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 280/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 281/500: Best Fitness = 0.7027 (Overall Best: 0.7027)\n",
      "Generation 282/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 283/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 284/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 285/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 286/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 287/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 288/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 289/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 290/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 291/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 292/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 293/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 294/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 295/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 296/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 297/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 298/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 299/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 300/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 301/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 302/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 303/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 304/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 305/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 306/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 307/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 308/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 309/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 310/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 311/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 312/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 313/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 314/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 315/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 316/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 317/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 318/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 319/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 320/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 321/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 322/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 323/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 324/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 325/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 326/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 327/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 328/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 329/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 330/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 331/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 332/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 333/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 334/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 335/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 336/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 337/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 338/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 339/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 340/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 341/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 342/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 343/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 344/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 345/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 346/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 347/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 348/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 349/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 350/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 351/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 352/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 353/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 354/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 355/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 356/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 357/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 358/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 359/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 360/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 361/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 362/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 363/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 364/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 365/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 366/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 367/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 368/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 369/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 370/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 371/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 372/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 373/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 374/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 375/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 376/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 377/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 378/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 379/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 380/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 381/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 382/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 383/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 384/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 385/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 386/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 387/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 388/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 389/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 390/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 391/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 392/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 393/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 394/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 395/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 396/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 397/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 398/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 399/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 400/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 401/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 402/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 403/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 404/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 405/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 406/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 407/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 408/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 409/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 410/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 411/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 412/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 413/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 414/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 415/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 416/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 417/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 418/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 419/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 420/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 421/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 422/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 423/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 424/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 425/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 426/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 427/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 428/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 429/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 430/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 431/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 432/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 433/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 434/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 435/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 436/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 437/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 438/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 439/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 440/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 441/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 442/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 443/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 444/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 445/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 446/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 447/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 448/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 449/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 450/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 451/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 452/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 453/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 454/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 455/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 456/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 457/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 458/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 459/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 460/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 461/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 462/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 463/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 464/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 465/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 466/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 467/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 468/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 469/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 470/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 471/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 472/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 473/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 474/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 475/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 476/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 477/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 478/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 479/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 480/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 481/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 482/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 483/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 484/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 485/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 486/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 487/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 488/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 489/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 490/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 491/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 492/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 493/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 494/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 495/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 496/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 497/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 498/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 499/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "Generation 500/500: Best Fitness = 0.7297 (Overall Best: 0.7297)\n",
      "\n",
      "--- Evolution Finished ---\n",
      "Final Best Fitness: 0.7297\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAACVYAAAMvCAYAAAAz3hnmAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xd4VHXaxvF7ek2HJDSlqICAujbsgC5grwjI2lFx7b7rrmUVQdfuiq51XXfFEkQR+9pAsevaK4L0GkJ6z9Tz/nHMSEgCASY5Kd/PdeXCnDkz88wvMzFzzj3PYzMMwxAAAAAAAAAAAAAAAAAAIMFudQEAAAAAAAAAAAAAAAAA0N4QrAIAAAAAAAAAAAAAAACAzRCsAgAAAAAAAAAAAAAAAIDNEKwCAAAAAAAAAAAAAAAAgM0QrAIAAAAAAAAAAAAAAACAzRCsAgAAAAAAAAAAAAAAAIDNEKwCAAAAAAAAAAAAAAAAgM0QrAIAAAAAAAAAAAAAAACAzRCsAgAAAAAAAAAAAAAAAIDNEKwCAAAAAADoIPr27auzzz67ze/3vffek81m03vvvdfm990a7rzzTg0aNEjxeLzF1xk5cqRGjhzZekXBEtdcc42GDx9udRkAAAAAAKCdIlgFAAAAAADahZkzZ8pmszX4ys7O1qhRo/TGG2+02v3W1NRo2rRpLQ4N1YeMmvuaPXt2q9Xanm1pTTb9sjqcVVFRoTvuuENXX3217PbfDo01V29ubm6Tt7N+/XpNmzZN3377bRtV3vZCoZCuvvpq9ezZUz6fT8OHD9e8efNadN2+ffs2u6a77rprYr81a9Zo+vTp2n///ZWRkaFu3bpp5MiRmj9/fpO3O2/ePB1yyCHy+/3KyMjQuHHjtHLlygb7bO01essttyT2veKKK/Tdd9/plVde2fYFAgAAAAAAnZ7T6gIAAAAAAAA2ddNNN6lfv34yDEMFBQWaOXOmjj76aL366qs69thjk35/NTU1mj59uiRtU0eiyy67TPvtt1+j7QceeGCySutQnnrqqQbfP/nkk5o3b16j7YMHD27Lshr5z3/+o2g0qtNOO63RZaNHj9aZZ57ZYJvP55Mkvf322w22r1+/XtOnT1ffvn211157tVq9Vjr77LP1/PPP64orrtCuu+6aeC0uWLBAhxxyyBave++996qqqqrBtlWrVun666/XmDFjEttefvll3XHHHTrxxBN11llnKRqN6sknn9To0aP1n//8R+ecc05i39dee00nnHCC9t57b91+++2qqKjQfffdp0MOOUTffPONunfvLsl8jm3+vJPM5+jbb7/d4P5zc3N1wgkn6O6779bxxx+/XesEAAAAAAA6L4JVAAAAAACgXTnqqKO07777Jr6fPHmycnJy9Mwzz7RKsGp7HXrooRo3bpzVZbQbp59+eoPvP/vsM82bN6/R9s3V1NTI7/e3ZmkNPP744zr++OPl9XobXbbbbrs1W6/b7W7t0tqVzz//XLNnz9Zdd92lq666SpJ05plnaujQofrLX/6iTz75ZIvXP/HEExtt+9vf/iZJ+sMf/pDYNmrUKK1evVrdunVLbLvwwgu11157aerUqQ2CVVdffbX69++vjz/+OPHzOO644xJBq7///e+SpJycnCZ/jtOnT9euu+7aKBA5fvx4nXrqqVq+fLn69++/xccFAAAAAAC6FkYBAgAAAACAdi09PV0+n09OZ8PPh8Xjcd17770aMmSIvF6vcnJyNGXKFJWWljbY78svv9TYsWPVrVs3+Xw+9evXT+eee64kaeXKlYkuN9OnT0+MCps2bdoO1z106FCNGjWq0fZ4PK5evXo1CGVVV1frT3/6k/r06SOPx6OBAwfq7rvvlmEYzd7+l19+KZvNpieeeKLRZW+99ZZsNptee+21xLZ169bp3HPPVU5Ojjwej4YMGaL//Oc/ja67du1anXjiiQoEAsrOztaVV16pUCi0rQ+/SSNHjtTQoUP11Vdf6bDDDpPf79d1110nyRw7d+ONN2qXXXaRx+NRnz599Je//KXJ+3766ae1zz77yOfzKTMzUxMnTtSaNWu2ev8rVqzQ999/r9///vfbVXt9R7P33nsvEc4555xzEs+bmTNnNnicCxcu1KhRo+T3+9WrVy/deeedjW63pY+7fgReenq6gsGgBg4cmFi7evfff7+GDBmSGJO37777atasWQ32WbRokVavXr3Vx/v888/L4XDoggsuSGzzer2aPHmyPv300xat9+ZmzZqlfv366aCDDkpsGzJkSINQlSR5PB4dffTRWrt2rSorKyVJJSUlWrhwoU466aQGIbc999xTgwcP3uoIzs8//1xLly5tEOqqV/98ePnll7f5MQEAAAAAgM6NjlUAAAAAAKBdKS8vV1FRkQzD0MaNG3X//ferqqqqUQeaKVOmaObMmTrnnHN02WWXacWKFXrggQf0zTff6OOPP5bL5dLGjRs1ZswYde/eXddcc43S09O1cuVKvfDCC5Kk7t276+GHH9Yf//hHnXTSSTr55JMlSXvsscdW66ysrFRRUVGj7VlZWbLZbJowYYKmTZumDRs2KDc3N3H5Rx99pPXr12vixImSJMMwdPzxx2vBggWaPHmy9tprL7311lv685//rHXr1mnGjBlN3v++++6r/v3767nnntNZZ53V4LJnn31WGRkZGjt2rCSpoKBABxxwgGw2my655BJ1795db7zxhiZPnqyKigpdccUVkqTa2lodccQRWr16tS677DL17NlTTz31lN59992trkdLFRcX66ijjtLEiRN1+umnKycnR/F4XMcff7w++ugjXXDBBRo8eLB++OEHzZgxQ7/88oteeumlxPVvueUW3XDDDRo/frzOO+88FRYW6v7779dhhx2mb775Runp6c3ed32Xpb333rvJy+vq6hr9TFNSUuTxeBpsGzx4sG666SZNnTpVF1xwgQ499FBJahAYKi0t1ZFHHqmTTz5Z48eP1/PPP6+rr75aw4YN01FHHSVJLX7cP/30k4499ljtscceuummm+TxeLR06VJ9/PHHifv717/+pcsuu0zjxo3T5Zdfrrq6On3//ff63//+p0mTJjWofcSIEXrvvfeaXSdJ+uabb7TbbrspNTW1wfb9999fkvTtt9+qT58+W7yNzW/v559/1l//+tcW7b9hwwb5/f5EN7P6oFn9aMZN+f1+/fTTT41ea5vKy8uTpCaDVWlpaRowYIA+/vhjXXnllS2qDwAAAAAAdBEGAAAAAABAO/D4448bkhp9eTweY+bMmQ32/fDDDw1JRl5eXoPtb775ZoPtL774oiHJ+OKLL5q938LCQkOSceONN7aozgULFjRZZ/1Xfn6+YRiGsXjxYkOScf/99ze4/kUXXWQEg0GjpqbGMAzDeOmllwxJxt/+9rcG+40bN86w2WzG0qVLE9t23nln46yzzkp8f+211xoul8soKSlJbAuFQkZ6erpx7rnnJrZNnjzZ6NGjh1FUVNTgPiZOnGikpaUlarn33nsNScZzzz2X2Ke6utrYZZddDEnGggULWrRGhmEYF198sbH5oacRI0YYkoxHHnmkwfannnrKsNvtxocffthg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OUY777yzNm7cqIceeki9e/fWIYccIkkaM2aMcnNzdfDBBysnJ0c///yzHnjgAR1zzDENOqENHjxYI0aM0HvvvbfF2oYPH65TTz1V1157rTZu3KhddtlFTzzxhFauXKl///vfDfY988wz9f777zcKu0nmGECPx6NTTjmlyft58cUX9Ze//EW77rqrBg8erKeffrrB5aNHj050p3r66ac1d+5cHXbYYQoGg5o/f76ee+45nXfeeU3efklJid544w2dcsopWxwTOX/+fBmGoRNOOGGLawIAAAAAALoeglUAAAAAAKBdmTp1auK/vV6vBg0apIcfflhTpkxpsN8jjzyiffbZR//85z913XXXyel0qm/fvjr99NN18MEHSzIDWJ9//rlmz56tgoICpaWlaf/991deXl6DAMxjjz2mSy+9VFdeeaXC4bBuvPHGrQar/vGPfzS5/cYbb2wQrOrdu7cOOuggffzxxzrvvPPkcrka7G+32/XKK69o6tSpevbZZ/X444+rb9++uuuuu5rtwrO5CRMm6Prrr1dNTU2jjliSOTrt888/10033aQXXnhBDz30kLKysjRkyBDdcccdif38fr/eeecdXXrppbr//vvl9/v1hz/8QUcddZSOPPLIFtWyPex2u1566SXNmDFDTz75pF588UX5/X71799fl19+eYOxf9dcc4122203zZgxQ9OnT5ck9enTR2PGjNHxxx+/1fs699xzNXXqVNXW1rZojGRzXC6XnnjiCV177bW68MILFY1G9fjjj29TsKqlj/v444/XypUrE13PunXrphEjRmj69OlKS0uTJE2ZMkV5eXm65557VFVVpd69e+uyyy7T9ddfv92P8cknn9QNN9ygp556SqWlpdpjjz302muvNeiItiUVFRX673//q2OOOSZR5+a+++47SdKSJUt0xhlnNLp8wYIFiWDVbrvtppKSEt18882qra3VwIED9cgjj+iCCy5o8rbnzJmjSCSiSZMmbbHOOXPm6JBDDmlRiBEAAAAAAHQtNqOpj5IBAAAAAAAAnVB5ebn69++vO++8U5MnT7a6HFhsw4YN6tevn2bPnk3HKgAAAAAA0Ih967sAAAAAAAAAnUNaWpr+8pe/6K677lI8Hre6HFjs3nvv1bBhwwhVAQAAAACAJtGxCgAAAAAAAAAAAAAAAAA2Q8cqAAAAAAAAAAAA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bJguuOAC/e9//2vRbUQiEZ166qkqKSnRjBkz9NRTT2nnnXdWcXGxxo8fL5/PpwcffFBPPfWUAoFAKz+i9m3FihV67LHHdN111yW21X/Yvbmv22+/3cKKW+ahhx6SzWbT8OHDrS5lmz388MM69dRTtdNOO8lms20xtFhWVqYLLrhA3bt3VyAQ0KhRo/T111832CcrK0vnnXeebrjhhlauHMD2YBQggFbz1FNPNfj+ySef1Lx58xptHzx4cFuWtVWffPKJpk+frrPPPlvpW/iU/uDBgxs9lmuvvVbBYFB//etfW7lKtKYzzjhDEydOlMfjabX7WL9+vaZPn66+fftqr732arX7aYmKigq9+uqr6tu3r5555hndfvvtBAIBAOgKioqkX36RNmwwx/716WN1RQDaC5vtt/GA+fnm74v+/c0RgW631dUBAADok08+0ahRo7TTTjvp/PPPV25urtasWaPPPvtM9913ny699FKrS2w1Cxcu1PTp0zVy5Ej17du3xddbvHix7Pbk9dzYa6+99Kc//UmSVFlZqZ9//llz5szRv/71L1155ZW65557GuxfW1srp/O3U9PLli3TqlWr9K9//UvnnXdeYvubb76pyspK3Xzzzfr973+ftHo7svvuu0/9+vXTqFGjGl122mmn6eijj260/Xe/+11blLZD8vLy1LdvX33++edaunSpdtllF6tLarE77rhDlZWV2n///ZWfn9/sfvF4XMccc4y+++47/fnPf1a3bt300EMPaeTIkfrqq6+06667Jva98MIL9Y9//EPvvvuuDj/88LZ4GABaiGAVgFZz+umnN/j+s88+07x58xpt3x6GYaiurk4+n2+Hb2t75eTkNHost99+u7p167bFxxiPxxUOh+X1elu7RGwnh8MhRxfq0jB37lzFYjH95z//0eGHH64PPvhAI0aM2Or1qquru/wnhQAA6JDCYWnFCmnZMikeN0d/daG/fQBsA5dL6tVLqqoyxwMWF0u77WaGrgAAACx0yy23KC0tTV988UWjD0hv3LjRmqLaoU3PpST7g8S9evVqdC7kjjvu0KRJkzRjxgztuuuu+uMf/5i4bPNzIvU/p+Z+flv64Pu26sjHsiORiPLy8nThhRc2efnee++9zefdtnSOra6uTm63e4dCeC1Z7xUrVuiTTz7RCy+8oClTpigvL0833njjVm87Go0qHo/LbfEHPt5///1Et6pgMNjsfs8//7w++eQTzZkzR+PGjZNkThDZbbfddOONN2rWrFmJfQcPHqyhQ4dq5syZBKuAdoZRgAAs9fjjj+vwww9Xdna2PB6Pdt99dz388MON9uvbt6+OPfZYvfXWW9p3333l8/n0z3/+U5K0atUqHX/88QoEAsrOztaVV16pt956q8kxg//73/905JFHKi0tTX6/XyNGjNDHH3+cuHzatGn685//LEnq169fomXqjrTUtdlsuuSSS5SXl6chQ4bI4/HozTfflCStW7dO5557rnJycuTxeDRkyBD95z//aXQboVBIN954o3bZZRd5PB716dNHf/nLXxQKhbZ6/x9++GGiHWn9da+88krV1tY22O/ss89WMBjUunXrdOKJJyoYDKp79+666qqrFIvFGuxbVlams88+W2lpaUpPT9dZZ53V6jPOZ86c2eTPon604KY/65EjR2ro0KH6/vvvNWLECPn9fu2yyy6J8YPvv/++hg8fLp/Pp4EDB2r+/Plbva/65+BHH32k/fffX16vV/3799eTTz7Z4LolJSW66qqrNGzYMAWDQaWmpuqoo47Sd99916Dm/fbbT5J0zjnnJJ5nM2fOTOyztedqvY8++kj77befvF6vBgwYkHhdbIu8vDyNHj1ao0aN0uDBg5WXl9don/o1ef/993XRRRcpOztbvXv3Tlz+xhtv6NBDD1UgEFBKSoqOOeYY/fTTTw1u4/vvv9fZZ5+t/v37y+v1Kjc3V+eee66Ki4u3uWYAALCdioqkL780AxKBgNSjB6EqAFsXDJoBq5IS6fPPpcWLzZAmAACARZYtW6YhQ4Y0Gb7Jzs5O/PeIESO05557NnkbAwcO1NixYyX9Nlbt7rvv1oMPPqj+/fvL7/drzJgxWrNmjQzD0M0336zevXvL5/PphBNOUMlm45LrjyG/9957ifMYw4YNSxy7fuGFFzRs2DB5vV7ts88++uabbxrVtGjRIo0bN06ZmZnyer3ad9999corryQunzlzpk499VRJ0qhRoxLHluvvY0vnUvr27dtoXFlZWZmuvPJK9e3bVx6PR71799aZZ56poqKi5hd/C3w+n5566illZmbqlltukWEYictsNpumTZsmyTwfUf/h3lNPPVU2m00jR47UyJEjddZZZ0mS9ttvv0Yj1lpy3HzatGmy2WxauHChJk2apIyMDB1yyCGJy59++mnts88+8vl8yszM1MSJE7VmzZoGt1F/jmHhwoUaNWqU/H6/evXqpTvvvLPRY66rq9O0adO02267yev1qkePHjr55JO1bNmyxD7xeFz33nuvhgwZIq/Xq5ycHE2ZMkWlpaVbXdOPPvpIRUVFO9S9q7nnRf35ldmzZ+v6669Xr1695Pf7VVFRIUmaM2dOYq3qmwqsW7euwW3Xn1tatmyZjj76aKWkpOgPf/jDVmvKy8tTRkaGjjnmGI0bN67J8xKbvi7vvfdeDRgwQB6PRwsXLpS09deL1LJzNvVWr16tRYsWtWhNd9555xZN/nj++eeVk5Ojk08+ObGte/fuGj9+vF5++eVG5/lGjx6tV199tcFrB4D16FgFwFIPP/ywhgwZouOPP15Op1OvvvqqLrroIsXjcV188cUN9l28eLFOO+00TZkyReeff74GDhyo6upqHX744crPz9fll1+u3NxczZo1SwsWLGh0X++++66OOuoo7bPPPrrxxhtlt9sTwa4PP/xQ+++/v04++WT98ssveuaZZzRjxgx1+/VTuN27d9+hx/nuu+/queee0yWXXKJu3bqpb9++Kigo0AEHHJAIXnXv3l1vvPGGJk+erIqKCl1xxRWSzD+4jz/+eH300Ue64IILNHjwYP3www+aMWOGfvnlF7300ktbvO85c+aopqZGf/zjH5WVlaXPP/9c999/v9auXas5c+Y02DcWi2ns2LEaPny47r77bs2fP19///vfNWDAgMQnSwzD0AknnKCPPvpIF154oQYPHqwXX3wx8WanvSgtLdWxxx6riRMn6tRTT9XDDz+siRMnKi8vT1dccYUuvPBCTZo0SXfddZfGjRunNWvWKCUlZYu3uXTpUo0bN06TJ0/WWWedpf/85z86++yztc8++2jIkCGSpOXLl+ull17Sqaeeqn79+qmgoED//Oc/NWLECC1cuFA9e/bU4MGDddNNN2nq1Km64IILdOihh0qSDjroIEkte65K0g8//KAxY8aoe/fumjZtmqLRqG688Ubl5OS0eJ3Wr1+vBQsW6IknnpBktg2eMWOGHnjggSY/8XHRRRepe/fumjp1qqqrqyWZYz/POussjR07VnfccYdqamr08MMP65BDDtE333yTaEc9b948LV++XOecc45yc3P1008/6dFHH9VPP/2kzz77jPGDAAC0IlskYo79W7XK7FLVqxeBKgDbxuEww5ibd69KS7O6MgAA0AXtvPPO+vTTT/Xjjz9q6NChze53xhln6Pzzz2+03xdffKFffvlF119/fYP98/LyFA6Hdemll6qkpER33nmnxo8fr8MPP1zvvfeerr76ai1dulT333+/rrrqqkYflF66dKkmTZqkKVOm6PTTT9fdd9+t4447To888oiuu+46XXTRRZKk2267TePHj28wnu+nn37SwQcfrF69eumaa65RIBDQc889pxNPPFFz587VSSedpMMOO0yXXXaZ/vGPf+i6667T4MGDJSnxr9T0uZSmVFVV6dBDD9XPP/+sc889V3vvvbeKior0yiuvaO3atYnzI9sqGAzqpJNO0r///W8tXLgwcex8U1OmTFGvXr1066236rLLLtN+++2XOK49cOBAPfroo7rpppvUr18/DRgwQFLLj5vXO/XUU7Xrrrvq1ltvTYRUbrnlFt1www0aP368zjvvPBUWFur+++/XYYcdpm+++aZBUK+0tFRHHnmkTj75ZI0fP17PP/+8rr76ag0bNkxHHXWUJPOcyrHHHqt33nlHEydO1OWXX67KykrNmzdPP/74Y6L2KVOmaObMmTrnnHN02WWXacWKFXrggQf0zTff6OOPP5bL5Wp2PT/55BPZbLZmR/vV1NQ0GYRLT09vMHpxS8+Lm2++WW63W1dddZVCoZDcbnei3v3220+33XabCgoKdN999+njjz9utFbRaFRjx47VIYccorvvvlt+v7/Zx1MvLy9PJ598stxut0477TQ9/PDD+uKLLxIfSt/U448/rrq6Ol1wwQXyeDzKzMxs0etFatk5m3pnnnmm3n///aSGmr755hvtvffejTqA7b///nr00Uf1yy+/aNiwYYnt++yzj2bMmKGffvppi7/bALQtglUALPX+++83aDV6ySWX6Mgjj9Q999zTKFi1dOlSvfnmm4lPkEjSPffck/ij6IQTTpBk/oG6+R+YhmHowgsv1KhRo/TGG28kAhxTpkzRkCFDdP311+vtt9/WHnvsob333lvPPPOMTjzxxG2aT74lixcv1g8//KDdd989se28885TLBbTDz/8oKysLEnm/OTTTjtN06ZN05QpU+Tz+TRr1izNnz9f77//foNPVQwdOlQXXnihPvnkk0Qgpyl33HFHgzW+4IILtMsuu+i6667T6tWrtdNOOyUuq6ur04QJE3TDDTck6tl7773173//OxGseuWVV/TBBx/ozjvvTHT3+uMf/9jkbG8rrV+/XrNmzdJpp50myUz5Dxo0SJMmTdInn3yi4cOHSzLfcI4dO1Zz585t9GmdzS1evFgffPBBIgg1fvx49enTR48//rjuvvtuSdKwYcP0yy+/NPgj+YwzztCgQYP073//WzfccINycnJ01FFHaerUqTrwwAMbtOlt6XNVkqZOnSrDMPThhx8mfo6nnHJKgz/Ct+aZZ56Rx+NJvH4mTpyoqVOn6vXXX9eJJ57YaP/MzEy98847iVGJVVVVuuyyy3Teeefp0UcfTex31llnaeDAgbr11lsT2y+66CL96U9/anB7BxxwgE477TR99NFHiXUFAABJVlSk9KVLJcOQsrPNzjMAsL2CQcnnkzZuNLtX7byzGd4EAABoQ1dddZWOOuoo7bXXXtp///116KGH6ogjjtCoUaMahFROPfVUXXrppXr66ad1++23J7Y//fTTCgQCDbrISOaUiSVLlijt1/B4LBbTbbfdptraWn355ZeJoEphYaHy8vL08MMPNxixt3jxYn3yySc68MADJUm77767xo4dq/PPP1+LFi1KHMfNyMjQlClT9MEHH2jkyJGSpMsvv1w77bSTvvjii8RtXnTRRTrkkEN09dVX66STTlL//v116KGH6h//+IdGjx6duO6mmjqX0pS77rpLP/74o1544YVECEWSrr/++h0OltQHQuo7i23uwAMPVCgU0q233qpDDz00MSJNMn8Gjz76qI466ijtu+++krbtuHm9Pffcs8GYtVWrVunGG2/U3/72N1133XWJ7SeffLJ+97vf6aGHHmqwff369XryySd1xhlnSJImT56snXfeWf/+978Twaonn3xS77zzju655x5deeWVietec801iTX86KOP9NhjjykvL0+TJk1K7DNq1CgdeeSRmjNnToPtm1u0aJEyMzOVmpra5OU33nhjkyP0Pv30Ux1wwAGJ75t6XtR3Oqurq9OXX36ZOJcUiUR09dVXa+jQofrggw8SYxwPOeQQHXvssZoxY4amT5+euJ1QKKRTTz1Vt912W7OPY1NfffWVFi1apPvvvz9xu71791ZeXl6Twaq1a9dq6dKlDZog/P73v9/q60Vq2Tmb1pSfn6/DDjus0fYePXpIMp9nm57T6d+/vyRp4cKFBKuAdoRRgAAstWngp7y8XEVFRRoxYoSWL1+u8vLyBvv269ev0RuBN998U7169dLxxx+f2Ob1enX++ec32O/bb7/VkiVLNGnSJBUXF6uoqEhFRUWqrq7WEUccoQ8++EDxeLwVHqFpxIgRDUJVhmFo7ty5Ou6442QYRqKeoqIijR07VuXl5fr6668lmR2nBg8erEGDBjXYr36+clPduTa16RpXV1erqKhIBx10kAzDaLLV8OZzug899FAtX7488f3rr78up9PZYDa6w+HQpZdeug0r0vqCwaAmTpyY+H7gwIFKT0/X4MGDE6EqSYn/3vQxNmf33XdvEP7p3r27Bg4c2OC6Ho8n8Qd6LBZTcXGxgsGgBg4cmPiZbklLn6uxWExvvfWWTjzxxAbhuPqgWEvl5eXpmGOOSXTr2nXXXbXPPvs02XZXks4///xEqEoyu1CVlZXptNNOa/D8dDgcGj58eIPn56bPxbq6OhUVFSXe2LVkbQAAwDYKh81xXV98IVdlpdmlilAVgGSo714VCEgLF5rhze0cFwMAALA9Ro8erU8//VTHH3+8vvvuO915550aO3asevXq1WAUWFpamk444QQ988wziaBLLBbTs88+qxNPPFGBQKDB7Z566qmJUJX02/Hj008/vUH3n+HDhyscDjcai7b77rsnQlWbXv/www9vcBx38+PSJSUlevfddzV+/HhVVlYmjrMWFxdr7NixWrJkSaP7ak5T51KaMnfuXO25554NQlX1dnS6QPDX956VlZU7dDv1tuccz+bnOl544QXF43GNHz++wbHs3Nxc7brrro3OtQSDwQYfina73dp///0bnA+YO3euunXr1uT5kfo1nDNnjtLS0jR69OgG97vPPvsoGAxu9RxPcXGxMjIymr38ggsu0Lx58xp9bXpOStry8+Kss85qcPz+yy+/1MaNG3XRRRclQlWSdMwxx2jQoEH673//2+g2Nj1ntDV5eXnKyclJfGDfZrNpwoQJmj17tmKxWKP9TznllAahqm15vWzLOZv33nsv6SP4amtrG4Qv69Wva21tbYPt9T/r7R3HCaB10LEKgKU+/vhj3Xjjjfr0009VU1PT4LLy8vIGb2D69evX6PqrVq3SgAEDGv2Rv8suuzT4fsmSJZK0xXF15eXlW/zjdEdsXnthYaHKysr06KOPNujys6mNGzdKMmv/+eefmx1HWL9fc1avXq2pU6fqlVdeaTSve/PwmtfrbXQ/GRkZDa63atUq9ejRI/HGqF5z7YSt0rt370bPi7S0NPXp06fRNkktmmW+6RvfepuvTzwe13333aeHHnpIK1asaPAmoL4z2Za09LkaCoVUW1urXXfdtdHlAwcO1Ouvv77V+/r555/1zTff6Mwzz9TSpUsT20eOHKkHH3xQFRUVjT4Fs/lzub7e+qDf5ja9fklJiaZPn67Zs2c3et5u/lwEAAA7qKjIHP1XUCClpSmUmcnoPwDJFwxKLpdc334rffGFNHCg1K+f1MRYcQAAgGTbb7/99MILLygcDuu7777Tiy++qBkzZmjcuHH69ttvE8GSM888U88++6w+/PBDHXbYYZo/f74KCgoSnYg2tfkx4Prjxy09rry911+6dKkMw9ANN9zQbAedjRs3qlevXs2sxm+aOpfSlGXLlumUU05p0b7bqqqqSpISH+jdUdtzjqepY9mGYTR5TF1So3F8TZ1jyMjI0Pfff5/4ftmyZRo4cGCD0F1TtZeXlys7O7vJy7d2jkfSFsM+u+66q37/+99v9Ta29LzY/LJVq1ZJavq8z6BBg/TRRx812OZ0OtW7d++t1iCZ4abZs2dr1KhRWrFiRWL78OHD9fe//13vvPOOxowZs8X6tuX1sqPnbHaUz+dTKBRqtL2uri5x+abqf9Y7Gm4EkFwEqwBYZtmyZTriiCM0aNAg3XPPPerTp4/cbrdef/11zZgxo9GnCzb/42Jb1N/WXXfdpb322qvJfTYPCiXT5rXX13P66ac3+0Zgjz32SOw7bNgw3XPPPU3ut/kbsk3FYjGNHj1aJSUluvrqqzVo0CAFAgGtW7dOZ599dqM1drTjk23N/RHZ1KcXpOYfS3PbW/IphJZc99Zbb9UNN9ygc889VzfffLMyMzNlt9t1xRVXtKgrWkufq039Ib6tnn76aUnSlVde2aBNcb25c+fqnHPOabCtuefyU089pdzc3Ea3sekbyvHjx+uTTz7Rn//8Z+21114KBoOKx+M68sgjW7VjHAAAXUosJq1YYYaq4nGzS1WSP20JAA04HGZ4MxiUFi6USkqkwYOl9HSrKwMAAF2E2+3Wfvvtp/3220+77babzjnnHM2ZMycxHm3s2LHKycnR008/rcMOO0xPP/20cnNzmwyj7Ohx5e29fv3x0auuuqrZrkKbf6C8OTtyLiVZfvzxR0ktr3lrtuccT1PHsm02m954440mfx6bX39HziVsfr/Z2dnNTolo7kP19bKyslr0wfCt2dLzYkefM5t2hdqad999V/n5+Zo9e7Zmz57d6PK8vLxGwarmzku05PWyo+dsdlSPHj2Un5/faHv9tp49ezbYXv+z7tatW6vXBqDlCFYBsMyrr76qUCikV155pcGnOLbW9nRTO++8sxYuXCjDMBoEbzbtviNJAwYMkGR2z9lacr8tUuDdu3dXSkqKYrHYVusZMGCAvvvuOx1xxBHbXNsPP/ygX375RU888YTOPPPMxPZ58+ZtV92SuebvvPOOqqqqGrzRWLx48XbfZkvUf9KkrKyswfb6T060F88//7xGjRqlf//73w22l5WVNfhDuLmfZUufq927d5fP50t8UmdTLflZGIahWbNmadSoUbrooosaXX7zzTcrLy+vUbCquXqzs7O3WG9paaneeecdTZ8+XVOnTk1sb6p+AACwnaqrpUWLpNWrpYwMqf6TwdGotXUB6BoCAfNrwwapqkoaNEjq3Vvik9YAAKAN7bvvvpLUIMjgcDg0adIkzZw5U3fccYdeeuklnX/++e3qg8b9+/eXZHZNaqtzGAMGDEgEoJKpqqpKL774ovr06aPBgwcn5Ta35RzPlm7DMAz169dPu+22W9Lq+t///qdIJNKo49Wm+8yfP18HH3zwdgWYBg0apLy8vEZTXlrTzjvvLMk817D5tIrFixcnLt8eeXl5ys7O1oMPPtjoshdeeEEvvviiHnnkkS2u1ba8Xlp6zqa17LXXXvrwww8Vj8cbhM/+97//ye/3N3ou1nfxStZrB0BytCw6CgCtoP5Ny6bp/vLycj3++OMtvo2xY8dq3bp1DWam19XV6V//+leD/fbZZx8NGDBAd999d6IF7aYKCwsT/10/U33zAE8yORwOnXLKKZo7d26Tb1w2rWf8+PFat25do8ckmbOXq6urt3g/UsM1NgxD991333bXfvTRRysajerhhx9ObIvFYrr//vu3+zZbov6N0wcffNDgfpsbpWgVh8PR6BMrc+bMSczzrtfc86ylz1WHw6GxY8fqpZde0urVqxOX//zzz3rrrbe2WufHH3+slStX6pxzztG4ceMafU2YMEELFizQ+vXrt3g7Y8eOVWpqqm699VZFIpEt1is1/jTPvffeu9VaAQBACxQUmGO4Vq+WevT4LVQFAG3J6TTDVJL09dfSjz9KSei2CwAAsLkFCxY02Tno9ddfl9R4hNkZZ5yh0tJSTZkyRVVVVTr99NPbpM6Wys7O1siRI/XPf/6zye42rXEO45RTTkmMUNzctnZlqldbW6szzjhDJSUl+utf/5q0ENi2nONpzsknnyyHw6Hp06c3enyGYai4uHib6zrllFNUVFSkBx54oNFl9fcxfvx4xWIx3XzzzY32iUajW/05HnjggTIMQ1999dU217e99t13X2VnZ+uRRx5pMD3jjTfe0M8//6xjjjlmu263trZWL7zwgo499tgmz0tccsklqqysbHDOrynb8npp6TkbSVq9erUWLVq0XY+tOePGjVNBQYFeeOGFxLaioiLNmTNHxx13nDweT4P9v/rqK6WlpWnIkCFJrQPAjqFjFQDLjBkzRm63W8cdd1zizcy//vUvZWdnN/mHUFOmTJmiBx54QKeddpouv/xy9ejRQ3l5efJ6vZJ+++SG3W7XY489pqOOOkpDhgzROeeco169emndunVasGCBUlNT9eqrr0oy/0CXpL/+9a+aOHGiXC6XjjvuuMSblWS5/fbbtWDBAg0fPlznn3++dt99d5WUlOjrr7/W/PnzVVJSIsl8w/fcc8/pwgsv1IIFC3TwwQcrFotp0aJFeu655/TWW28lPoWzuUGDBmnAgAG66qqrtG7dOqWmpmru3Lk71Db2uOOO08EHH6xrrrlGK1eu1O67764XXnhB5eXl232bLTFkyBAdcMABuvbaa1VSUqLMzEzNnj1b0XbWgeHYY4/VTTfdpHPOOUcHHXSQfvjhB+Xl5SU+QVFvwIABSk9P1yOPPKKUlBQFAgENHz5c/fr1a/Fzdfr06XrzzTd16KGH6qKLLlI0GtX999+vIUOGNJjz3pS8vDw5HI5m3wAdf/zx+utf/6rZs2fr//7v/5q9ndTUVD388MM644wztPfee2vixInq3r27Vq9erf/+9786+OCD9cADDyg1NVWHHXaY7rzzTkUiEfXq1Utvv/12gxnqAABgO0Sj0vLl0pIlkt0u9elDdxgA1svMlPx+83dTZaXZvSoz0+qqAABAJ3LppZeqpqZGJ510kgYNGqRwOKxPPvlEzz77rPr27duoE//vfvc7DR06VHPmzNHgwYO19957W1R58x588EEdcsghGjZsmM4//3z1799fBQUF+vTTT7V27Vp99913kswOOA6HQ3fccYfKy8vl8Xh0+OGHKzs7e5vu789//rOef/55nXrqqTr33HO1zz77qKSkRK+88ooeeeQR7bnnnlu8/rp16/T0009LMrtULVy4UHPmzNGGDRv0pz/9SVOmTNm+hWjCtpzjac6AAQP0t7/9Tddee61WrlypE088USkpKVqxYoVefPFFXXDBBbrqqqu2qa4zzzxTTz75pP7v//5Pn3/+uQ499FBVV1dr/vz5uuiii3TCCSdoxIgRmjJlim677TZ9++23GjNmjFwul5YsWaI5c+bovvvu07hx45q9j0MOOURZWVmaP39+o+5RkvT1118nfg6bP94DDzxwmx5PPZfLpTvuuEPnnHOORowYodNOO00FBQW677771LdvX1155ZXbdbuvvPKKKisrdfzxxzd5+QEHHKDu3bsrLy9PEyZM2OJttfT10tJzNpL583z//fdbFCx89dVXE/cRiUT0/fff629/+5sk8/zKHnvsIckMVh1wwAE655xztHDhQnXr1k0PPfSQYrGYpk+f3uh2582bp+OOO65NpusAaDmCVQAsM3DgQD3//PO6/vrrddVVVyk3N1d//OMf1b17d5177rktuo1gMKh3331Xl156qe677z4Fg0GdeeaZOuigg3TKKackAlaSNHLkSH366ae6+eab9cADD6iqqkq5ubkaPnx4gz/w99tvP91888165JFH9Oabbyoej2vFihVJD1bl5OTo888/10033aQXXnhBDz30kLKysjRkyBDdcccdif3sdrteeuklzZgxQ08++aRefPFF+f1+9e/fX5dffvkWW9a6XC69+uqruuyyy3TbbbfJ6/XqpJNO0iWXXLLVN0XNsdvteuWVV3TFFVfo6aefls1m0/HHH6+///3v+t3vfrddt9lSeXl5mjJlim6//Xalp6dr8uTJGjVqlEaPHt2q97strrvuOlVXV2vWrFl69tlntffee+u///2vrrnmmgb7uVwuPfHEE7r22mt14YUXKhqN6vHHH1e/fv1a/FzdY4899NZbb+n//u//NHXqVPXu3VvTp09Xfn7+FoNVkUhEc+bM0UEHHaTMZk5uDB06VP369dPTTz+9xWCVJE2aNEk9e/bU7bffrrvuukuhUEi9evXSoYce2uAAxqxZs3TppZfqwQcflGEYGjNmjN54441GM8QBAEALVVaao//WrJGysqRNxjQDgOW8XrN7VX1HvUGDzPCnnQb6AABgx919992aM2eOXn/9dT366KMKh8PaaaeddNFFF+n6669Xenp6o+uceeaZ+stf/qIzzjij7Qtugd13311ffvmlpk+frpkzZ6q4uFjZ2dn63e9+p6lTpyb2y83N1SOPPKLbbrtNkydPViwW04IFC7Y5WBUMBvXhhx/qxhtv1IsvvqgnnnhC2dnZOuKII9S7vgvpFnz77bc644wzZLPZlJKSoj59+ui4447Teeedp/3333+bH//WtPS4+ZZcc8012m233TRjxoxEqKVPnz4aM2ZMs2GfLXE4HHr99dd1yy23aNasWZo7d66ysrISgZ96jzzyiPbZZx/985//1HXXXSen06m+ffvq9NNP18EHH7zF+3C73frDH/6gOXPm6NZbb210+TPPPKNnnnmm0fazzjpru4NVknT22WfL7/fr9ttv19VXX61AIKCTTjpJd9xxR5Ovr5aob4zQ3Dkdu92uY445Rnl5eVvtINbS10tLz9lsq7lz5+qJJ55IfP/NN9/om2++kST17t07Eayqf478+c9/1j/+8Q/V1tZqv/3208yZMxt11lu0aJF+/PFHJn0A7ZDN2N5ejgDQjt1777268sortXbtWvXq1cvqcgAAQDtTUVGhtLQ0FRUVKSsry+pyuoxIJKLXX39dRx99tFwul9XldFyGIW3YIC1caIarevQwx281IxKN6uOPPtLBhxwi1xb2Q/Kw5tZg3a3RonUvK5OqqqS+faWBA83QFXYI/09te6y5Ner/bi8vL1dqaqrV5QDo4O677z5deeWVWrlypXbaaSerywFabPny5Ro0aJDeeOMNHXHEEVaXg1ZyxRVX6IMPPtBXX31FxyqgneEjYgA6vNra2gbf19XV6Z///Kd23XVXQlUAAADoXCIRafFi6csvzTGAvXtvMVQFAO1CerrUrZu0bJnZvaqoyOqKAABAF2MYhv79739rxIgRhKrQ4fTv31+TJ0/W7bffbnUpaCXFxcV67LHH9Le//Y1QFdAOcfQVQId38skna6eddtJee+2l8vJyPf3001q0aJHy8vKsLg0AAABInqoq6aefpHXrzIBCkkdVA0Cr8nrNUYAFBWY4dNAgaeedJU4aAACAVlRd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QGsEOkBW5HDOXXZ7gEBrpHkGf1moIwpCKKXQz9IrHjsKI0ghkF72mACQRDGc98iL/IrbK3EC6xy6eY60AIIshRACSRSjNAalKS/dV0qJOIxQmhKlMWP/now1OH/Wwjug2Zy9hcph8RBz9Xo1NRiqIiK6IRPX0F27HdWzn0XUvoC8vgzMURdZALBBjDKpI+xvodSzNb7JOIdPty/g+575JZMuhYieRBYpVJkhWziKvHGEoapDTudd5M012DCZdClEREREREQ0ZxisIjrEsm6OD739Y/iy/+N5ky5lZuz1NCyDHHsTaA0hBE4kx/BdP/fGS7e/9AUvwve94tX4ld9+L37vL/7o0u3f/JKvxLf8va/CW3/tV/Cx+z956fZ/9LXfii//3C/EG97xr/DI+dOXbv/x17wOz7/jmfgHP/fGK0JUv/C6N2G5uYBvefMPXlHPr73x53FhawPf94s/fem2JIrxnje9DZ86dxo/8P4PXbr95MpR/OL3/yg+/LE/xS/9xrsu3f7c25+Bn/z278P7PvoBvOfDvzP27+l9H/k9dD/1bHz1165eb9cTERHRBNm4hu7RO1A991lEnfMo6svwUk26rPERAmW1hbC3CTgLzND3vlWkeN7Scbz61s+ddClEdBmV9yCtQbZ0AnltmRfiHXLCGgACRX0fFw0SERERERERHRCDVTQbdq469ODJsl2yxuKDv/AxPP+rb8faHftsky7EXI1fFPDwAPwevuV52j/DEgcRvunmr8XnvvL2S7cpNVhc+56XfyO+655XXro90IO3qR/+lu95SncnAPhXr33DU7o7AcC//advvuIxd7o7/dobf/6K25MoxvGVtafcDgBPP3IUH/7e78V9RYTG2kmI7dehlzz38/FFz37+pfvJ7Y4TX/8lfx9f+6IvG+v35KxH+fCz8IVfsoSTN1ee8j3Mk8HPL38ex45dAYiIds2FCXprd8BLjXjrHPLqwkyOxdsvE9dhoip03odJ6pMuZ9cWwgT//ou/bdJlENFldNYBAKTLN6GotiZbDI1FkLZRVlsoK41Jl0JERERERERziMEqmgle7GSquHC+Ox6/9/aP4cQzl3DnF53Y/1bmbcF8J7i35+97zvbTEGipUImf2r4/CkLgKuuLcRhddTtJFF/19qtt+1q3KyGufruUqEUREkRX/P1glN9T3z4Ho/yeWvyovifv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2bdvX9nRqtJPfvKTTJkyJYMGDconPvGJsuNUnQcffDBjxozJwIEDM3ny5Pztb38rO1JVWrVqVa666qqMGDEiNTU1efzxx8uOVLUWLVqUCy+8MPX19Rk2bFimT5+e119/vexYVWnJkiUZP358Ghoa0tDQkIsvvjhPPfVU2bF6hcWLF6empiZz584tOwoAAAC9mLnGsTPXKIa5RrHMNY6NuUYxzDWKY65RHHON7mOu0fOqcrHqe9/7XkaMGFF2jKrW1NSU3//+93n99dfz2GOP5Y033sg111xTdqyqs2HDhnR0dGTp0qV57bXX8vOf/zy//vWv8/3vf7/saFVp3759ufbaa3PzzTeXHaXqPProo2lubs7ChQuzfv36nH/++bn00kuzffv2sqNVnba2tpx//vl58MEHy45S9V544YXMmTMnL730Up599tns378/X/7yl9PW1lZ2tKozcuTILF68OOvWrcvLL7+cL37xi/nKV76S1157rexoVW3t2rVZunRpxo8fX3YUAAAAejlzjWNnrlEMc41imWscPXON4phrFMdcozjmGt3DXKMcNZ2dnZ1lh+iKp556Ks3NzXnsscfy6U9/Oq+88komTJhQdqyq98QTT2T69Olpb29P//79y45T1e65554sWbIkb775ZtlRqtayZcsyd+7c7N69u+woVWPy5Mm58MIL88ADDyRJOjo6MmrUqNx6662ZP39+yemqV01NTVasWJHp06eXHaVX2LFjR4YNG5YXXnghX/jCF8qOU/UGDx6ce+65JzfccEPZUarS+++/n4kTJ+ZXv/pV7r777kyYMCH33Xdf2bHoQXv27EljY2N27tyZIUOGlB2nz9i/f3+efPLJXHHFFV539CC99zydl0Pv5dB7OfTe83Rejg9/b29tbU1DQ0PZcY6auUb3MNcojrnGsTPX6Dpzje5hrlEsc41imWscG3ON8lTVFavefffdzJ49O7/73e8yaNCgsuP0Grt27crDDz+cKVOmePFRgNbW1gwePLjsGPQh+/bty7p16zJt2rSDx2prazNt2rSsXr26xGRwqNbW1iTxM/IYHThwIMuXL09bW1suvvjisuNUrTlz5uTKK6885GcnAAAAFM1co3uYaxTLXIOeZq5BtTDXKIa5RjHMNcpTNYtVnZ2dmTlzZm666aZccMEFZcfpFW6//facdNJJGTJkSDZt2pSVK1eWHanqbdy4Mffff39uvPHGsqPQh+zcuTMHDhzI8OHDDzk+fPjwbNu2raRUcKiOjo7MnTs3n/vc53LeeeeVHacqvfrqqzn55JNTV1eXm266KStWrMinPvWpsmNVpeXLl2f9+vVZtGhR2VEAAADoxcw1imeuUTxzDcpgrkE1MNc4duYaxTHXKFfpi1Xz589PTU3NR35s2LAh999/f/bu3ZsFCxaUHfm49XG7/NB3v/vdvPLKK/nzn/+cfv365frrr0+VvTNkt+lql0myZcuWXHbZZbn22msze/bskpIff46mS6D3mTNnTv7+979n+fLlZUepWuecc05aWlqyZs2a3HzzzZkxY0b+8Y9/lB2r6mzevDnf+c538vDDD2fgwIFlxwEAAKAKmWsUx1yjOOYaxTHXABJzjSKYaxTDXKN8J5Qd4LbbbsvMmTM/8pwzzzwzf/nLX7J69erU1dUdct8FF1yQb3zjG/ntb3/bjSmrw8ft8kOnnnpqTj311Jx99tn55Cc/mVGjRuWll15y+b10vcutW7emqakpU6ZMyW9+85tuTlddutolXXfqqaemX79+effddw85/u677+a0004rKRX8f7fcckv+9Kc/ZdWqVRk5cmTZcarWgAEDctZZZyVJJk2alLVr1+YXv/hFli5dWnKy6rJu3bps3749EydOPHjswIEDWbVqVR544IG0t7enX79+JSYEAADgeGeuURxzjeKYaxTHXKP7mWtwvDPXKIa5RjHMNcpX+mLV0KFDM3To0P953i9/+cvcfffdB29v3bo1l156aR599NFMnjy5OyNWjY/b5ZF0dHQkSdrb24uMVLW60uWWLVvS1NSUSZMm5aGHHkptbekXgjuuHMvXJR/PgAEDMmnSpDz33HOZPn16kv/7nn7uuedyyy23lBuOPq2zszO33nprVqxYkeeffz5jx44tO1Kv0tHR4d/to/ClL30pr7766iHHZs2alXPPPTe33367Fx8AAAD8T+YaxTHXKI65RnHMNbqfuQbHK3ON7mWucXTMNcpX+mLVxzV69OhDbp988slJknHjxtkS7aI1a9Zk7dq1+fznP59TTjklb7zxRu64446MGzfOX3V00ZYtWzJ16tScccYZ+dnPfpYdO3YcvM9Gfddt2rQpu3btyqZNm3LgwIG0tLQkSc4666yD3/McWXNzc2bMmJELLrggF110Ue677760tbVl1qxZZUerOu+//342btx48PZbb72VlpaWDB48+LB/i/hoc+bMySOPPJKVK1emvr4+27ZtS5I0NjbmxBNPLDlddVmwYEEuv/zyjB49Onv37s0jjzyS559/Ps8880zZ0apOfX19zjvvvEOOnXTSSRkyZMhhxwEAAOBYmGsUx1yjOOYaxTLXOHrmGsUx1yiOuUZxzDWKY65RvqpZrKI4gwYNyh//+McsXLgwbW1tOf3003PZZZflBz/4wWGXJOajPfvss9m4cWM2btx42Ath7+vedXfeeechl7/+zGc+kyT561//mqlTp5aUqjp87Wtfy44dO3LnnXdm27ZtmTBhQp5++ukMHz687GhV5+WXX05TU9PB283NzUmSGTNmZNmyZSWlqk5LlixJksO+fx966KH/eSltDrV9+/Zcf/31eeedd9LY2Jjx48fnmWeeySWXXFJ2NAAAAIBuZ65RHHONYplrHD1zjeKYaxTHXKM45hr0JjWdfksCAAD6mD179qSxsTE7d+7MkCFDyo7TZ+zfvz9PPvlkrrjiivTv37/sOH2G3nuezsuh93LovRx673k6L8eHv7e3tramoaGh7DgAAEAf5E2TAQAAAAAAAAAAKlisAgAAAAAAAAAAqGCxCgAAAAAAAAAAoILFKgAAAAAAAAAAgAoWqwAAAAAAAAAAACpYrAIAAAAAAAAAAKhgsQoAAAAAAAAAAKCCxSoAAAAAAAAAAIAKFqsAAAAAAAAAAAAqWKwCAAAAAAAAAACoYLEKAAAAAAAAAACggsUqAAAAAAAAAACACharAAAAAAAAAAAAKlisAgAAAAAAAAAAqGCxCgAAAAAAAAAAoILFKgAAAAAAAAAAgAoWqwAAgKozZsyY1NTUHPKxePHismMBAAAAAAC9yAllBwAAADgaP/rRjzJ79uyDt+vr60tMAwAAAAAA9DYWqwAAgKpUX1+f00477WOd297envb29oO3W1tbkyS7du3qlmwc2f79+/Pvf/877733Xvr37192nD5D7z1P5+XQezn0Xg699zydl2Pv3r1Jks7OzpKTAAAAfVVNp1ckAABAlRkzZkz+85//ZP/+/Rk9enS+/vWvZ968eTnhhCP/7chdd92VH/7whz2cEgAAKMLmzZszcuTIsmMAAAB9kMUqAACg6tx7772ZOHFiBg8enBdffDELFizIrFmzcu+99x7x/MorVu3evTtnnHFGNm3alMbGxp6K3eft2bMno0aNyubNm9PQ0FB2nD5D7z1P5+XQezn0Xg699zydl6OzszN79+7NiBEjUltbW3YcAACgD/JWgAAAwHFh/vz5+elPf/qR5/zzn//Mueeem+bm5oPHxo8fnwEDBuTGG2/MokWLUldXd9jj6urqjni8sbHRYKwEDQ0Nei+B3nuezsuh93LovRx673k673n+EAIAACiTxSoAAOC4cNttt2XmzJkfec6ZZ555xOOTJ0/OBx98kLfffjvnnHNON6QDAAAAAAD6GotVAADAcWHo0KEZOnToUT22paUltbW1GTZsWMGpAAAAAACAvspiFQAAUFVWr16dNWvWpKmpKfX19Vm9enXmzZuXb37zmznllFM+1ueoq6vLwoULj/j2gHQfvZdD7z1P5+XQezn0Xg699zydAwAA9E01nZ2dnWWHAAAA+LjWr1+fb33rW9mwYUPa29szduzYXHfddWlubjboAgAAAAAACmOxCgAAAAAAAAAAoEJt2QEAAAAAAAAAAACONxarAAAAAAAAAAAAKlisAgAAAAAAAAAAqGCxCgAAAAAAAAAAoILFKgAAoM+7+uqrM3r06AwcODCnn356rrvuumzdurXsWL3W22+/nRtuuCFjx47NiSeemHHjxmXhwoXZt29f2dF6vZ/85CeZMmVKBg0alE984hNlx+m1HnzwwYwZMyYDBw7M5MmT87e//a3sSL3aqlWrctVVV2XEiBGpqanJ448/XnakXm/RokW58MILU19fn2HDhmX69Ol5/fXXy47V6y1ZsiTjx49PQ0NDGhoacvHFF+epp54qO1afs3jx4tTU1GTu3LllRwEAAKAHWKwCAAD6vKampvz+97/P66+/nsceeyxvvPFGrrnmmrJj9VobNmxIR0dHli5dmtdeey0///nP8+tf/zrf//73y47W6+3bty/XXnttbr755rKj9FqPPvpompubs3Dhwqxfvz7nn39+Lr300mzfvr3saL1WW1tbzj///Dz44INlR+kzXnjhhcyZMycvvfRSnn322ezfvz9f/vKX09bWVna0Xm3kyJFZvHhx1q1bl5dffjlf/OIX85WvfCWvvfZa2dH6jLVr12bp0qUZP3582VEAAADoITWdnZ2dZYcAAAA4njzxxBOZPn162tvb079//7Lj9An33HNPlixZkjfffLPsKH3CsmXLMnfu3OzevbvsKL3O5MmTc+GFF+aBBx5IknR0dGTUqFG59dZbM3/+/JLT9X41NTVZsWJFpk+fXnaUPmXHjh0ZNmxYXnjhhXzhC18oO06fMnjw4Nxzzz254YYbyo7S673//vuZOHFifvWrX+Xuu+/OhAkTct9995UdCwAAgG7milUAAAD/ZdeuXXn44YczZcoUS1U9qLW1NYMHDy47BhyTffv2Zd26dZk2bdrBY7W1tZk2bVpWr15dYjLoXq2trUni53gPOnDgQJYvX562trZcfPHFZcfpE+bMmZMrr7zykJ/xAAAA9H4WqwAAAJLcfvvtOemkkzJkyJBs2rQpK1euLDtSn7Fx48bcf//9ufHGG8uOAsdk586dOXDgQIYPH37I8eHDh2fbtm0lpYLu1dHRkblz5+Zzn/tczjvvvLLj9HqvvvpqTj755NTV1eWmm27KihUr8qlPfarsWL3e8uXLs379+ixatKjsKAAAAPQwi1UAAECvNH/+/NTU1Hzkx4YNGw6e/93vfjevvPJK/vznP6dfv365/vrr453Tu6arnSfJli1bctlll+Xaa6/N7NmzS0pe3Y6md4CizJkzJ3//+9+zfPnysqP0Ceecc05aWlqyZs2a3HzzzZkxY0b+8Y9/lB2rV9u8eXO+853v5OGHH87AgQPLjgMAAEAPq+k0KQAAAHqhHTt25L333vvIc84888wMGDDgsOP/+te/MmrUqLz44oveXqcLutr51q1bM3Xq1Hz2s5/NsmXLUlvrb3+OxtF8rS9btixz587N7t27uzld37Jv374MGjQof/jDHzJ9+vSDx2fMmJHdu3e7El4PqKmpyYoVKw7pn+5zyy23ZOXKlVm1alXGjh1bdpw+adq0aRk3blyWLl1adpRe6/HHH89Xv/rV9OvX7+CxAwcOpKamJrW1tWlvbz/kPgAAAHqXE8oOAAAA0B2GDh2aoUOHHtVjOzo6kiTt7e1FRur1utL5li1b0tTUlEmTJuWhhx6yVHUMjuVrnWINGDAgkyZNynPPPXdwsaejoyPPPfdcbrnllnLDQYE6Oztz6623ZsWKFXn++ectVZWoo6PD7yvd7Etf+lJeffXVQ47NmjUr5557bm6//XZLVQAAAL2cxSoAAKBPW7NmTdauXZvPf/7zOeWUU/LGG2/kjjvuyLhx41ytqpts2bIlU6dOzRlnnJGf/exn2bFjx8H7TjvttBKT9X6bNm3Krl27smnTphw4cCAtLS1JkrPOOisnn3xyueF6iebm5syYMSMXXHBBLrrootx3331pa2vLrFmzyo7Wa73//vvZuHHjwdtvvfVWWlpaMnjw4IwePbrEZL3XnDlz8sgjj2TlypWpr6/Ptm3bkiSNjY058cQTS07Xey1YsCCXX355Ro8enb179+aRRx7J888/n2eeeabsaL1afX19zjvvvEOOnXTSSRkyZMhhxwEAAOh9LFYBAAB92qBBg/LHP/4xCxcuTFtbW04//fRcdtll+cEPfpC6urqy4/VKzz77bDZu3JiNGzdm5MiRh9zn3eq715133pnf/va3B29/5jOfSZL89a9/zdSpU0tK1bt87Wtfy44dO3LnnXdm27ZtmTBhQp5++ukMHz687Gi91ssvv5ympqaDt5ubm5P831swLlu2rKRUvduSJUuS5LCfGw899FBmzpzZ84H6iO3bt+f666/PO++8k8bGxowfPz7PPPNMLrnkkrKjAQAAQK9V0+l/rQEAAAAAAAAAAA5RW3YAAAAAAAAAAACA443FKgAAAAAAAAAAgAoWqwAAAAAAAAAAACpYrAIAAAAAAAAAAKhgsQoAAAAAAAAAAKCCxSoAAAAAAAAAAIAKFqsAAAAAAAAAAAAqWKwCAAAAAAAAAACoYLEKAAAAAAAAAACggsUqAAAAAAAAAACACharAAAAAAAAAAAAKvw/mID0gEy9aDAAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 2400x800 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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bnGFsSpVqmj+/Pm6//77lZGRoREjRkiS3nzzTQ0bNkw9evTQ8OHDdfbsWf3000/6/vvv1a9fP0nSww8/rNmzZ2vo0KFq0KCBjh07phUrVujXX39V06ZNC/ujctm5c6ckueoqSefPn1d8fLxuvfVW/eMf/1BoaKiMMbrrrru0dOlS3X///WrSpIm+/vprPfHEEzpw4IBeeeUV1/MHDhyojz/+WH/96191yy23aPny5erSpcsl69CzZ0/VqVNHzz//vCuoPffcc3r66afVq1cvPfDAAzpy5IimTp2qP/3pT9qwYYMiIiJ07tw5xcfHKysrS48++qiioqJ04MABzZkzR+np6Spfvrx+/vln3XHHHWrUqJGeeeYZBQUFaceOHfruu+8u+7osWrRIt99+u66//nqNHz9eZ86c0dSpU9W6dWutX7/eNY3UqVevXqpZs6YmTpyo9evX66233lLVqlX14osvXvIc27dv19atWzVw4ECFh4cXWKZ///4aN26c5syZoz59+qh3796aNm2a5s6dq549e7rKZWZm6quvvtLAgQNdIe2DDz7QgAEDFB8frxdffFGZmZmaPn26br31Vm3YsMHtGgr6mV/KnDlzVLt2bbVs2fKyr+GFfv75Z7Vu3VoxMTEaPXq0wsLC9PHHH6tr16769NNPdc8997iVf/TRR1WhQgWNGzdOu3fv1uTJkzV06FDNmjXLVcYT1/fJJ58oMzNTjzzyiCpVqqQ1a9Zo6tSp2r9/vz755BNJee9XBw8eVEpKij744INCXWubNm0UHh6uJ598UgEBAXrjjTfUtm1bLV++PN/rdqVrvdJ7IQAfMwDgZe+++66RlO8rKCjIvPfee25lv/32WyPJ/Oc//3HbvmDBArftn332mZFk1q5de8nzHjlyxEgy48aNK1Q9ly5dWmA9JZldu3YZY0y+47388stu+y8kyQQGBpodO3a4tv34449Gkpk6dapr2/3332+io6PN0aNH3Z7fp08fU758eZOZmWmMMebuu+82N95442WvoXz58iYxMbFQ13sh589o0aJF5siRI2bfvn3mo48+MpUqVTIhISFm//79xhhjBgwYYCSZ0aNHuz3/888/N5LMs88+67a9R48exuFwuF6DdevWGUlmxIgRbuUGDhyY77UdN26ckWT69u3rVnb37t3G39/fPPfcc27bN23aZMqUKePavmHDBiPJfPLJJ5e87ldeecVIMkeOHLlkmV27dhlJ5t1333Vta9Kkialatao5duyYa9uPP/5o/Pz8TP/+/fNdw3333ed2zHvuucdUqlTpkuc05n+v6SuvvHLZcuHh4aZp06bGGGNyc3NNTEyM6d69u1uZjz/+2Egy33zzjTHGmJMnT5qIiAgzePBgt3KHDx825cuXd9t+qZ95QU6cOGEkma5du+bb9/vvv5sjR464vpzt2hhj2rdvbxo2bGjOnj3r2pabm2v++Mc/mjp16ri2Odtphw4dTG5urmv7yJEjjb+/v0lPT/fo9V1YR6eJEycah8Nh9uzZ49qWmJhoLvUr1cXtumvXriYwMNDs3LnTte3gwYOmXLly5k9/+lORr7Uw74UAfIdpgQB8Ztq0aUpJSVFKSor+/e9/q127dnrggQfc/sL6ySefqHz58urYsaOOHj3q+mrWrJnKli2rpUuXSpJr8Yg5c+YoOzvbo/UcO3asq57Or6ioqKs6VocOHVSrVi3X40aNGik8PFy//fabJMkYo08//VR33nmnjDFu1xwfH68TJ064pvRFRERo//79Wrt27SXPFxERoe+//14HDx686vpWqVJFsbGx6tOnj8qWLavPPvtMMTExbuUeeeQRt8fz5s2Tv7+/hg0b5rb9sccekzHGtSqkc0rkkCFD3Mo9+uijl6zTww8/7PY4OTlZubm56tWrl9vrFRUVpTp16rjaSPny5SVJX3/99SWn4Dnb0RdffKHc3NxL1uFChw4d0saNGzVw4EBVrFjRtb1Ro0bq2LGj5s2bd8VraNOmjY4dO6aMjIxLnufkyZOSpHLlyl22PuXKlXMdx+FwqGfPnpo3b55OnTrlKjNr1izFxMS4plWmpKQoPT1dffv2dXsN/f391bJlS9dreKGLf+YFcdajbNmy+fa1bdtWVapUcX05p9IdP35cS5YsUa9evVyjxkePHtWxY8cUHx+v7du368CBA27HevDBB92m3rVp00Y5OTnas2ePR68vJCTE9f3p06d19OhR/fGPf5QxRhs2bLji63GxnJwcLVy4UF27dtX111/v2h4dHa1+/fppxYoV+drEla7Vm++FAIqOaYEAfKZFixZuC1r07dtXN998s4YOHao77rhDgYGB2r59u06cOKGqVasWeIy0tDRJ0m233abu3btrwoQJeuWVV9S2bVt17dpV/fr1U1BQ0DXVs2HDhurQocM1HcOpRo0a+bZVqFDB9fmxI0eOKD09XTNnztTMmTMLPIbzmkeNGqVFixapRYsWql27tjp16qR+/fqpdevWrrIvvfSSBgwYoNjYWDVr1kydO3dW//793X6Ru5xp06apbt26KlOmjCIjI1WvXr180yHLlCmj6tWru23bs2ePqlWrli8I3HDDDa79zn/9/PxUs2ZNt3K1a9e+ZJ0uLrt9+3YZY1SnTp0CyztX9atZs6aSkpI0adIk/ec//1GbNm1011136d5773UFr969e+utt97SAw88oNGjR6t9+/bq1q2bevTocckFF5zXUtAKfTfccIO+/vrrfAsiXNwOKlSoIEn6/fffLznlz/laOkPWpZw8edLt/0vv3r01efJkffnll+rXr59OnTqlefPm6aGHHnL9kr59+3ZJ//tM3cUurlNBP/PL1fnCYOf0xhtv6OTJk0pNTXWbCrxjxw4ZY/T000/r6aefLvC4aWlpbgH/cq+n5Lnr27t3r8aOHasvv/wy32c+L/zcXmEdOXJEmZmZl2w7ubm52rdvn2688UbX9itdqzffCwEUHeEKgGX8/PzUrl07TZkyRdu3b9eNN96o3NxcVa1aVf/5z38KfI7z80wOh0OzZ8/W6tWr9dVXX+nrr7/Wfffdp3/+859avXp1gX85t8LFixA4mf//2SHnaMm9996rAQMGFFjW+TmxG264QVu3btWcOXO0YMECffrpp3r99dc1duxY15LzvXr1Ups2bfTZZ59p4cKFevnll/Xiiy8qOTlZt99++xXre3EALkhQUJBPV3q7cPRAynvNHA6H5s+fX+Dre+HP/p///KcGDhyoL774QgsXLtSwYcM0ceJErV69WtWrV1dISIi++eYbLV26VHPnztWCBQs0a9Ys/fnPf9bChQsv+fMrqiu1g4I4g+nl7gm1Z88eZWRkqEGDBq5tt9xyi+Li4vTxxx+rX79++uqrr3TmzBn17t3bVcbZ7j744IMCR2UvXmSmsD/z8uXLKzo6Wps3b863z/lZIueCLxfX5fHHH1d8fHyBx704fBf2/9W1XF9OTo46duyo48ePa9SoUapfv77CwsJ04MABDRw4sNAjndfqStdaUt4LgdKCcAXAUufPn5f0v79016pVS4sWLVLr1q3z/VJdkFtuuUW33HKLnnvuOX344YdKSEjQRx99pAceeMBtKo23XOs5qlSponLlyiknJ6dQo2VhYWHq3bu3evfurXPnzqlbt2567rnnNGbMGNeSz9HR0RoyZIiGDBmitLQ0NW3aVM8991yhwtXVuu6667Ro0SKdPHnSbfRqy5Ytrv3Of3Nzc7Vr1y63kacdO3YU+ly1atWSMUY1a9ZU3bp1r1i+YcOGatiwof72t79p5cqVat26tWbMmKFnn31WUl7Ib9++vdq3b69Jkybp+eef11NPPaWlS5cW+DNxXsvWrVvz7duyZYsqV67skWW869atq7p16+rzzz/XlClTCpwe+K9//UuS8t3KoFevXpoyZYoyMjI0a9YsxcXF6ZZbbnHtd05VrVq1qsdGaZ26dOmit956S2vWrFGLFi2uWN45qhoQEOCxunji+jZt2qRt27bp/fffV//+/V3bU1JS8pUt7PtAlSpVFBoaesm24+fnl28VxcK63HshAN/hM1cALJOdna2FCxcqMDDQ9Vf6Xr16KScnR3//+9/zlT9//rzS09Ml5U2Jufiv/k2aNJEkZWVlSZJrxS/nc7zB+Uv01Z7D399f3bt316efflrgX/svXHL52LFjbvsCAwPVoEEDGWOUnZ2tnJycfFOVqlatqmrVqrleE2/p3LmzcnJy9Nprr7ltf+WVV+RwOFzBzjky8frrr7uVmzp1aqHP1a1bN/n7+2vChAn52oAxxvU6ZWRkuMK7U8OGDeXn5+d6PY4fP57v+Be3o4tFR0erSZMmev/9991+7ps3b9bChQvVuXPnQl/LlYwdO1a///67Hn74Ybcl1CVp3bp1evHFF3XTTTepe/fubvt69+6trKwsvf/++1qwYIF69erltj8+Pl7h4eF6/vnnC/ycTkHLmhfWk08+qdDQUN13331KTU3Nt//in1nVqlXVtm1bvfHGGzp06JBH6uKJ63OOGF1YX2OMpkyZkq9sYd8H/P391alTJ33xxRduI3ipqan68MMPdeutt15ymuilFOa9EIDvMHIFwGfmz5/vGslIS0vThx9+qO3bt2v06NGuXyhuu+02PfTQQ5o4caI2btyoTp06KSAgQNu3b9cnn3yiKVOmqEePHnr//ff1+uuv65577lGtWrV08uRJvfnmmwoPD3f9chsSEqIGDRpo1qxZqlu3ripWrKibbrpJN910k8euqVmzZpKkp556Sn369FFAQIDuvPPOIo1cvPDCC1q6dKlatmypwYMHq0GDBjp+/LjWr1+vRYsWuQJAp06dFBUVpdatWysyMlK//vqrXnvtNXXp0kXlypVTenq6qlevrh49eqhx48YqW7asFi1apLVr1+qf//ynx665IHfeeafatWunp556Srt371bjxo21cOFCffHFFxoxYoRrJKFZs2bq3r27Jk+erGPHjrmWYt+2bZukwo0A1KpVS88++6zGjBmj3bt3q2vXripXrpx27dqlzz77TA8++KAef/xxLVmyREOHDlXPnj1Vt25dnT9/Xh988IEr0ErSM888o2+++UZdunTRddddp7S0NL3++uuqXr262z21Lvbyyy/r9ttvV6tWrXT//fe7lmIvX778Nd9L7UIJCQlau3atpkyZol9++UUJCQmqUKGC1q9fr3feeUeVKlXS7NmzXZ8zc2ratKlq166tp556SllZWW5TAqW8zxxNnz5df/3rX9W0aVP16dNHVapU0d69ezV37ly1bt06X1AurDp16ujDDz9U3759Va9ePSUkJKhx48YyxmjXrl368MMP5efn5/YZp2nTpunWW29Vw4YNNXjwYF1//fVKTU3VqlWrtH//fv34449FqoMnrq9+/fqqVauWHn/8cR04cEDh4eH69NNP8332Svrf+8CwYcMUHx8vf39/9enTp8DjPvvss657qw0ZMkRlypTRG2+8oaysLL300ktFuk5JhXovBOBDvl2cEEBpVNBS7MHBwaZJkyZm+vTpbssMO82cOdM0a9bMhISEmHLlypmGDRuaJ5980hw8eNAYY8z69etN3759TY0aNUxQUJCpWrWqueOOO8wPP/zgdpyVK1eaZs2amcDAwCsuy+5civ1yS3cXdIy///3vJiYmxvj5+eVbtr2gZdGvu+46M2DAALdtqampJjEx0cTGxpqAgAATFRVl2rdvb2bOnOkq88Ybb5g//elPplKlSiYoKMjUqlXLPPHEE+bEiRPGGGOysrLME088YRo3bmzKlStnwsLCTOPGjc3rr79+yetxcv6MrrSc84ABA0xYWFiB+06ePGlGjhxpqlWrZgICAkydOnXMyy+/nO/ne/r0aZOYmGgqVqxoypYta7p27Wq2bt1qJJkXXnjBVc65jPmllkn/9NNPza233mrCwsJMWFiYqV+/vklMTDRbt241xhjz22+/mfvuu8/UqlXLBAcHm4oV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1q1uZc6ePavExERVqlRJZcuWVffu3ZWamupWZu/everSpYtCQ0NVtWpVPfHEEzp//rwvLwU+Mn36dDVq1Mh1w85WrVpp/vz5rv20F1zJCy+8IIfDoREjRri20W5wofHjx8vhcLh91a9f37W/pLcXwlUxNmvWLCUlJWncuHFav369GjdurPj4eKWlpVldNVjg9OnTaty4saZNm1bg/pdeekmvvvqqZsyYoe+//15hYWGKj4/X2bNnXWUSEhL0888/KyUlRXPmzNE333yjBx980FeXAB9bvny5EhMTtXr1aqWkpCg7O1udOnXS6dOnXWVGjhypr776Sp988omWL1+ugwcPqlu3bq79OTk56tKli86dO6eVK1fq/fff13vvvaexY8dacUnwsurVq+uFF17QunXr9MMPP+jPf/6z7r77bv3888+SaC+4vLVr1+qNN95Qo0aN3LbTbnCxG2+8UYcOHXJ9rVixwrWvxLcXg2KrRYsWJjEx0fU4JyfHVKtWzUycONHCWqE4kGQ+++wz1+Pc3FwTFRVlXn75Zde29PR0ExQUZP773/8aY4z55ZdfjCSzdu1aV5n58+cbh8NhDhw44LO6wzppaWlGklm+fLkxJq+NBAQEmE8++cRV5tdffzWSzKpVq4wxxsybN8/4+fmZw4cPu8pMnz7dhIeHm6ysLN9eACxRoUIF89Zbb9FecFknT540derUMSkpKea2224zw4cPN8bwPoP8xo0bZxo3blzgPju0F0auiqlz585p3bp16tChg2ubn5+fOnTooFWrVllYMxRHu3bt0uHDh93aS/ny5dWyZUtXe1m1apUiIiLUvHlzV5kOHTrIz89P33//vc/rDN87ceKEJKlixYqSpHXr1ik7O9ut3dSvX181atRwazcNGzZUZGSkq0x8fLwyMjJcoxmwp5ycHH300Uc6ffq0WrVqRXvBZSUmJqpLly5u7UPifQYF2759u6pVq6brr79eCQkJ2rt3ryR7tJcyVlcABTt69KhycnLcGo4kRUZGasuWLRbVCsXV4cOHJanA9uLcd/jwYVWtWtVtf5kyZVSxYkVXGdhXbm6uRowYodatW+umm26SlNcmAgMDFRER4Vb24nZTULty7oP9bNq0Sa1atdLZs2dVtmxZffbZZ2rQoIE2btxIe0GBPvroI61fv15r167Nt4/3GVysZcuWeu+991Sv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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Program evolution_of_morphological_trees_2.py\n",
    "# Morphological trees considered here are like lighting trees:\n",
    "# a tree extends the electrical thread and at each node there is lamp.\n",
    "# Each lamp has a given power and a circle of illumination,\n",
    "# whose radius is determined by a threshold intensity.\n",
    "# In morphology, this corresponds with a threshold concentration of a messenger.\n",
    "# Evolution is given the task of illuminating\n",
    "# the area determined by a random tree.\n",
    "# By Gemini 2.5 Flash with a minor help from the Author.\n",
    "\n",
    "\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "from numpy import array as Array\n",
    "import copy # For deep copying trees during reproduction and mutation\n",
    "import sys # Import sys module to adjust recursion limit\n",
    "\n",
    "sys.setrecursionlimit(3000) # Increase the recursion limit for potentially deep trees\n",
    "\n",
    "# --- SPATIAL TREE NODE FOR DIFFUSION ---\n",
    "\n",
    "class SpatialTreeNode_Evolution_Diffusion2:\n",
    "    def __init__(self, value, x, y, radius, occupied_squares_set, diffusion_nodes_info):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "\n",
    "        self.radius = radius\n",
    "        self.occupied_squares_set = occupied_squares_set  # Reference to the set of squares occupied by *this* tree's nodes\n",
    "        self.diffusion_nodes_info = diffusion_nodes_info  # Reference to the list of (x,y,radius) for *all* nodes in *this* tree\n",
    "\n",
    "        self.occupied_squares_set.add((x, y))  # Add current node's (x,y) square to the set\n",
    "        self.diffusion_nodes_info.append((x, y, radius))  # Add current node's (x,y,radius) to the list\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode_Evolution_Diffusion2):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode_Evolution_Diffusion\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue  # Exclude the current square itself\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def _is_diffusion_overlapping_local(self, potential_nx, potential_ny, potential_radius, overlap_factor):\n",
    "        \"\"\"\n",
    "        Checks if a potential new node's diffusion circle overlaps \"too much\" with EXISTING nodes IN THE SAME TREE.\n",
    "        \"Too much overlap\" is defined by the overlap_factor.\n",
    "        \"\"\"\n",
    "        potential_center_x, potential_center_y = potential_nx + 0.5, potential_ny + 0.5\n",
    "\n",
    "        for ex, ey, er in self.diffusion_nodes_info:\n",
    "            # Skip checking against self if self is already in diffusion_nodes_info\n",
    "            if (ex, ey) == (self.x, self.y):\n",
    "                continue\n",
    "\n",
    "            existing_center_x, existing_center_y = ex + 0.5, ey + 0.5\n",
    "\n",
    "            # Calculate distance between centers\n",
    "            distance = np.sqrt((potential_center_x - existing_center_x)**2 + (potential_ny - existing_center_y)**2)\n",
    "\n",
    "            # Check for significant overlap\n",
    "            # If distance is less than a fraction of the sum of radii, it's too much overlap.\n",
    "            if distance < overlap_factor * (potential_radius + er):\n",
    "                return True # Significant overlap detected\n",
    "        return False\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix, max_node_radius, overlap_factor):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "\n",
    "        # First, filter for unoccupied grid squares *within this tree*\n",
    "        available_square_neighbors = [coord for coord in coordinates_neighbors if coord not in self.occupied_squares_set]\n",
    "\n",
    "        valid_child_candidates = []  # Store (nx, ny, child_radius) for candidates that pass overlap check\n",
    "\n",
    "        for nx, ny in available_square_neighbors:\n",
    "            # Generate potential radius for this child, ensuring it's not too large or small\n",
    "            child_radius = random.uniform(0.5, max_node_radius)\n",
    "            if not self._is_diffusion_overlapping_local(nx, ny, child_radius, overlap_factor):\n",
    "                valid_child_candidates.append((nx, ny, child_radius))\n",
    "\n",
    "        if not valid_child_candidates:\n",
    "            return None  # No available neighbors that satisfy both square and diffusion overlap conditions\n",
    "\n",
    "        # Choose a random valid candidate\n",
    "        chosen_nx, chosen_ny, chosen_child_radius = random.choice(valid_child_candidates)\n",
    "\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        # Create child node; its __init__ will update occupied_squares_set and diffusion_nodes_info\n",
    "        child_node = SpatialTreeNode_Evolution_Diffusion2(child_value, chosen_nx, chosen_ny, chosen_child_radius, self.occupied_squares_set, self.diffusion_nodes_info)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def get_all_nodes(self):\n",
    "        all_nodes = []\n",
    "        stack = [self]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            all_nodes.append(node)\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "        return all_nodes\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode_Evolution_Diffusion(value={self.value}, x={self.x}, y={self.y}, R={self.radius:.2f}, children={[child.value for child in self.children]!r})\"\n",
    "\n",
    "\n",
    "# --- TREE GENERATION ---\n",
    "\n",
    "def generate_random_spatial_tree_diffusion2(\n",
    "    max_depth, max_children, max_node_radius, initial_x, initial_y, node_prefix=\"Node\",\n",
    "    current_depth=0, parent_node=None, occupied_squares_set=None, diffusion_nodes_info=None, overlap_factor=0.7\n",
    "):\n",
    "    if occupied_squares_set is None:\n",
    "        occupied_squares_set = set() # Initialize a new set for this tree's square coordinates\n",
    "    if diffusion_nodes_info is None:\n",
    "        diffusion_nodes_info = [] # Initialize a new list for this tree's node (x,y,radius) information\n",
    "\n",
    "    if parent_node is None:\n",
    "        # Root node at (initial_x, initial_y) with a random initial radius\n",
    "        node_value = f\"{node_prefix}_Root_{random.randint(0, 99)}\"\n",
    "        initial_radius = random.uniform(0.5, max_node_radius)\n",
    "        current_node = SpatialTreeNode_Evolution_Diffusion2(node_value, initial_x, initial_y, initial_radius, occupied_squares_set, diffusion_nodes_info)\n",
    "    else:\n",
    "        # Children are added by the parent's method, which handles their coordinates and radius\n",
    "        current_node = parent_node.add_child_in_random_neighbor(f\"{node_prefix}_{current_depth}\", max_node_radius, overlap_factor)\n",
    "        if current_node is None:\n",
    "            return None # Branch terminated if no available neighbor\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        num_children = random.randint(0, max_children) # Random number of children for this node\n",
    "        for _ in range(num_children):\n",
    "            generate_random_spatial_tree_diffusion2(\n",
    "                max_depth, max_children, max_node_radius, initial_x, initial_y, node_prefix,\n",
    "                current_depth + 1, current_node, occupied_squares_set, diffusion_nodes_info, overlap_factor\n",
    "            )\n",
    "    return current_node\n",
    "\n",
    "\n",
    "# --- ILLUMINATION AND FITNESS FUNCTIONS ---\n",
    "\n",
    "def get_illuminated_area2(tree_root, resolution):\n",
    "    \"\"\"\n",
    "    Calculates the set of (x,y) integer coordinates illuminated by the tree.\n",
    "    resolution: determines how many points to sample within a unit square to check illumination.\n",
    "    \"\"\"\n",
    "    if tree_root is None:\n",
    "        return set()\n",
    "\n",
    "    illuminated_coords = set()\n",
    "    all_nodes_info = tree_root.diffusion_nodes_info # (x, y, radius) for all nodes in the tree\n",
    "\n",
    "    # Determine the bounding box for efficient sampling\n",
    "    all_x = [info[0] for info in all_nodes_info]\n",
    "    all_y = [info[1] for info in all_nodes_info]\n",
    "    all_radii = [info[2] for info in all_nodes_info]\n",
    "\n",
    "    if not all_x or not all_y:\n",
    "        return set()\n",
    "\n",
    "    min_x_bound = int(min(x - r for x, _, r in all_nodes_info)) - 1\n",
    "    max_x_bound = int(max(x + r for x, _, r in all_nodes_info)) + 1\n",
    "    min_y_bound = int(min(y - r for _, y, r in all_nodes_info)) - 1\n",
    "    max_y_bound = int(max(y + r for _, y, r in all_nodes_info)) + 1\n",
    "\n",
    "    # Iterate through potential integer square coordinates within the bounding box\n",
    "    for ix in range(min_x_bound - 1, max_x_bound + 1):\n",
    "        for iy in range(min_y_bound - 1, max_y_bound + 1):\n",
    "            # Sample points within this unit square\n",
    "            is_square_illuminated = False\n",
    "            for i in range(resolution):\n",
    "                for j in range(resolution):\n",
    "                    sample_x = ix + (i / resolution)\n",
    "                    sample_y = iy + (j / resolution)\n",
    "\n",
    "                    for node_x, node_y, node_radius in all_nodes_info:\n",
    "                        center_x, center_y = node_x + 0.5, node_y + 0.5\n",
    "                        distance = np.sqrt((sample_x - center_x)**2 + (sample_y - center_y)**2)\n",
    "                        if distance <= node_radius:\n",
    "                            is_square_illuminated = True\n",
    "                            break\n",
    "                if is_square_illuminated:\n",
    "                    break\n",
    "            if is_square_illuminated:\n",
    "                illuminated_coords.add((ix, iy))\n",
    "\n",
    "    return illuminated_coords\n",
    "\n",
    "def calculate_fitness_illumination2(candidate_tree_root, target_illuminated_area):\n",
    "    \"\"\"\n",
    "    Calculates fitness based on the symmetric difference between illuminated areas.\n",
    "    Fitness is 1.0 for a perfect match, and decreases as symmetric difference increases.\n",
    "    \"\"\"\n",
    "    if candidate_tree_root is None:\n",
    "        # If the tree generation failed, assign a very low fitness\n",
    "        return 0.0001 # A small non-zero value to avoid division by zero issues later\n",
    "\n",
    "    candidate_illuminated_area = get_illuminated_area2(candidate_tree_root)\n",
    "\n",
    "    # Symmetric difference: (A U B) - (A intersect B)\n",
    "    # Or, the elements in A but not B, plus elements in B but not A.\n",
    "    symmetric_difference = candidate_illuminated_area.symmetric_difference(target_illuminated_area)\n",
    "\n",
    "    # Union size: used for normalization\n",
    "    union_size = len(candidate_illuminated_area.union(target_illuminated_area))\n",
    "\n",
    "    if union_size == 0:\n",
    "        if not target_illuminated_area and not candidate_illuminated_area:\n",
    "            return 1.0 # Perfect match if both are empty\n",
    "        else:\n",
    "            return 0.0001 # Should not happen if target is non-empty, but handles cases where both are empty but expected non-empty\n",
    "\n",
    "    # Fitness is 1.0 - (len(symmetric_difference) / union_size)\n",
    "    # This gives 1.0 for a perfect match (symmetric_difference_area = 0)\n",
    "    # and approaches 0.0 for large differences.\n",
    "    fitness = 1.0 - (len(symmetric_difference) / union_size)\n",
    "    return max(0.0001, fitness) # Ensure fitness is always positive\n",
    "\n",
    "\n",
    "# --- EVOLUTIONARY ALGORITHM COMPONENTS ---\n",
    "\n",
    "def create_initial_population_diffusion2(pop_size, max_depth, max_children, max_node_radius, initial_x, initial_y, overlap_factor, node_prefix=\"Individual\"):\n",
    "    population = []\n",
    "    for i in range(pop_size):\n",
    "        # Each tree needs its own occupied_squares_set and diffusion_nodes_info for independent generation\n",
    "        occupied_squares = set()\n",
    "        diffusion_info = []\n",
    "        tree = generate_random_spatial_tree_diffusion2(\n",
    "            max_depth=max_depth, max_children=max_children, max_node_radius=max_node_radius,\n",
    "            initial_x=initial_x, initial_y=initial_y, node_prefix=f\"{node_prefix}_{i}\",\n",
    "            occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info, overlap_factor=overlap_factor\n",
    "        )\n",
    "        if tree:\n",
    "            population.append(tree)\n",
    "    # If not enough trees generated due to space constraints, fill with more random ones (or handle error)\n",
    "    while len(population) < pop_size:\n",
    "        occupied_squares = set()\n",
    "        diffusion_info = []\n",
    "        new_tree = generate_random_spatial_tree_diffusion2(\n",
    "            max_depth=max_depth, max_children=max_children, max_node_radius=max_node_radius,\n",
    "            initial_x=initial_x, initial_y=initial_y, node_prefix=f\"RandomFill_{len(population)}\",\n",
    "            occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info,\n",
    "            overlap_factor=overlap_factor\n",
    "        )\n",
    "        if new_tree:\n",
    "            population.append(new_tree)\n",
    "        else:\n",
    "            # Handle case where a new tree could not be generated\n",
    "            # This might happen if parameters are too restrictive or space is exhausted\n",
    "            break # Exit if we can't generate enough valid trees\n",
    "    return population\n",
    "\n",
    "def select_parents_diffusion2(population, fitness_scores, num_parents):\n",
    "    parents = []\n",
    "    # Use roulette wheel selection or tournament selection. Tournament is generally robust.\n",
    "    for _ in range(num_parents):\n",
    "        tournament_size = min(5, len(population))\n",
    "        if tournament_size == 0:\n",
    "            break\n",
    "        tournament_candidates = random.sample(list(zip(population, fitness_scores)), tournament_size)\n",
    "        winner = max(tournament_candidates, key=lambda x: x[1])[0]\n",
    "        parents.append(winner)\n",
    "    return parents\n",
    "\n",
    "def mutate_tree_diffusion2(tree_root, max_depth, max_children, max_node_radius, mutation_rate, overlap_factor):\n",
    "    mutated_tree = copy.deepcopy(tree_root) # Work on a deep copy\n",
    "    all_nodes = mutated_tree.get_all_nodes()\n",
    "\n",
    "    if not all_nodes:\n",
    "        return mutated_tree\n",
    "\n",
    "    node_to_mutate = random.choice(all_nodes)\n",
    "\n",
    "    # Mutation 1: Add a child\n",
    "    if random.random() < mutation_rate:\n",
    "        # Need to regenerate the local_occupied_set and diffusion_nodes_info for the deepcopy\n",
    "        # This is a bit inefficient but ensures correctness after deepcopy/mutation operations\n",
    "        temp_occupied_set = set()\n",
    "        temp_diffusion_info = []\n",
    "        # Re-populate temp_occupied_set and temp_diffusion_info by traversing the deepcopied tree\n",
    "        stack = [mutated_tree]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            temp_occupied_set.add((node.x, node.y))\n",
    "            temp_diffusion_info.append((node.x, node.y, node.radius))\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "\n",
    "        # Now, try to add a child to the chosen node\n",
    "        node_to_mutate.occupied_squares_set = temp_occupied_set # Update reference for chosen node\n",
    "        node_to_mutate.diffusion_nodes_info = temp_diffusion_info # Update reference for chosen node\n",
    "\n",
    "        node_to_mutate.add_child_in_random_neighbor(\"MutatedChild\", max_node_radius, overlap_factor)\n",
    "\n",
    "    # Mutation 2: Change node radius\n",
    "    if random.random() < mutation_rate:\n",
    "        node_to_mutate.radius = random.uniform(0.5, max_node_radius)\n",
    "\n",
    "    # Mutation 3: Remove a child (if any)\n",
    "    if random.random() < mutation_rate and node_to_mutate.children:\n",
    "        child_to_remove = random.choice(node_to_mutate.children)\n",
    "        node_to_mutate.children.remove(child_to_remove)\n",
    "        # Note: Removing a child means its coordinates and diffusion info are no longer strictly part of the tree\n",
    "        # The fitness function will re-evaluate the actual illuminated area, handling this implicitly.\n",
    "\n",
    "    return mutated_tree\n",
    "\n",
    "def crossover_trees_diffusion2(parent1_root, parent2_root, crossover_rate, max_node_radius, overlap_factor):\n",
    "    if random.random() > crossover_rate:\n",
    "        return copy.deepcopy(parent1_root), copy.deepcopy(parent2_root)\n",
    "\n",
    "    child1_root = copy.deepcopy(parent1_root)\n",
    "    child2_root = copy.deepcopy(parent2_root)\n",
    "\n",
    "    all_nodes_child1 = child1_root.get_all_nodes()\n",
    "    all_nodes_child2 = child2_root.get_all_nodes()\n",
    "\n",
    "    # Ensure there are nodes to swap beyond just the root\n",
    "    if len(all_nodes_child1) < 2 or len(all_nodes_child2) < 2:\n",
    "        return child1_root, child2_root\n",
    "\n",
    "    # Choose random nodes (not roots) to be crossover points\n",
    "    cross_point1 = random.choice([n for n in all_nodes_child1 if n != child1_root])\n",
    "    cross_point2 = random.choice([n for n in all_nodes_child2 if n != child2_root])\n",
    "\n",
    "    # Find parent of cross_point1 in child1_root tree\n",
    "    parent_cross_point1 = None\n",
    "    for node in all_nodes_child1:\n",
    "        if cross_point1 in node.children:\n",
    "            parent_cross_point1 = node\n",
    "            break\n",
    "\n",
    "    # Find parent of cross_point2 in child2_root tree\n",
    "    parent_cross_point2 = None\n",
    "    for node in all_nodes_child2:\n",
    "        if cross_point2 in node.children:\n",
    "            parent_cross_point2 = node\n",
    "            break\n",
    "\n",
    "    if parent_cross_point1 and parent_cross_point2:  # Perform swap\n",
    "        # Remove subtrees from parents\n",
    "        parent_cross_point1.children.remove(cross_point1)\n",
    "        parent_cross_point2.children.remove(cross_point2)\n",
    "\n",
    "        # Attach swapped subtrees\n",
    "        parent_cross_point1.add_child(cross_point2)\n",
    "        parent_cross_point2.add_child(cross_point1)\n",
    "\n",
    "        # After crossover, the `occupied_squares_set` and `diffusion_nodes_info` of the affected trees\n",
    "        # (child1_root, child2_root, and their subtrees) might be inconsistent.\n",
    "        # These will be implicitly re-calculated by `get_illuminated_area` for fitness evaluation.\n",
    "        # For mutation, we explicitly rebuild them (as seen in mutate_tree_diffusion).\n",
    "\n",
    "    return child1_root, child2_root\n",
    "\n",
    "\n",
    "# --- PLOTTING FUNCTIONS ---\n",
    "\n",
    "def plot_illuminated_area2(ax, illuminated_coords, title, color='blue', alpha=0.5):\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "    if not illuminated_coords:\n",
    "        ax.set_title(title)\n",
    "        ax.grid(True)\n",
    "        return\n",
    "\n",
    "    for x, y in illuminated_coords:\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=0.5)\n",
    "        ax.add_patch(rect)\n",
    "\n",
    "    min_x = min(c[0] for c in illuminated_coords) - 1\n",
    "    max_x = max(c[0] for c in illuminated_coords) + 2\n",
    "    min_y = min(c[1] for c in illuminated_coords) - 1\n",
    "    max_y = max(c[1] for c in illuminated_coords) + 2\n",
    "\n",
    "    ax.set_xlim(min_x, max_x)\n",
    "    ax.set_ylim(min_y, max_y)\n",
    "    ax.set_xticks(range(int(min_x), int(max_x)))\n",
    "    ax.set_yticks(range(int(min_y), int(max_y)))\n",
    "    ax.grid(True)\n",
    "    ax.set_title(title)\n",
    "\n",
    "def plot_tree_with_illumination2(tree_root, illuminated_coords, ax, tree_color='lightblue', diff_color='red', title=\"\"):\n",
    "    # Plot illuminated area first (background)\n",
    "    for x, y in illuminated_coords:\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=diff_color, alpha=0.5, zorder=0) # Changed alpha for more transparency\n",
    "        ax.add_patch(rect)\n",
    "\n",
    "    if tree_root is None:\n",
    "        return\n",
    "\n",
    "    # Plot tree nodes and their diffusion circles\n",
    "    all_nodes = tree_root.get_all_nodes()\n",
    "    for node in all_nodes:\n",
    "        # Plot the square representing the cell\n",
    "        rect = patches.Rectangle((node.x, node.y), 1, 1, facecolor=tree_color, edgecolor='black', linewidth=1, zorder=1)\n",
    "        ax.add_patch(rect)\n",
    "        ax.text(node.x + 0.5, node.y + 0.5, node.value.split('_')[-1], ha='center', va='center', color='darkblue', fontsize=7, zorder=2)\n",
    "\n",
    "        # Plot the circle representing the radius of influence\n",
    "        circle = patches.Circle((node.x + 0.5, node.y + 0.5), node.radius, color='red', alpha=0.2, zorder=2)\n",
    "        ax.add_patch(circle)\n",
    "\n",
    "    # Draw lines connecting parent to children\n",
    "    for node in all_nodes:\n",
    "        for child in node.children:\n",
    "            ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--', linewidth=0.8, zorder=3)\n",
    "\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "    ax.set_title(title)\n",
    "\n",
    "    # Set plot limits based on the illuminated coordinates\n",
    "    if illuminated_coords:\n",
    "        all_x = [c[0] for c in illuminated_coords]\n",
    "        all_y = [c[1] for c in illuminated_coords]\n",
    "\n",
    "        min_x_val = min(all_x) - 1\n",
    "        max_x_val = max(all_x) + 2\n",
    "        min_y_val = min(all_y) - 1\n",
    "        max_y_val = max(all_y) + 2\n",
    "\n",
    "        ax.set_xlim(min_x_val, max_x_val)\n",
    "        ax.set_ylim(min_y_val, max_y_val)\n",
    "        ax.set_xticks(range(int(min_x_val), int(max_x_val)))\n",
    "        ax.set_yticks(range(int(min_y_val), int(max_y_val)))\n",
    "    ax.grid(True)\n",
    "\n",
    "\n",
    "# --- MAIN EVOLUTIONARY SIMULATION LOOP ---\n",
    "\n",
    "def run_evolutionary_lighting2(target_tree_params, ga_params):\n",
    "\n",
    "    # 1. Generate Target Tree and its Illuminated Area\n",
    "    print(\"\\n--- Generating Target Tree ---\")\n",
    "    random.seed(ga_params['seed'] + 1) # Use a different seed for target generation\n",
    "    target_occupied_squares = set()\n",
    "    target_diffusion_info = []\n",
    "    target_tree_root = generate_random_spatial_tree_diffusion2(\n",
    "        max_depth=target_tree_params['max_depth'], max_children=target_tree_params['max_children'],\n",
    "        max_node_radius=target_tree_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "        node_prefix=\"Target\", occupied_squares_set=target_occupied_squares,\n",
    "        diffusion_nodes_info=target_diffusion_info, overlap_factor=target_tree_params['overlap_factor']\n",
    "    )\n",
    "\n",
    "    if not target_tree_root:\n",
    "        print(\"Failed to generate target tree. Exiting.\")\n",
    "        return None, None, None, None, []\n",
    "\n",
    "    target_illuminated_area = get_illuminated_area2(target_tree_root, resolution=ga_params['illumination_resolution'])\n",
    "    print(f\"Target Tree Generated with {len(target_tree_root.get_all_nodes())} nodes. Illuminated area size: {len(target_illuminated_area)}\")\n",
    "\n",
    "    # 2. Initialize Population\n",
    "    random.seed(ga_params['seed']) # Reset seed for GA population generation\n",
    "    print(f\"\\n--- Initializing Population of {ga_params['pop_size']} Trees ---\")\n",
    "    population = create_initial_population_diffusion2(\n",
    "        pop_size=ga_params['pop_size'], max_depth=ga_params['max_depth'], max_children=ga_params['max_children'],\n",
    "        max_node_radius=ga_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "        overlap_factor=ga_params['overlap_factor']\n",
    "    )\n",
    "    print(f\"Population initialized with {len(population)} individuals.\")\n",
    "\n",
    "    best_tree_overall = None\n",
    "    best_fitness_overall = -1.0\n",
    "    history = []\n",
    "\n",
    "    # 3. Evolutionary Loop\n",
    "    print(f\"\\n--- Starting Evolutionary Loop for {ga_params['generations']} Generations ---\")\n",
    "    for generation in range(ga_params['generations']):\n",
    "        fitness_scores = [calculate_fitness_illumination2(tree, target_illuminated_area) for tree in population]\n",
    "\n",
    "        current_best_fitness = max(fitness_scores)\n",
    "        current_best_tree = population[np.argmax(fitness_scores)]\n",
    "\n",
    "        if current_best_fitness > best_fitness_overall:\n",
    "            best_fitness_overall = current_best_fitness\n",
    "            best_tree_overall = copy.deepcopy(current_best_tree) # Deepcopy to save the best tree\n",
    "\n",
    "        history.append(current_best_fitness)\n",
    "\n",
    "        print(f\"Generation {generation+1}/{ga_params['generations']}: Best Fitness = {current_best_fitness:.4f} (Overall Best: {best_fitness_overall:.4f})\")\n",
    "\n",
    "        if best_fitness_overall >= 0.999: # Almost perfect match\n",
    "            print(\"Target illumination achieved (or very close)! Stopping evolution.\")\n",
    "            break\n",
    "\n",
    "        # Selection\n",
    "        parents = select_parents_diffusion2(population, fitness_scores, ga_params['pop_size'] // 2)\n",
    "\n",
    "        # Create next generation\n",
    "        next_population = []\n",
    "        # Elitism: Keep the best individual from the current generation\n",
    "        if best_tree_overall and current_best_fitness == best_fitness_overall: # Only if it's the current best in this generation\n",
    "            next_population.append(copy.deepcopy(current_best_tree))\n",
    "\n",
    "        while len(next_population) < ga_params['pop_size']:\n",
    "            if len(parents) < 2: # Not enough parents for crossover, fill with new random trees\n",
    "                occupied_squares = set()\n",
    "                diffusion_info = []\n",
    "                new_tree = generate_random_spatial_tree_diffusion2(\n",
    "                    max_depth=ga_params['max_depth'], max_children=ga_params['max_children'],\n",
    "                    max_node_radius=ga_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "                    node_prefix=f\"RandomFill_{len(next_population)}\",\n",
    "                    occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info,\n",
    "                    overlap_factor=ga_params['overlap_factor']\n",
    "                )\n",
    "                if new_tree:\n",
    "                    next_population.append(new_tree)\n",
    "                continue\n",
    "\n",
    "            # Randomly pick two parents (can be the same parent multiple times with replacement for simplicity)\n",
    "            p1 = random.choice(parents)\n",
    "            p2 = random.choice(parents)\n",
    "\n",
    "            # Crossover\n",
    "            child1, child2 = crossover_trees_diffusion2(p1, p2, ga_params['crossover_rate'], ga_params['max_node_radius'], ga_params['overlap_factor'])\n",
    "\n",
    "            # Mutation\n",
    "            mutated_child1 = mutate_tree_diffusion2(child1, ga_params['max_depth'], ga_params['max_children'], ga_params['max_node_radius'], ga_params['mutation_rate'], ga_params['overlap_factor'])\n",
    "            mutated_child2 = mutate_tree_diffusion2(child2, ga_params['max_depth'], ga_params['max_children'], ga_params['max_node_radius'], ga_params['mutation_rate'], ga_params['overlap_factor'])\n",
    "\n",
    "            next_population.append(mutated_child1)\n",
    "            if len(next_population) < ga_params['pop_size']:\n",
    "                next_population.append(mutated_child2)\n",
    "\n",
    "        population = next_population[:ga_params['pop_size']]\n",
    "\n",
    "    print(\"\\n--- Evolution Finished ---\")\n",
    "    print(f\"Final Best Fitness: {best_fitness_overall:.4f}\")\n",
    "\n",
    "    return target_tree_root, target_illuminated_area, best_tree_overall, best_fitness_overall, history\n",
    "\n",
    "\n",
    "# --- MAIN EXECUTION ---\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "      # Parameters for the target tree generation\n",
    "    TARGET_TREE_PARAMS = {\n",
    "        'max_depth': 3,\n",
    "        'max_children': 2,\n",
    "        'max_node_radius': 3.0,\n",
    "        'overlap_factor': 0.7\n",
    "    }\n",
    "\n",
    "    # Parameters for the Genetic Algorithm\n",
    "    GA_PARAMS = {\n",
    "        'seed': 67682,\n",
    "        'pop_size': 10,\n",
    "        'generations': 500,\n",
    "        'max_depth': 3,\n",
    "        'max_children': 3,\n",
    "        'max_node_radius': 3.0,\n",
    "        'mutation_rate': 0.1,\n",
    "        'crossover_rate': 0.7,\n",
    "        'overlap_factor': 0.7,\n",
    "        'illumination_resolution': 100 # Increased resolution for more accurate illumination calculation\n",
    "    }\n",
    "\n",
    "\n",
    "    target_tree, target_area, evolved_best_tree, evolved_best_fitness, history = run_evolutionary_lighting2(TARGET_TREE_PARAMS, GA_PARAMS)\n",
    "\n",
    "    # --- Plotting Results ---\n",
    "    if target_tree and evolved_best_tree:\n",
    "        fig, axes = plt.subplots(1, 3, figsize=(24, 8))\n",
    "\n",
    "        # Plot 1: Target Tree Structure and its Illumination\n",
    "        plot_tree_with_illumination2(target_tree, target_area, axes[0], tree_color='skyblue', diff_color='green', title=\"Target Tree and Illuminated Area\")\n",
    "\n",
    "        # Plot 2: Best Evolved Tree Structure and its Illumination\n",
    "        evolved_best_area = get_illuminated_area2(evolved_best_tree, resolution=GA_PARAMS['illumination_resolution'])\n",
    "        plot_tree_with_illumination2(evolved_best_tree, evolved_best_area, axes[1], tree_color='lightcoral', diff_color='purple', title=f\"Best Evolved Tree (Fitness: {evolved_best_fitness:.4f})\")\n",
    "\n",
    "        # Plot 3: Symmetric Difference Area\n",
    "        symmetric_diff_area = target_area.symmetric_difference(evolved_best_area)\n",
    "        plot_illuminated_area2(axes[2], symmetric_diff_area, title=f\"Symmetric Difference (Error Area: {len(symmetric_diff_area)})\")\n",
    "\n",
    "        plt.tight_layout()\n",
    "        plt.show()\n",
    "\n",
    "        # Plot Fitness History\n",
    "        plt.figure(figsize=(10, 6))\n",
    "        plt.plot(history, marker='o', linestyle='-', color='blue')\n",
    "        plt.title('Best Fitness Progression Over Generations')\n",
    "        plt.xlabel('Generation')\n",
    "        plt.ylabel('Fitness')\n",
    "        plt.grid(True)\n",
    "        plt.show()\n",
    "    else:\n",
    "        print(\"No plot\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "xiZcexLWpCI5"
   },
   "source": [
    "**Observations.** The program forgot the biggest circle of the Best Evolved Tree. It is also time-hungry: Colab needed 5 hours to produce observed results in the last run.\n",
    "\n",
    "**Crude reality.** The program is impossible to debug because each round demands 5 hours or more.\n",
    "\n",
    "**New direction.** We consider that the Lighting Network Model is simple and well oriented. So, let us try to accelerate the program. But, how? In our opinion, the program is time-consuming because it checks 10 thousand pixels to decide whether an area is illuminated. Instead, let us use algebra, and the geometry underneath, to try a new approach, whose main idea is: knowing the points of intersection of a circle with a horizontal or vertical line, we can decide if the neighboring cells are illuminated. Let us proceed:\n",
    "\n",
    "The equation of a circle of radius $r$ and centered at $(a,b)$ is\n",
    "\n",
    "$(x-a)^2 + (y-b)^2 = r^2$\n",
    "\n",
    "Let us study the intersection of a circle with a horizontal line of the grid.\n",
    "\n",
    "The equation of a horizontal line is $y = l$ where $l$ is an integer. The intersection of the line with the circle is given by\n",
    "\n",
    "$(x-a)^2 + (l-b)^2 = r^2$\n",
    "\n",
    "$(x-a)^2 = r^2 - (l-b)^2$\n",
    "\n",
    "$(x-a) = \\pm \\sqrt{r^2 - (l-b)^2}$\n",
    "\n",
    "$ x_{\\pm} = a \\pm \\sqrt{r^2 - (l-b)^2}$\n",
    "\n",
    "Since $y = l$, the intersection points are $ ( a \\pm \\sqrt{r^2 - (l-b)^2}, l)$\n",
    "\n",
    "\n",
    "If the discriminant is zero, $r^2 - (l-b)^2 = 0$, the line kisses the circle at one point, and there is one illuminated cell. It is at the side of the center of the circle:\n",
    "\n",
    "- If $b > l$, the illuminated cell is $ ( a, l)$\n",
    "- If $b < l$, the illuminated cell is $ (a, l-1)$\n",
    "\n",
    "If the discriminant is positive, $r^2 - (l-b)^2 > 0$, the circle intersects the line at two points. Both cells, below or above each intersection point are illuminated. Cells can be repeated or not.  The coordinates of their bottom right corners are given by the integer that is immediately lees than $ x_{\\pm}$:\n",
    "\n",
    "$(floor( x_{\\pm}), l)$, cell above the intersection point.\n",
    "\n",
    "$(floor( x_{\\pm}), l-1)$, cell below the intersection point.\n",
    "\n",
    "If the discriminant is negative, $r^2 - (l-b)^2 < 0$, the line does not intersect the circle. No illuminated cell must be reported.\n",
    "\n",
    "Let us study now the intersection of a circle with a vertical line $x = k$. The intersection of the line with the circle is given by\n",
    "\n",
    "$(k-a)^2 + (y-b)^2 = r^2$\n",
    "\n",
    "$(y-b)^2 = r^2 - (k-a)^2 $\n",
    "\n",
    "$(y-b)  = \\pm \\sqrt{r^2 - (k-a)^2} $\n",
    "\n",
    "$ y_{\\pm} = b \\pm  \\sqrt{r^2 - (k-a)^2}$\n",
    "\n",
    "Since $x = k$, the intersection points are $ ( k,   b \\pm \\sqrt{r^2 - (k-a)^2} )$\n",
    "\n",
    "\n",
    "If the discriminant is zero, $r^2 - (k-a)^2 = 0$, the line kisses the circle at one point, and there is one illuminated cell. It is at the side of the center of the circle.\n",
    "\n",
    "If the discriminant is positive, $r^2 - (k-a)^2 > 0$, the circle intersects the line at two points. The two cells, one left, the other right to each intersection point, are illuminated. Their bottom-right corners are given by\n",
    "\n",
    "$ ( k, floor(y_{\\pm}))$ where $ y_{\\pm} = b \\pm \\sqrt{r^2 - (k-a)^2} )$\n",
    "\n",
    "\n",
    "If the discriminant is negative, $r^2 - (k-a)^2 < 0$, the line does not intersect the circle. No illuminated cell can be reported.\n",
    "\n",
    "We leave aside some exceptional cases that might cause an error. For example:\n",
    "\n",
    "1. When a circle passes through a cross point resulting from the intersection of a horizontal with a vertical line.\n",
    "2. When a circle kisses a cross point.\n",
    "\n",
    "Small circles can exist that intersects no line. That is why every cell that contains a center of a circle is illuminated and must be reported.\n",
    "\n",
    "To implement this idea, we asked for help from Gemini, and the answer was the following reformation of the previous program:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "d0f38db4"
   },
   "outputs": [],
   "source": [
    "# Program evolution_of_morphological_trees_3.py\n",
    "# Morphological trees considered here are like lighting trees:\n",
    "# a tree extends the electrical thread and at each node there is lamp.\n",
    "# Each lamp has a given power and a circle of illumination,\n",
    "# whose radius is determined by a threshold intensity.\n",
    "# In morphology, this corresponds with a threshold concentration of a messenger.\n",
    "# Evolution is given the task of illuminating\n",
    "# the area determined by a random tree.\n",
    "# Reformation: the illuminated area is calculated\n",
    "# on the basis of the intersection of the circle\n",
    "# with horizontal and vertical lines with integer values\n",
    "# as described in the text.\n",
    "# By Gemini 2.5 Flash with a minor help from the Author.\n",
    "\n",
    "\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "from numpy import array as Array\n",
    "import copy # For deep copying trees during reproduction and mutation\n",
    "import sys # Import sys module to adjust recursion limit\n",
    "import math # For math.floor, math.ceil, math.sqrt\n",
    "\n",
    "sys.setrecursionlimit(3000) # Increase the recursion limit for potentially deep trees\n",
    "\n",
    "# --- SPATIAL TREE NODE FOR DIFFUSION ---\n",
    "\n",
    "class SpatialTreeNode_Evolution_Diffusion3:\n",
    "    def __init__(self, value, x, y, radius, occupied_squares_set, diffusion_nodes_info):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "\n",
    "        self.radius = radius\n",
    "        self.occupied_squares_set = occupied_squares_set  # Reference to the set of squares occupied by *this* tree's nodes\n",
    "        self.diffusion_nodes_info = diffusion_nodes_info  # Reference to the list of (x,y,radius) for *all* nodes in *this* tree\n",
    "\n",
    "        self.occupied_squares_set.add((x, y))  # Add current node's (x,y) square to the set\n",
    "        self.diffusion_nodes_info.append((x, y, radius))  # Add current node's (x,y,radius) to the list\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode_Evolution_Diffusion3):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode_Evolution_Diffusion3\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue  # Exclude the current square itself\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def _is_diffusion_overlapping_local(self, potential_nx, potential_ny, potential_radius, overlap_factor):\n",
    "        \"\"\"\n",
    "        Checks if a potential new node's diffusion circle overlaps \"too much\" with EXISTING nodes IN THE SAME TREE.\n",
    "        \"Too much overlap\" is defined by the overlap_factor.\n",
    "        \"\"\"\n",
    "        potential_center_x, potential_center_y = potential_nx + 0.5, potential_ny + 0.5\n",
    "\n",
    "        for ex, ey, er in self.diffusion_nodes_info:\n",
    "            # Skip checking against self if self is already in diffusion_nodes_info\n",
    "            if (ex, ey) == (self.x, self.y):\n",
    "                continue\n",
    "\n",
    "            existing_center_x, existing_center_y = ex + 0.5, ey + 0.5\n",
    "\n",
    "            # Calculate distance between centers\n",
    "            distance = np.sqrt((potential_center_x - existing_center_x)**2 + (potential_ny - existing_center_y)**2)\n",
    "\n",
    "            # Check for significant overlap\n",
    "            # If distance is less than a fraction of the sum of radii, it's too much overlap.\n",
    "            if distance < overlap_factor * (potential_radius + er):\n",
    "                return True # Significant overlap detected\n",
    "        return False\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix, max_node_radius, overlap_factor):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "\n",
    "        # First, filter for unoccupied grid squares *within this tree*\n",
    "        available_square_neighbors = [coord for coord in coordinates_neighbors if coord not in self.occupied_squares_set]\n",
    "\n",
    "        valid_child_candidates = []  # Store (nx, ny, child_radius) for candidates that pass overlap check\n",
    "\n",
    "        for nx, ny in available_square_neighbors:\n",
    "            # Generate potential radius for this child, ensuring it's not too large or small\n",
    "            child_radius = random.uniform(0.5, max_node_radius)\n",
    "            if not self._is_diffusion_overlapping_local(nx, ny, child_radius, overlap_factor):\n",
    "                valid_child_candidates.append((nx, ny, child_radius))\n",
    "\n",
    "        if not valid_child_candidates:\n",
    "            return None  # No available neighbors that satisfy both square and diffusion overlap conditions\n",
    "\n",
    "        # Choose a random valid candidate\n",
    "        chosen_nx, chosen_ny, chosen_child_radius = random.choice(valid_child_candidates)\n",
    "\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        # Create child node; its __init__ will update occupied_squares_set and diffusion_nodes_info\n",
    "        child_node = SpatialTreeNode_Evolution_Diffusion3(child_value, chosen_nx, chosen_ny, chosen_child_radius, self.occupied_squares_set, self.diffusion_nodes_info)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def get_all_nodes(self):\n",
    "        all_nodes = []\n",
    "        stack = [self]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            all_nodes.append(node)\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "        return all_nodes\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode_Evolution_Diffusion(value={self.value}, x={self.x}, y={self.y}, R={self.radius:.2f}, children={[child.value for child in self.children]!r})\"\n",
    "\n",
    "\n",
    "# --- TREE GENERATION ---\n",
    "\n",
    "def generate_random_spatial_tree_diffusion3(\n",
    "    max_depth, max_children, max_node_radius, initial_x, initial_y, node_prefix=\"Node\",\n",
    "    current_depth=0, parent_node=None, occupied_squares_set=None, diffusion_nodes_info=None, overlap_factor=0.7\n",
    "):\n",
    "    if occupied_squares_set is None:\n",
    "        occupied_squares_set = set() # Initialize a new set for this tree's square coordinates\n",
    "    if diffusion_nodes_info is None:\n",
    "        diffusion_nodes_info = [] # Initialize a new list for this tree's node (x,y,radius) information\n",
    "\n",
    "    if parent_node is None:\n",
    "        # Root node at (initial_x, initial_y) with a random initial radius\n",
    "        node_value = f\"{node_prefix}_Root_{random.randint(0, 99)}\"\n",
    "        initial_radius = random.uniform(0.5, max_node_radius)\n",
    "        current_node = SpatialTreeNode_Evolution_Diffusion3(node_value, initial_x, initial_y, initial_radius, occupied_squares_set, diffusion_nodes_info)\n",
    "    else:\n",
    "        # Children are added by the parent's method, which handles their coordinates and radius\n",
    "        current_node = parent_node.add_child_in_random_neighbor(f\"{node_prefix}_{current_depth}\", max_node_radius, overlap_factor)\n",
    "        if current_node is None:\n",
    "            return None # Branch terminated if no available neighbor\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        num_children = random.randint(0, max_children) # Random number of children for this node\n",
    "        for _ in range(num_children):\n",
    "            generate_random_spatial_tree_diffusion3(\n",
    "                max_depth, max_children, max_node_radius, initial_x, initial_y, node_prefix,\n",
    "                current_depth + 1, current_node, occupied_squares_set, diffusion_nodes_info, overlap_factor\n",
    "            )\n",
    "    return current_node\n",
    "\n",
    "\n",
    "# --- ILLUMINATION AND FITNESS FUNCTIONS ---\n",
    "\n",
    "def get_illuminated_area3(tree):\n",
    "    \"\"\"\n",
    "    Calculates the set of (x,y) integer coordinates illuminated by the tree using the\n",
    "    algebraic approach described in the text, based on intersections with horizontal\n",
    "    and vertical grid lines.\n",
    "    \"\"\"\n",
    "    if tree is None:\n",
    "        return set()\n",
    "\n",
    "    illuminated_coords = set()\n",
    "    # diffusion_nodes_info contains (node_x, node_y, node_radius) for all nodes in the tree\n",
    "    all_nodes_info = tree.diffusion_nodes_info\n",
    "    print(f\" get_illuminated_area3: Tree has {len(all_nodes_info)} nodes.\"  )\n",
    "\n",
    "\n",
    "    if not all_nodes_info:\n",
    "        return set()\n",
    "\n",
    "    for node_x, node_y, node_radius in all_nodes_info:\n",
    "        print(f\" get_illuminated_area3: Processing node at ({node_x}, {node_y}) with radius {node_radius}\")\n",
    "        # The center of the circle is the center of the cell it occupies\n",
    "        circle_center_x = node_x + 0.5\n",
    "        circle_center_y = node_y + 0.5\n",
    "        r_sq = node_radius**2\n",
    "\n",
    "        # 1. Add the cell containing the center of the circle\n",
    "        # This covers the case of small circles not intersecting grid lines.\n",
    "        illuminated_coords.add((math.floor(circle_center_x), math.floor(circle_center_y)))\n",
    "\n",
    "        # 2. Horizontal Scan: Check intersections with horizontal grid lines\n",
    "        # Iterate y_line from floor(cy - r) to ceil(cy + r)\n",
    "        # These y_line values represent the y-coordinates of horizontal grid lines.\n",
    "        for y_line in range(math.floor(circle_center_y - node_radius), math.ceil(circle_center_y + node_radius) + 1):\n",
    "            dy = y_line - circle_center_y\n",
    "            discriminant = r_sq - dy*dy\n",
    "\n",
    "            if discriminant >= 0:\n",
    "                dx = math.sqrt(discriminant)\n",
    "                x_min_intersect = circle_center_x - dx\n",
    "                x_max_intersect = circle_center_x + dx\n",
    "\n",
    "                # For each integer x-coordinate that the horizontal segment crosses:\n",
    "                # Add the cells whose bottom-left corner's x-coordinate is in this range.\n",
    "                # This covers cells whose top edge is y_line AND cells whose bottom edge is y_line.\n",
    "                for ix in range(math.floor(x_min_intersect), math.floor(x_max_intersect) + 1):\n",
    "                    # Cell (ix, y_line) - its bottom edge is at y_line\n",
    "                    illuminated_coords.add((ix, y_line))\n",
    "                    # Cell (ix, y_line - 1) - its top edge is at y_line\n",
    "                    illuminated_coords.add((ix, y_line - 1))\n",
    "\n",
    "        # 3. Vertical Scan: Check intersections with vertical grid lines\n",
    "        # Iterate x_line from floor(cx - r) to ceil(cx + r)\n",
    "        # These x_line values represent the x-coordinates of vertical grid lines.\n",
    "        for x_line in range(math.floor(circle_center_x - node_radius), math.ceil(circle_center_x + node_radius) + 1):\n",
    "            dx = x_line - circle_center_x\n",
    "            discriminant = r_sq - dx*dx\n",
    "\n",
    "            if discriminant >= 0:\n",
    "                dy = math.sqrt(discriminant)\n",
    "                y_min_intersect = circle_center_y - dy\n",
    "                y_max_intersect = circle_center_y + dy\n",
    "\n",
    "                # For each integer y-coordinate that the vertical segment crosses:\n",
    "                # Add the cells whose bottom-left corner's y-coordinate is in this range.\n",
    "                # This covers cells whose right edge is x_line AND cells whose left edge is x_line.\n",
    "                for iy in range(math.floor(y_min_intersect), math.floor(y_max_intersect) + 1):\n",
    "                    # Cell (x_line, iy) - its left edge is at x_line\n",
    "                    illuminated_coords.add((x_line, iy))\n",
    "                    # Cell (x_line - 1, iy) - its right edge is at x_line\n",
    "                    illuminated_coords.add((x_line - 1, iy))\n",
    "\n",
    "    return illuminated_coords\n",
    "\n",
    "def calculate_fitness_illumination3(candidate_tree_root, target_illuminated_area):\n",
    "    \"\"\"\n",
    "    Calculates fitness based on the symmetric difference between illuminated areas.\n",
    "    Fitness is 1.0 for a perfect match, and decreases as symmetric difference increases.\n",
    "    \"\"\"\n",
    "    if candidate_tree_root is None:\n",
    "        # If the tree generation failed, assign a very low fitness\n",
    "        return 0.0001 # A small non-zero value to avoid division by zero issues later\n",
    "\n",
    "    candidate_illuminated_area = get_illuminated_area3(candidate_tree_root)\n",
    "\n",
    "    # Symmetric difference: (A U B) - (A intersect B)\n",
    "    # Or, the elements in A but not B, plus elements in B but not A.\n",
    "    symmetric_difference = candidate_illuminated_area.symmetric_difference(target_illuminated_area)\n",
    "\n",
    "    # Union size: used for normalization\n",
    "    union_size = len(candidate_illuminated_area.union(target_illuminated_area))\n",
    "\n",
    "    if union_size == 0:\n",
    "        if not target_illuminated_area and not candidate_illuminated_area:\n",
    "            return 1.0 # Perfect match if both are empty\n",
    "        else:\n",
    "            return 0.0001 # Should not happen if target is non-empty, but handles cases where both are empty but expected non-empty\n",
    "\n",
    "    # Fitness is 1.0 - (len(symmetric_difference) / union_size)\n",
    "    # This gives 1.0 for a perfect match (symmetric_difference_area = 0)\n",
    "    # and approaches 0.0 for large differences.\n",
    "    fitness = 1.0 - (len(symmetric_difference) / union_size)\n",
    "    return max(0.0001, fitness) # Ensure fitness is always positive\n",
    "\n",
    "\n",
    "# --- EVOLUTIONARY ALGORITHM COMPONENTS ---\n",
    "\n",
    "def create_initial_population_diffusion3(pop_size, max_depth, max_children, max_node_radius, initial_x, initial_y, overlap_factor, node_prefix=\"Individual\"):\n",
    "    population = []\n",
    "    for i in range(pop_size):\n",
    "        # Each tree needs its own occupied_squares_set and diffusion_nodes_info for independent generation\n",
    "        occupied_squares = set()\n",
    "        diffusion_info = []\n",
    "        tree = generate_random_spatial_tree_diffusion3(\n",
    "            max_depth=max_depth, max_children=max_children, max_node_radius=max_node_radius,\n",
    "            initial_x=initial_x, initial_y=initial_y, node_prefix=f\"{node_prefix}_{i}\",\n",
    "            occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info, overlap_factor=overlap_factor\n",
    "        )\n",
    "        if tree:\n",
    "            population.append(tree)\n",
    "    # If not enough trees generated due to space constraints, fill with more random ones (or handle error)\n",
    "    while len(population) < pop_size:\n",
    "        occupied_squares = set()\n",
    "        diffusion_info = []\n",
    "        new_tree = generate_random_spatial_tree_diffusion3(\n",
    "            max_depth=max_depth, max_children=max_children, max_node_radius=max_node_radius,\n",
    "            initial_x=initial_x, initial_y=initial_y, node_prefix=f\"RandomFill_{len(population)}\",\n",
    "            occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info,\n",
    "            overlap_factor=overlap_factor\n",
    "        )\n",
    "        if new_tree:\n",
    "            population.append(new_tree)\n",
    "        else:\n",
    "            # Handle case where a new tree could not be generated\n",
    "            # This might happen if parameters are too restrictive or space is exhausted\n",
    "            break # Exit if we can't generate enough valid trees\n",
    "    return population\n",
    "\n",
    "def select_parents_diffusion3(population, fitness_scores, num_parents):\n",
    "    parents = []\n",
    "    # Use roulette wheel selection or tournament selection. Tournament is generally robust.\n",
    "    for _ in range(num_parents):\n",
    "        tournament_size = min(5, len(population))\n",
    "        if tournament_size == 0:\n",
    "            break\n",
    "        tournament_candidates = random.sample(list(zip(population, fitness_scores)), tournament_size)\n",
    "        winner = max(tournament_candidates, key=lambda x: x[1])[0]\n",
    "        parents.append(winner)\n",
    "    return parents\n",
    "\n",
    "def mutate_tree_diffusion3(tree_root, max_depth, max_children, max_node_radius, mutation_rate, overlap_factor):\n",
    "    mutated_tree = copy.deepcopy(tree_root) # Work on a deep copy\n",
    "    all_nodes = mutated_tree.get_all_nodes()\n",
    "\n",
    "    if not all_nodes:\n",
    "        return mutated_tree\n",
    "\n",
    "    node_to_mutate = random.choice(all_nodes)\n",
    "\n",
    "    # Mutation 1: Add a child\n",
    "    if random.random() < mutation_rate:\n",
    "        # Need to regenerate the local_occupied_set and diffusion_nodes_info for the deepcopy\n",
    "        # This is a bit inefficient but ensures correctness after deepcopy/mutation operations\n",
    "        temp_occupied_set = set()\n",
    "        temp_diffusion_info = []\n",
    "        # Re-populate temp_occupied_set and temp_diffusion_info by traversing the deepcopied tree\n",
    "        stack = [mutated_tree]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            temp_occupied_set.add((node.x, node.y))\n",
    "            temp_diffusion_info.append((node.x, node.y, node.radius))\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "\n",
    "        # Now, try to add a child to the chosen node\n",
    "        node_to_mutate.occupied_squares_set = temp_occupied_set # Update reference for chosen node\n",
    "        node_to_mutate.diffusion_nodes_info = temp_diffusion_info # Update reference for chosen node\n",
    "\n",
    "        node_to_mutate.add_child_in_random_neighbor(\"MutatedChild\", max_node_radius, overlap_factor)\n",
    "\n",
    "    # Mutation 2: Change node radius\n",
    "    if random.random() < mutation_rate:\n",
    "        node_to_mutate.radius = random.uniform(0.5, max_node_radius)\n",
    "\n",
    "    # Mutation 3: Remove a child (if any)\n",
    "    if random.random() < mutation_rate and node_to_mutate.children:\n",
    "        child_to_remove = random.choice(node_to_mutate.children)\n",
    "        node_to_mutate.children.remove(child_to_remove)\n",
    "        # Note: Removing a child means its coordinates and diffusion info are no longer strictly part of the tree\n",
    "        # The fitness function will re-evaluate the actual illuminated area, handling this implicitly.\n",
    "\n",
    "    return mutated_tree\n",
    "\n",
    "def crossover_trees_diffusion3(parent1_root, parent2_root, crossover_rate, max_node_radius, overlap_factor):\n",
    "    if random.random() > crossover_rate:\n",
    "        return copy.deepcopy(parent1_root), copy.deepcopy(parent2_root)\n",
    "\n",
    "    child1_root = copy.deepcopy(parent1_root)\n",
    "    child2_root = copy.deepcopy(parent2_root)\n",
    "\n",
    "    all_nodes_child1 = child1_root.get_all_nodes()\n",
    "    all_nodes_child2 = child2_root.get_all_nodes()\n",
    "\n",
    "    # Ensure there are nodes to swap beyond just the root\n",
    "    if len(all_nodes_child1) < 2 or len(all_nodes_child2) < 2:\n",
    "        return child1_root, child2_root\n",
    "\n",
    "    # Choose random nodes (not roots) to be crossover points\n",
    "    cross_point1 = random.choice([n for n in all_nodes_child1 if n != child1_root])\n",
    "    cross_point2 = random.choice([n for n in all_nodes_child2 if n != child2_root])\n",
    "\n",
    "    # Find parent of cross_point1 in child1_root tree\n",
    "    parent_cross_point1 = None\n",
    "    for node in all_nodes_child1:\n",
    "        if cross_point1 in node.children:\n",
    "            parent_cross_point1 = node\n",
    "            break\n",
    "\n",
    "    # Find parent of cross_point2 in child2_root tree\n",
    "    parent_cross_point2 = None\n",
    "    for node in all_nodes_child2:\n",
    "        if cross_point2 in node.children:\n",
    "            parent_cross_point2 = node\n",
    "            break\n",
    "\n",
    "    if parent_cross_point1 and parent_cross_point2:  # Perform swap\n",
    "        # Remove subtrees from parents\n",
    "        parent_cross_point1.children.remove(cross_point1)\n",
    "        parent_cross_point2.children.remove(cross_point2)\n",
    "\n",
    "        # Attach swapped subtrees\n",
    "        parent_cross_point1.add_child(cross_point2)\n",
    "        parent_cross_point2.add_child(cross_point1)\n",
    "\n",
    "        # After crossover, the `occupied_squares_set` and `diffusion_nodes_info` of the affected trees\n",
    "        # (child1_root, child2_root, and their subtrees) might be inconsistent.\n",
    "        # These will be implicitly re-calculated by `get_illuminated_area` for fitness evaluation.\n",
    "        # For mutation, we explicitly rebuild them (as seen in mutate_tree_diffusion).\n",
    "\n",
    "    return child1_root, child2_root\n",
    "\n",
    "\n",
    "# --- PLOTTING FUNCTIONS ---\n",
    "\n",
    "def plot_illuminated_area3(ax, illuminated_coords, title, color='blue', alpha=0.5):\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "    if not illuminated_coords:\n",
    "        ax.set_title(title)\n",
    "        ax.grid(True)\n",
    "        return\n",
    "\n",
    "    for x, y in illuminated_coords:\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=0.5)\n",
    "        ax.add_patch(rect)\n",
    "\n",
    "    min_x = min(c[0] for c in illuminated_coords) - 1\n",
    "    max_x = max(c[0] for c in illuminated_coords) + 2\n",
    "    min_y = min(c[1] for c in illuminated_coords) - 1\n",
    "    max_y = max(c[1] for c in illuminated_coords) + 2\n",
    "\n",
    "    ax.set_xlim(min_x, max_x)\n",
    "    ax.set_ylim(min_y, max_y)\n",
    "    ax.set_xticks(range(int(min_x), int(max_x)))\n",
    "    ax.set_yticks(range(int(min_y), int(max_y)))\n",
    "    ax.grid(True)\n",
    "    ax.set_title(title)\n",
    "\n",
    "def plot_tree_with_illumination3(tree_root, illuminated_coords, ax, tree_color='lightblue', diff_color='red', title=\"\"):\n",
    "    # Plot illuminated area first (background)\n",
    "    for x, y in illuminated_coords:\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=diff_color, alpha=0.5, zorder=0) # Changed alpha for more transparency\n",
    "        ax.add_patch(rect)\n",
    "\n",
    "    if tree_root is None:\n",
    "        return\n",
    "\n",
    "    # Plot tree nodes and their diffusion circles\n",
    "    all_nodes = tree_root.get_all_nodes()\n",
    "    for node in all_nodes:\n",
    "        # Plot the square representing the cell\n",
    "        rect = patches.Rectangle((node.x, node.y), 1, 1, facecolor=tree_color, edgecolor='black', linewidth=1, zorder=1)\n",
    "        ax.add_patch(rect)\n",
    "        ax.text(node.x + 0.5, node.y + 0.5, node.value.split('_')[-1], ha='center', va='center', color='darkblue', fontsize=7, zorder=2)\n",
    "\n",
    "        # Plot the circle representing the radius of influence\n",
    "        circle = patches.Circle((node.x + 0.5, node.y + 0.5), node.radius, color='red', alpha=0.2, zorder=2)\n",
    "        ax.add_patch(circle)\n",
    "\n",
    "    # Draw lines connecting parent to children\n",
    "    for node in all_nodes:\n",
    "        for child in node.children:\n",
    "            ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--', linewidth=0.8, zorder=3)\n",
    "\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "    ax.set_title(title)\n",
    "\n",
    "    # Set plot limits based on the illuminated coordinates\n",
    "    if illuminated_coords:\n",
    "        all_x = [c[0] for c in illuminated_coords]\n",
    "        all_y = [c[1] for c in illuminated_coords]\n",
    "\n",
    "        min_x_val = min(all_x) - 1\n",
    "        max_x_val = max(all_x) + 2\n",
    "        min_y_val = min(all_y) - 1\n",
    "        max_y_val = max(all_y) + 2\n",
    "\n",
    "        ax.set_xlim(min_x_val, max_x_val)\n",
    "        ax.set_ylim(min_y_val, max_y_val)\n",
    "        ax.set_xticks(range(int(min_x_val), int(max_x_val)))\n",
    "        ax.set_yticks(range(int(min_y_val), int(max_y_val)))\n",
    "    ax.grid(True)\n",
    "\n",
    "\n",
    "# --- MAIN EVOLUTIONARY SIMULATION LOOP ---\n",
    "\n",
    "def run_evolutionary_lighting3(target_tree_params, ga_params):\n",
    "\n",
    "    # 1. Generate Target Tree and its Illuminated Area\n",
    "    print(\"\\n--- Generating Target Tree ---\")\n",
    "    random.seed(ga_params['seed'] + 1) # Use a different seed for target generation\n",
    "    target_occupied_squares = set()\n",
    "    target_diffusion_info = []\n",
    "    target_tree_root = generate_random_spatial_tree_diffusion3(\n",
    "        max_depth=target_tree_params['max_depth'], max_children=target_tree_params['max_children'],\n",
    "        max_node_radius=target_tree_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "        node_prefix=\"Target\", occupied_squares_set=target_occupied_squares,\n",
    "        diffusion_nodes_info=target_diffusion_info, overlap_factor=target_tree_params['overlap_factor']\n",
    "    )\n",
    "\n",
    "    if not target_tree_root:\n",
    "        print(\"Failed to generate target tree. Exiting.\")\n",
    "        return None, None, None, None, []\n",
    "\n",
    "    target_illuminated_area = get_illuminated_area3(target_tree_root)\n",
    "    print(f\"Target Tree Generated with {len(target_tree_root.get_all_nodes())} nodes. Illuminated area size: {len(target_illuminated_area)}\")\n",
    "\n",
    "    # 2. Initialize Population\n",
    "    random.seed(ga_params['seed']) # Reset seed for GA population generation\n",
    "    print(f\"\\n--- Initializing Population of {ga_params['pop_size']} Trees ---\")\n",
    "    population = create_initial_population_diffusion3(\n",
    "        pop_size=ga_params['pop_size'], max_depth=ga_params['max_depth'], max_children=ga_params['max_children'],\n",
    "        max_node_radius=ga_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "        overlap_factor=ga_params['overlap_factor']\n",
    "    )\n",
    "    print(f\"Population initialized with {len(population)} individuals.\")\n",
    "\n",
    "    best_tree_overall = None\n",
    "    best_fitness_overall = -1.0\n",
    "    history = []\n",
    "\n",
    "    # 3. Evolutionary Loop\n",
    "    print(f\"\\n--- Starting Evolutionary Loop for {ga_params['generations']} Generations ---\")\n",
    "    for generation in range(ga_params['generations']):\n",
    "        fitness_scores = [calculate_fitness_illumination3(tree, target_illuminated_area) for tree in population]\n",
    "\n",
    "        current_best_fitness = max(fitness_scores)\n",
    "        current_best_tree = population[np.argmax(fitness_scores)]\n",
    "\n",
    "        if current_best_fitness > best_fitness_overall:\n",
    "            best_fitness_overall = current_best_fitness\n",
    "            best_tree_overall = copy.deepcopy(current_best_tree) # Deepcopy to save the best tree\n",
    "\n",
    "        # Print the nodes of current_best_tree\n",
    "        all_nodes = current_best_tree.get_all_nodes()\n",
    "        print(\"run_evolutionary_lighting3 A: Info of all nodes of current_best_tree:\")\n",
    "        for node in all_nodes:\n",
    "            print(f\"x: {node.x}, y: {node.y}, value: {node.value.split('_')[-1]}, r: {node.radius}\")\n",
    "\n",
    "        # Print the nodes of evolved_best_tree\n",
    "        all_nodes = best_tree_overall.get_all_nodes()\n",
    "        print(\"run_evolutionary_lighting3 A: Info of all nodes of evolved_best_tree:\")\n",
    "        for node in all_nodes:\n",
    "            print(f\"x: {node.x}, y: {node.y}, value: {node.value.split('_')[-1]}, r: {node.radius}\")\n",
    "\n",
    "        history.append(current_best_fitness)\n",
    "\n",
    "        print(f\"Generation {generation+1}/{ga_params['generations']}: Best Fitness = {current_best_fitness:.4f} (Overall Best: {best_fitness_overall:.4f})\")\n",
    "\n",
    "        if best_fitness_overall >= 0.999: # Almost perfect match\n",
    "            print(\"Target illumination achieved (or very close)! Stopping evolution.\")\n",
    "            break\n",
    "\n",
    "        # Selection\n",
    "        parents = select_parents_diffusion3(population, fitness_scores, ga_params['pop_size'] // 2)\n",
    "\n",
    "        # Create next generation\n",
    "        next_population = []\n",
    "        # Elitism: Keep the best individual from the current generation\n",
    "        if best_tree_overall and current_best_fitness == best_fitness_overall: # Only if it's the current best in this generation\n",
    "            next_population.append(copy.deepcopy(current_best_tree))\n",
    "\n",
    "        while len(next_population) < ga_params['pop_size']:\n",
    "            if len(parents) < 2: # Not enough parents for crossover, fill with new random trees\n",
    "                occupied_squares = set()\n",
    "                diffusion_info = []\n",
    "                new_tree = generate_random_spatial_tree_diffusion3(\n",
    "                    max_depth=ga_params['max_depth'], max_children=ga_params['max_children'],\n",
    "                    max_node_radius=ga_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "                    node_prefix=f\"RandomFill_{len(next_population)}\",\n",
    "                    occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info,\n",
    "                    overlap_factor=ga_params['overlap_factor']\n",
    "                )\n",
    "                if new_tree:\n",
    "                    next_population.append(new_tree)\n",
    "                continue\n",
    "\n",
    "            # Randomly pick two parents (can be the same parent multiple times with replacement for simplicity)\n",
    "            p1 = random.choice(parents)\n",
    "            p2 = random.choice(parents)\n",
    "\n",
    "            # Crossover\n",
    "            child1, child2 = crossover_trees_diffusion3(p1, p2, ga_params['crossover_rate'], ga_params['max_node_radius'], ga_params['overlap_factor'])\n",
    "\n",
    "            # Mutation\n",
    "            mutated_child1 = mutate_tree_diffusion3(child1, ga_params['max_depth'], ga_params['max_children'], ga_params['max_node_radius'], ga_params['mutation_rate'], ga_params['overlap_factor'])\n",
    "            mutated_child2 = mutate_tree_diffusion3(child2, ga_params['max_depth'], ga_params['max_children'], ga_params['max_node_radius'], ga_params['mutation_rate'], ga_params['overlap_factor'])\n",
    "\n",
    "            next_population.append(mutated_child1)\n",
    "            if len(next_population) < ga_params['pop_size']:\n",
    "                next_population.append(mutated_child2)\n",
    "\n",
    "        population = next_population[:ga_params['pop_size']]\n",
    "\n",
    "    print(\"\\n--- Evolution Finished ---\")\n",
    "    print(f\"Final Best Fitness: {best_fitness_overall:.4f}\")\n",
    "    # Print the nodes of evolved_best_tree\n",
    "    all_nodes = best_tree_overall.get_all_nodes()\n",
    "    print(\"run_evolutionary_lighting3 B: Info of all nodes of evolved_best_tree:\")\n",
    "    for node in all_nodes:\n",
    "      print(f\"x: {node.x}, y: {node.y}, value: {node.value.split('_')[-1]}, r: {node.radius}\")\n",
    "\n",
    "\n",
    "    return target_tree_root, target_illuminated_area, best_tree_overall, best_fitness_overall, history\n",
    "\n",
    "\n",
    "# --- MAIN EXECUTION ---\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "      # Parameters for the target tree generation\n",
    "    TARGET_TREE_PARAMS = {\n",
    "        'max_depth': 3,\n",
    "        'max_children': 2,\n",
    "        'max_node_radius': 3.0,\n",
    "        'overlap_factor': 0.7\n",
    "    }\n",
    "\n",
    "    # Parameters for the Genetic Algorithm\n",
    "    GA_PARAMS = {\n",
    "        'seed': 67682,\n",
    "        'pop_size': 10,\n",
    "        'generations': 500,\n",
    "        'max_depth': 3,\n",
    "        'max_children': 3,\n",
    "        'max_node_radius': 3.0,\n",
    "        'mutation_rate': 0.1,\n",
    "        'crossover_rate': 0.7,\n",
    "        'overlap_factor': 0.7,\n",
    "        'illumination_resolution': 1 # This parameter is no longer used by get_illuminated_area3\n",
    "    }\n",
    "\n",
    "    '''\n",
    "    # Parameters for the target tree generation\n",
    "    TARGET_TREE_PARAMS = {\n",
    "        'max_depth': 20,\n",
    "        'max_children': 3,\n",
    "        'max_node_radius': 3.0,\n",
    "        'overlap_factor': 0.7\n",
    "    }\n",
    "\n",
    "    # Parameters for the Genetic Algorithm\n",
    "    GA_PARAMS = {\n",
    "        'seed': 67682,\n",
    "        'pop_size': 30,\n",
    "        'generations': 2,\n",
    "        'max_depth': 20,\n",
    "        'max_children': 3,\n",
    "        'max_node_radius': 3.0,\n",
    "        'mutation_rate': 0.1,\n",
    "        'crossover_rate': 0.7,\n",
    "        'overlap_factor': 0.7,\n",
    "        'illumination_resolution': 1 # This parameter is no longer used by get_illuminated_area3\n",
    "    }\n",
    "    '''\n",
    "    target_tree, target_area, evolved_best_tree, evolved_best_fitness, history = run_evolutionary_lighting3(TARGET_TREE_PARAMS, GA_PARAMS)\n",
    "\n",
    "    # Print the nodes of evolved_best_tree\n",
    "    all_nodes = evolved_best_tree.get_all_nodes()\n",
    "    print(\"Main: Info of all nodes of evolved_best_tree:\")\n",
    "    for node in all_nodes:\n",
    "      print(f\"x: {node.x}, y: {node.y}, value: {node.value.split('_')[-1]}, r: {node.radius}\")\n",
    "\n",
    "    '''\n",
    "    # Plot tree nodes and their diffusion circles\n",
    "    all_nodes = tree_root.get_all_nodes()\n",
    "    for node in all_nodes:\n",
    "        # Plot the square representing the cell\n",
    "        rect = patches.Rectangle((node.x, node.y), 1, 1, facecolor=tree_color, edgecolor='black', linewidth=1, zorder=1)\n",
    "        ax.add_patch(rect)\n",
    "        ax.text(node.x + 0.5, node.y + 0.5, node.value.split('_')[-1], ha='center', va='center', color='darkblue', fontsize=7, zorder=2)\n",
    "\n",
    "        # Plot the circle representing the radius of influence\n",
    "        circle = patches.Circle((node.x + 0.5, node.y + 0.5), node.radius, color='red', alpha=0.2, zorder=2)\n",
    "        ax.add_patch(circle)\n",
    "      '''\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "    # --- Plotting Results ---\n",
    "    if target_tree and evolved_best_tree:\n",
    "        fig, axes = plt.subplots(1, 3, figsize=(24, 8))\n",
    "\n",
    "        # Plot 1: Target Tree Structure and its Illumination\n",
    "        plot_tree_with_illumination3(target_tree, target_area, axes[0], tree_color='skyblue', diff_color='green', title=\"Target Tree and Illuminated Area\")\n",
    "\n",
    "        # Plot 2: Best Evolved Tree Structure and its Illumination\n",
    "        evolved_best_area = get_illuminated_area3(evolved_best_tree)\n",
    "        plot_tree_with_illumination3(evolved_best_tree, evolved_best_area, axes[1], tree_color='lightcoral', diff_color='purple', title=f\"Best Evolved Tree (Fitness: {evolved_best_fitness:.4f})\")\n",
    "\n",
    "        # Plot 3: Symmetric Difference Area\n",
    "        symmetric_diff_area = target_area.symmetric_difference(evolved_best_area)\n",
    "        plot_illuminated_area3(axes[2], symmetric_diff_area, title=f\"Symmetric Difference (Error Area: {len(symmetric_diff_area)})\")\n",
    "\n",
    "        plt.tight_layout()\n",
    "        plt.show()\n",
    "\n",
    "        # Plot Fitness History\n",
    "        plt.figure(figsize=(10, 6))\n",
    "        plt.plot(history, marker='o', linestyle='-', color='blue')\n",
    "        plt.title('Best Fitness Progression Over Generations')\n",
    "        plt.xlabel('Generation')\n",
    "        plt.ylabel('Fitness')\n",
    "        plt.grid(True)\n",
    "        plt.show()\n",
    "    else:\n",
    "        print(\"No plot\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "9-g3CAmWrOPk"
   },
   "source": [
    "**Exercise.** Assess the performance of the previous program.\n",
    ">\n",
    "> *Answer.* The program is very fast. It does in less than a minute what the previous program did in more than five hours. But, the same old error persisted: the illuminated area is not correctly transcribed into illuminated cells that must be darkened.\n",
    "\n",
    "**Task.** Study the code to make a diagnostics of the old illumination bug, and propose and test your solution.\n",
    ">\n",
    "> *Answer.* Nodes of the tree have the attribute `diffusion_nodes_info`.  Mutation and recombination cause severe changes everywhere that cause inconsistencies specially in this attribute. So, this attribute was ignored, and the corresponding information was read from the nodes directly. This was done in the function `get_illuminated_area3(tree)`. The corresponding code was the following:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "executionInfo": {
     "elapsed": 2700180,
     "status": "ok",
     "timestamp": 1786201161363,
     "user": {
      "displayName": "jose rodriguez",
      "userId": "08454562216435392883"
     },
     "user_tz": 300
    },
    "id": "4OM1Jd6xtpNQ",
    "outputId": "92256b3f-a2a9-4e2b-c6e3-6fd9c9c94672"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- Generating Target Tree ---\n",
      "Target Tree Generated with 6 nodes. Illuminated area size: 46\n",
      "\n",
      "--- Initializing Population of 200 Trees ---\n",
      "Population initialized with 200 individuals.\n",
      "\n",
      "--- Starting Evolutionary Loop for 500 Generations ---\n",
      "Generation 1/500: Best Fitness = 0.8125 (Overall Best: 0.8125)\n",
      "Generation 2/500: Best Fitness = 0.8462 (Overall Best: 0.8462)\n",
      "Generation 3/500: Best Fitness = 0.9167 (Overall Best: 0.9167)\n",
      "Generation 4/500: Best Fitness = 0.9167 (Overall Best: 0.9167)\n",
      "Generation 5/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 6/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 7/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 8/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 9/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 10/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 11/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 12/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 13/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 14/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 15/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 16/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 17/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 18/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 19/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 20/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 21/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 22/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 23/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 24/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 25/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 26/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 27/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 28/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 29/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 30/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 31/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 32/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 33/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 34/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 35/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 36/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 37/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 38/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 39/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 40/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 41/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 42/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 43/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 44/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 45/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 46/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 47/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 48/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 49/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 50/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 51/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 52/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 53/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 54/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 55/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 56/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 57/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 58/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 59/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 60/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 61/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 62/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 63/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 64/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 65/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 66/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 67/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 68/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 69/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 70/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 71/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 72/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 73/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 74/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 75/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 76/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 77/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 78/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 79/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 80/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 81/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 82/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 83/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 84/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 85/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 86/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 87/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 88/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 89/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 90/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 91/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 92/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 93/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 94/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 95/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 96/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 97/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 98/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 99/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 100/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 101/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 102/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 103/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 104/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 105/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 106/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 107/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 108/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 109/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 110/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 111/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 112/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 113/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 114/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 115/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 116/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 117/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 118/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 119/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 120/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 121/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 122/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 123/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 124/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 125/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 126/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 127/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 128/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 129/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 130/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 131/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 132/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 133/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 134/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 135/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 136/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 137/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 138/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 139/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 140/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 141/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 142/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 143/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 144/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 145/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 146/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 147/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 148/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 149/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 150/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 151/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 152/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 153/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 154/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 155/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 156/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 157/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 158/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 159/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 160/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 161/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 162/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 163/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 164/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 165/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 166/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 167/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 168/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 169/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 170/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 171/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 172/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 173/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 174/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 175/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 176/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 177/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 178/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 179/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 180/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 181/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 182/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 183/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 184/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 185/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 186/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 187/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 188/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 189/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 190/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 191/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 192/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 193/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 194/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 195/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 196/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 197/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 198/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 199/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 200/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 201/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 202/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 203/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 204/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 205/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 206/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 207/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 208/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 209/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 210/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 211/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 212/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 213/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 214/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 215/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 216/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 217/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 218/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 219/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 220/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 221/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 222/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 223/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 224/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 225/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 226/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 227/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 228/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 229/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 230/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 231/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 232/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 233/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 234/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 235/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 236/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 237/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 238/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 239/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 240/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 241/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 242/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 243/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 244/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 245/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 246/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 247/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 248/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 249/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 250/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 251/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 252/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 253/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 254/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 255/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 256/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 257/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 258/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 259/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 260/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 261/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 262/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 263/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 264/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 265/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 266/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 267/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 268/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 269/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 270/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 271/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 272/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 273/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 274/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 275/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 276/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 277/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 278/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 279/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 280/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 281/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 282/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 283/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 284/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 285/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 286/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 287/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 288/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 289/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 290/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 291/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 292/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 293/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 294/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 295/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 296/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 297/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 298/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 299/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 300/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 301/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 302/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 303/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 304/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 305/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 306/500: Best Fitness = 0.9583 (Overall Best: 0.9583)\n",
      "Generation 307/500: Best Fitness = 0.9783 (Overall Best: 0.9783)\n",
      "Generation 308/500: Best Fitness = 0.9783 (Overall Best: 0.9783)\n",
      "Generation 309/500: Best Fitness = 0.9783 (Overall Best: 0.9783)\n",
      "Generation 310/500: Best Fitness = 0.9783 (Overall Best: 0.9783)\n",
      "Generation 311/500: Best Fitness = 0.9783 (Overall Best: 0.9783)\n",
      "Generation 312/500: Best Fitness = 0.9783 (Overall Best: 0.9783)\n",
      "Generation 313/500: Best Fitness = 0.9783 (Overall Best: 0.9783)\n",
      "Generation 314/500: Best Fitness = 0.9783 (Overall Best: 0.9783)\n",
      "Generation 315/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 316/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 317/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 318/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 319/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 320/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 321/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 322/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 323/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 324/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 325/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 326/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 327/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 328/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 329/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 330/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 331/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 332/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 333/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 334/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 335/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 336/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 337/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 338/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 339/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 340/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 341/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 342/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 343/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 344/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 345/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 346/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 347/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 348/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 349/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 350/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 351/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 352/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 353/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 354/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 355/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 356/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 357/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 358/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 359/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 360/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 361/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 362/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 363/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 364/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 365/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 366/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 367/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 368/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 369/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 370/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 371/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 372/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 373/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 374/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 375/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 376/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 377/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 378/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 379/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 380/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 381/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 382/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 383/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 384/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 385/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 386/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 387/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 388/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 389/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 390/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 391/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 392/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 393/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 394/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 395/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 396/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 397/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 398/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 399/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 400/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 401/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 402/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 403/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 404/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 405/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 406/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 407/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 408/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 409/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 410/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 411/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 412/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 413/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 414/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 415/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 416/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 417/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 418/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 419/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 420/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 421/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 422/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 423/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 424/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 425/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 426/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 427/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 428/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 429/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 430/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 431/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 432/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 433/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 434/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 435/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 436/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 437/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 438/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 439/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 440/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 441/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 442/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 443/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 444/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 445/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 446/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 447/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 448/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 449/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 450/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 451/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 452/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 453/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 454/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 455/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 456/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 457/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 458/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 459/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 460/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 461/500: Best Fitness = 0.9787 (Overall Best: 0.9787)\n",
      "Generation 462/500: Best Fitness = 1.0000 (Overall Best: 1.0000)\n",
      "Target illumination achieved (or very close)! Stopping evolution.\n",
      "\n",
      "--- Evolution Finished ---\n",
      "Final Best Fitness: 1.0000\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAACSQAAAMeCAYAAAAORJhLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Wd4HNX59/HfzPaiLlnuFYON6Z1QjGkOnVCMIfSaPxBaSICQYBxCEkooDx0SIAETOoEUiiEm9F4CGGPccZXVpe27c54XshbLkizJlrSy/P1cly5bZ6fcc3Z2dc7MPedYxhgjAAAAAAAAAAAAAAAAAOgGdq4DAAAAAAAAAAAAAAAAANB/kJAEAAAAAAAAAAAAAAAAoNuQkAQAAAAAAAAAAAAAAACg25CQBAAAAAAAAAAAAAAAAKDbkJAEAAAAAAAAAAAAAAAAoNuQkAQAAAAAAAAAAAAAAACg25CQBAAAAAAAAAAAAAAAAKDbkJAEAAAAAAAAAAAAAAAAoNuQkAQAAAAAAAAAAAAAAACg25CQBAB90KJFi2RZlh5++OEur/vwww/LsiwtWrQoW7bffvtpv/3267b4NjaeTcm1114ry7JyHQYAAAC6wciRI3X66af3+n5ff/11WZal119/vdf33RNuvPFGjRs3To7jdHqdXPZJ0HOuvPJK7b777rkOAwAAoFflql/RzLIsXXvttS3KPvzwQ/3gBz9QKBSSZVn67LPPJEkvvfSSdthhB/n9flmWpdra2l6Pt685//zzddBBB+U6DHTR1KlTNWXKlFyHAaCLSEgCNhGWZXXqp69d4H7nnXd07bXXdtjIbb5A35kffK+53p5++ulch5JTy5cv17XXXpvtZOXalClTZFmWrrjiilyHAgAANiPNieBr/wwYMECTJk3Siy++2GP7jUajuvbaazvdF+mo7f/444/3WKx92abS56uvr9cNN9ygK664Qrb9/WWl9uIdOHBgm9vpa2347tbY2Khp06bphz/8oYqLizfogZPa2lqde+65KisrUygU0qRJk/TJJ5+0uewLL7ygnXbaSX6/X8OHD9e0adOUTqd7fJuXXHKJPv/8c73wwgtdOjYAANC3fPHFFzruuOM0YsQI+f1+DRkyRAcddJDuuOOOXIfWo2bPnq1rr702pw/Tjhw5Mtt2tm1bhYWF2nbbbXXuuefq/fff79Q2UqmUjj/+eFVXV+vWW2/VI488ohEjRqiqqkpTpkxRIBDQXXfdpUceeUShUKiHj6hvW7hwof70pz/pl7/8Zbas+QHx9n7+8Ic/5DDizrn77rtlWdYm+7DAn//8Z40fP15+v19jx45t87vniiuu0DPPPKPPP/88BxEC2FDuXAcAoHMeeeSRFr//9a9/1cyZM1uVjx8/vjfD6tA777yj6dOn6/TTT1dhYWG7y40fP77VsVx11VUKh8O6+uqrezhK9KRTTjlFU6dOlc/n67F9LF++XNOnT9fIkSO1ww479Nh+OqO+vl7/+Mc/NHLkSP3tb3/TH/7wBxLpAABAr/rNb36jUaNGyRijVatW6eGHH9ahhx6qf/zjHzr88MO7fX/RaFTTp0+XpC6NgHPRRRdp1113bVW+5557dldom5RNpc/34IMPKp1O68QTT2z12kEHHaRTTz21RVkgEJAkvfLKKy3K+1IbvidUVlbqN7/5jYYPH67tt9++y4lkjuPosMMO0+eff66f//znKi0t1d1336399ttPH3/8scaOHZtd9sUXX9TRRx+t/fbbT3fccYe++OIL/fa3v1VFRYXuueeeHt3mwIEDddRRR+nmm2/WkUceueEVBgAAcuadd97RpEmTNHz4cJ1zzjkaOHCgvvvuO7333nu6/fbb9dOf/jTXIfaY2bNna/r06dpvv/00cuTITq/3zTfftEjO31g77LCDfvazn0mSGhoa9PXXX+upp57SAw88oEsvvVS33HJLi+VjsZjc7u9v8c6fP1+LFy/WAw88oLPPPjtb/tJLL6mhoUHXXXedDjzwwG6Ld1N2++23a9SoUZo0aVKr10488UQdeuihrcp33HHH3ghto8yYMUMjR47UBx98oHnz5mmLLbbIdUiddt999+knP/mJjj32WF122WV68803ddFFFykajbZ46HvHHXfULrvsoj/+8Y/661//msOIAXQFCUnAJuLkk09u8ft7772nmTNntirfEMYYxePx7IXiXCgvL291LH/4wx9UWlq63mN0HEfJZFJ+v7+nQ8QGcrlccrlcuQ6j1zzzzDPKZDJ68MEHtf/+++uNN97QxIkTO1wvEols9k+nAACA7nHIIYdol112yf5+1llnqby8XH/72996JCFpQ+2zzz467rjjch1Gn7Ghfb5oNKpgMNiTobXw0EMP6cgjj2yzD7blllu2G6/X6+3p0PqUQYMGacWKFRo4cKA++uijNpPv1ufpp5/WO++8o6eeeir7OZkyZYq23HJLTZs2TY899lh22csvv1zbbbedXnnlleyNqfz8fP3ud7/TxRdfrHHjxvXYNpu3cfzxx2vBggUaPXr0BtQWAADIpeuvv14FBQX68MMPWz1UXFFRkZug+qC176N098O3Q4YMadWOvuGGG3TSSSfp1ltv1dixY/V///d/2dfWbYs3v0/tvX/re1i8qzbl69ipVEozZszQT37ykzZf32mnnbp8z21999fi8bi8Xu9GJa91pr4XLlyod955R88++6zOO+88zZgxQ9OmTetw2+l0Wo7j5LSvFovFdPXVV+uwww7LzgRyzjnnyHEcXXfddTr33HNVVFSUXX7KlCmaNm2a7r77boXD4VyFDaALmLIN6Eceeugh7b///howYIB8Pp+23nrrFk8uNhs5cqQOP/xwvfzyy9pll10UCAR03333SZIWL16sI488UqFQSAMGDNCll16ql19+uc2pAd5//3398Ic/VEFBgYLBoCZOnKi33347+/q1116rn//855KkUaNGZYe33JjhTy3L0oUXXqgZM2ZowoQJ8vl8eumllyRJy5Yt05lnnqny8nL5fD5NmDBBDz74YKttJBIJTZs2TVtssYV8Pp+GDRumX/ziF0okEh3u/80339Txxx+v4cOHZ9e99NJLFYvFWix3+umnKxwOa9myZTr66KMVDodVVlamyy+/XJlMpsWytbW1Ov3001VQUKDCwkKddtppPT6Pc/N0Huu+F83TZ6z9Xu+3337aZptt9L///U8TJ05UMBjUFltskW0c/ve//9Xuu++uQCCgrbbaSq+++mqH+2o+B9966y3ttttu8vv9Gj16dKus9urqal1++eXadtttFQ6HlZ+fr0MOOaTFkJyvv/569uL+GWeckT3P1p4OoaNztdlbb72lXXfdVX6/X2PGjMl+LrpixowZOuiggzRp0iSNHz9eM2bMaLVMc53897//1fnnn68BAwZo6NCh2ddffPFF7bPPPgqFQsrLy9Nhhx2mr776qsU2/ve//+n000/X6NGj5ff7NXDgQJ155pmqqqrqcswAAKB/KywsVCAQaPEErdSU3H/bbbdpwoQJ8vv9Ki8v13nnnaeampoWy3300UeaPHmySktLFQgENGrUKJ155pmSmoa2LysrkyRNnz492xa79tprNzrubbbZps2nVh3H0ZAhQ1okM0UiEf3sZz/TsGHD5PP5tNVWW+nmm2+WMabd7X/00UeyLEt/+ctfWr3W3Af65z//mS3rbH9j6dKlOvroo1v0qTrT1+iM5rb5xx9/rH333VfBYDA71UBX+jmPPvqodt55ZwUCARUXF2vq1Kn67rvvOtz/woUL9b///W+Dnq7eb7/9siNoddSGbz7O2bNna9KkSQoGgxoyZIhuvPHGVtvt7HHPnDlTe++9twoLCxUOh7XVVlu1mKZBku644w5NmDBBwWBQRUVF2mWXXVok6UjSnDlztGTJkg6P1+fztTtdXWc8/fTTKi8v1zHHHJMtKysr05QpU/T8889nj2/27NmaPXu2zj333Baf8fPPP1/GmBbTe/fENiVlz4fnn39+g48XAADkzvz58zVhwoQ2k1YGDBiQ/f/EiRO1/fbbt7mNrbbaSpMnT5b0/fRXN998s+666y6NHj1awWBQBx98sL777jsZY3Tddddp6NChCgQCOuqoo1RdXd1ie83Xj19//fXsPYxtt902e9362Wef1bbbbiu/36+dd95Zn376aauY5syZo+OOO07FxcXy+/3aZZddWkwz+/DDD+v444+XJE2aNKnVFMnru48ycuRInX766S32V1tbq0svvVQjR46Uz+fT0KFDdeqpp6qysrL9yl+PQCCgRx55RMXFxbr++utb9G3W7nOdfvrp2Qdijz/+eFmWlW17n3baaZKkXXfdVZZltYi5M9fMr732WlmWpdmzZ+ukk05SUVGR9t577+zrnelXdKVtH4/Hde2112rLLbeU3+/XoEGDdMwxx2j+/PnZZTrbj23LW2+9pcrKyo0aLaq986L53srjjz+uX/3qVxoyZIiCwaDq6+slSU899VS2rpofxF+2bFmLbTffV5o/f74OPfRQ5eXl6cc//nGHMc2YMUNFRUU67LDDdNxxx7V5T2Ltz+Vtt92mMWPGyOfzafbs2ZI6/rxInbtf02zJkiWaM2dOh7HPmjVLVVVVOv/881uUX3DBBYpEIvrXv/7Vovyggw5SJBLRzJkzO9w2gL6BEZKAfuSee+7RhAkTdOSRR8rtdusf//iHzj//fDmOowsuuKDFst98841OPPFEnXfeeTrnnHO01VZbKRKJaP/999eKFSt08cUXa+DAgXrsscc0a9asVvv6z3/+o0MOOUQ777yzpk2bJtu2swlRb775pnbbbTcdc8wxmjt3rv72t7/p1ltvVWlpqSRlb1hsqP/85z968skndeGFF6q0tFQjR47UqlWrtMcee2QTlsrKyvTiiy/qrLPOUn19vS655BJJTY3VI488Um+99ZbOPfdcjR8/Xl988YVuvfVWzZ07V3//+9/Xu++nnnpK0WhU//d//6eSkhJ98MEHuuOOO7R06VI99dRTLZbNZDKaPHmydt99d91888169dVX9cc//lFjxozJPs1gjNFRRx2lt956Sz/5yU80fvx4Pffcc9mOQl9RU1Ojww8/XFOnTtXxxx+ve+65R1OnTtWMGTN0ySWX6Cc/+YlOOukk3XTTTTruuOP03XffKS8vb73bnDdvno477jidddZZOu200/Tggw/q9NNP184776wJEyZIkhYsWKC///3vOv744zVq1CitWrVK9913nyZOnKjZs2dr8ODBGj9+vH7zm9/ommuu0bnnnqt99tlHkvSDH/xAUufOValpnvSDDz5YZWVluvbaa5VOpzVt2jSVl5d3up6WL1+uWbNmZW9qnXjiibr11lt15513tvmUwfnnn6+ysjJdc801ikQikpqm6jjttNM0efJk3XDDDYpGo7rnnnu0995769NPP80OHTxz5kwtWLBAZ5xxhgYOHKivvvpK999/v7766iu99957TBMHAMBmrK6uTpWVlTLGqKKiQnfccYcaGxtbPel53nnn6eGHH9YZZ5yhiy66SAsXLtSdd96pTz/9VG+//bY8Ho8qKiqybaQrr7xShYWFWrRokZ599llJTW37e+65R//3f/+nH/3oR9lEh+22267DOBsaGtq8OF9SUiLLsnTCCSfo2muv1cqVK1skdrz11ltavny5pk6dKqmpTX3kkUdq1qxZOuuss7TDDjvo5Zdf1s9//nMtW7ZMt956a5v732WXXTR69Gg9+eSTrdrfTzzxhIqKirI3VTrb34jFYjrggAO0ZMkSXXTRRRo8eLAeeeQR/ec//+mwPjqrqqpKhxxyiKZOnaqTTz5Z5eXlXernXH/99fr1r3+tKVOm6Oyzz9bq1at1xx13aN9999Wnn3663qen33nnHUlNTw63JR6Pt3pP8/LyWj1B3lEbXmrqg/zwhz/UMcccoylTpujpp5/WFVdcoW233VaHHHKIpM7377766isdfvjh2m677fSb3/xGPp9P8+bNa3HD5YEHHtBFF12k4447ThdffLHi8bj+97//6f3339dJJ53UIvaJEyd2eQq2rvr000+10047tXqaerfddtP999+vuXPnatttt83efFt7VDRJGjx4sIYOHdri5lxPbFOSCgoKNGbMGL399tu69NJLN+7AAQBArxsxYoTeffddffnll9pmm23aXe6UU07ROeec02q5Dz/8UHPnztWvfvWrFsvPmDFDyWRSP/3pT1VdXa0bb7xRU6ZM0f7776/XX39dV1xxhebNm6c77rhDl19+eatk/3nz5umkk07Seeedp5NPPlk333yzjjjiCN1777365S9/mU1g+P3vf68pU6a0mEbtq6++0l577aUhQ4boyiuvVCgU0pNPPqmjjz5azzzzjH70ox9p33331UUXXaT/9//+n375y19mp0Zee4rktu6jtKWxsVH77LOPvv76a5155pnaaaedVFlZqRdeeEFLly7N3hvpqnA4rB/96Ef685//rNmzZ2evm6/tvPPO05AhQ/S73/0uOy128zXtrbbaSvfff392Wu8xY8ZI6vw182bHH3+8xo4dq9/97nfZxKiu9Cs607bPZDI6/PDD9dprr2nq1Km6+OKL1dDQoJkzZ+rLL7/Mxt6Zfmx73nnnHVmW1e4UbNFotM0+amFhYYtE/fWdF9ddd528Xq8uv/xyJRIJeb3ebLy77rqrfv/732vVqlW6/fbb9fbbb7eqq3Q6rcmTJ2vvvffWzTff3KnRcGfMmKFjjjlGXq9XJ554ou655x59+OGHbY7S+tBDDykej+vcc8+Vz+dTcXFxpz4vUufu1zQ79dRT9d///ne9DwlJarfvsfPOO8u2bX366actrmVsvfXWCgQCevvtt7NxAejjDIBN0gUXXGDW/QhHo9FWy02ePNmMHj26RdmIESOMJPPSSy+1KP/jH/9oJJm///3v2bJYLGbGjRtnJJlZs2YZY4xxHMeMHTvWTJ482TiO02L/o0aNMgcddFC27KabbjKSzMKFC7t8jBMmTDATJ05sUSbJ2LZtvvrqqxblZ511lhk0aJCprKxsUT516lRTUFCQrZtHHnnE2LZt3nzzzRbL3XvvvUaSefvtt9cbU1t1/Pvf/95YlmUWL16cLTvttNOMJPOb3/ymxbI77rij2XnnnbO///3vfzeSzI033pgtS6fTZp999jGSzEMPPbTeeGbNmmUkmaeeeipb9tBDD7Wq84kTJ7aoy7aWWXt7ze9187qSzGOPPZYtmzNnTva9eO+997LlL7/8cqu429pX8zn4xhtvZMsqKiqMz+czP/vZz7Jl8XjcZDKZFjEuXLjQ+Hy+FnX74YcftllfXTlXjz76aOP3+1u8j7NnzzYul6vVZ609N998swkEAqa+vt4YY8zcuXONJPPcc8+1WK65Tvbee2+TTqez5Q0NDaawsNCcc845LZZfuXKlKSgoaFHe1rn4t7/9rVW9AgCAzUdzG2PdH5/PZx5++OEWy7755ptGkpkxY0aL8pdeeqlF+XPPPWckmQ8//LDd/a5evdpIMtOmTetUnM1tzvZ+VqxYYYwx5ptvvjGSzB133NFi/fPPP9+Ew+Fse6i5Tf3b3/62xXLHHXecsSzLzJs3L1s2YsQIc9ppp2V/v+qqq4zH4zHV1dXZskQiYQoLC82ZZ56ZLetsf+O2224zksyTTz6ZXSYSiZgtttiiVTu7I231+Zrb5vfee2+L8s72cxYtWmRcLpe5/vrrWyz3xRdfGLfb3ap8Xb/61a+MJNPQ0NDqtfbez+Y2+rp9kvba8Gsf51//+tdsWSKRMAMHDjTHHntsl4/71ltvNZLM6tWr2z22o446ykyYMGG9x998nOv2UzuyvmNtTygUanEONvvXv/7Voj/f3OdesmRJq2V33XVXs8cee/ToNpsdfPDBZvz48Z0+PgAA0He88sorxuVyGZfLZfbcc0/zi1/8wrz88ssmmUy2WK62ttb4/X5zxRVXtCi/6KKLTCgUMo2NjcaYpuu3kkxZWZmpra3NLnfVVVcZSWb77bc3qVQqW37iiScar9dr4vF4tqz5+vE777yTLWu+9hwIBFpcw73vvvtatbUPOOAAs+2227bYpuM45gc/+IEZO3Zstuypp55qt53e3n2U5tfW7ldcc801RpJ59tlnWy279nXptowYMcIcdthh7b7e3JZ9/vnns2Xr9r/auk9gzPd9xLX7c125Zj5t2jQjyZx44oktttuVfkVn2/YPPvigkWRuueWWVnXQHGdn+7HtOfnkk01JSUmr8uZztr2fd999N7tse+dF83swevToFtfuk8mkGTBggNlmm21MLBbLlv/zn/80ksw111yTLWu+r3TllVeu9zjW9tFHHxlJZubMmcaYproaOnSoufjii9s8xvz8fFNRUdHitc5+Xjp7v8aY79/3jlxwwQXG5XK1+VpZWZmZOnVqq/Itt9zSHHLIIR1uG0DfwJRtQD+y9hy1zU9FT5w4UQsWLFBdXV2LZUeNGpV92rfZSy+9pCFDhujII4/Mlvn9fp1zzjktlvvss8/07bff6qSTTlJVVZUqKytVWVmpSCSiAw44QG+88YYcx+mBI2wyceJEbb311tnfjTF65plndMQRR8gYk42nsrJSkydPVl1dnT755BNJTSMcjR8/XuPGjWux3P777y9JbY4Gtba16zgSiaiyslI/+MEPZIxpc1jYdeci3meffbRgwYLs7//+97/ldrtbzP/scrn005/+tAs10vPC4XD2CXSp6cmKwsJCjR8/Xrvvvnu2vPn/ax9je7beeuvsk9BS09P1W221VYt1fT5f9qmWTCajqqqq7PQKze/p+nT2XM1kMnr55Zd19NFHa/jw4dn1x48f3+pzsj4zZszQYYcdlh0dauzYsdp5553bHCJVapoL2eVyZX+fOXOmamtrdeKJJ7Y4P10ul3bfffcW5+fa52Lzk+h77LGHJHWqbgAAQP911113aebMmZo5c6YeffRRTZo0SWeffXZ2VCOpqV1cUFCggw46qEW7Y+edd1Y4HM62O5qf1PznP/+pVCrVrXFec8012TjX/ikuLpYkbbnlltphhx30xBNPZNfJZDJ6+umndcQRR2TbQ//+97/lcrl00UUXtdj+z372Mxlj9OKLL7YbwwknnKBUKtWibl555RXV1tbqhBNOkNS1/sa///1vDRo0qMV0csFgUOeee+5G1tb3fD6fzjjjjBZlne3nPPvss3IcR1OmTGmx3MCBAzV27NgO+0NVVVVyu90Kh8Ntvn7UUUe1ej+70p5eWzgcbvEkrNfr1W677daiv9DZ424+j59//vl2+6qFhYVaunSpPvzww/XGZYzp8dGRpKbRttYdWUpq6qM3v772v+0tu/b04j2xzWZFRUUbPB0JAADIrYMOOkjvvvuujjzySH3++ee68cYbNXnyZA0ZMqTFlE0FBQU66qij9Le//S076kkmk9ETTzyRnbJ4bccff7wKCgqyvzdfOz755JNbjDaz++67K5lMtpq+auutt9aee+7Zav3999+/xTXcda9JV1dX6z//+Y+mTJmSHZW1srJSVVVVmjx5sr799ttW+2pPW/dR2vLMM89o++23b3PElo0dyb657d3Q0LBR22m2Ifd31r3P0dV+RWfa9s8884xKS0vbvDfSXIed7ce2p6qqSkVFRe2+fu6557bZR137fpS0/vPitNNOa3Ht/qOPPlJFRYXOP//8bLtbkg477DCNGzeu1ZRkklrcL+rIjBkzVF5enp3uvHm04ccff1yZTKbV8scee2yLWUy68nnpyv2a119/vcPRkaSmvkdbs0tI9D2A/oIp24B+5O2339a0adP07rvvKhqNtnitrq6uReN/1KhRrdZfvHixxowZ06qBvMUWW7T4/dtvv5Wk9U4rVldXt96G3cZYN/bVq1ertrZW999/v+6///4216moqJDUFPvXX3/d7rRxzcu1Z8mSJbrmmmv0wgsvtJqTeN2kL7/f32o/RUVFLdZbvHixBg0a1OqCfntDv+bK0KFDW50XBQUFGjZsWKsySZ2ar3ntTmOzdevHcRzdfvvtuvvuu7Vw4cIWDeiSkpIO99HZczWRSCgWi2ns2LGtXt9qq63073//u8N9ff311/r000916qmnat68edny/fbbT3fddZfq6+uVn5/fYp11z+XmeJtvoKxr7fWrq6s1ffp0Pf74463O23XPRQAAsHnZbbfdWgx3fuKJJ2rHHXfUhRdeqMMPP1xer1fffvut6urqNGDAgDa30dy+mDhxoo499lhNnz5dt956q/bbbz8dffTROumkk9pMVuiKbbfdVgceeOB6lznhhBP0y1/+UsuWLdOQIUP0+uuvq6KiIpssJDW1qQcPHtxqyuDmqRYWL17c7va33357jRs3Tk888YTOOussSU3TtZWWlmbbZF3pbyxevFhbbLFFq7Zzd7bvhwwZ0uqCbWf7Od9++62MMW22eyWtd3qDzhg6dGiH72lXtrVuPRYVFel///tf9vfOHvcJJ5ygP/3pTzr77LN15ZVX6oADDtAxxxyj4447LntB/YorrtCrr76q3XbbTVtssYUOPvhgnXTSSdprr7265Xi6KhAIKJFItCqPx+PZ19f+t71l174Z0hPbbGaMYdpoAAA2YbvuuqueffZZJZNJff7553ruued066236rjjjtNnn32WTcg49dRT9cQTT+jNN9/Uvvvuq1dffVWrVq3SKaec0mqb617/bb523Nlryhu6/rx582SM0a9//Wv9+te/bvN4KyoqNGTIkHZq43tt3Udpy/z583Xsscd2atmuamxslKRW/Z0NtSH3d9q6jt2VfkVn2vbz58/XVltt1SJZra3YO9OPXZ/1JcmMHTu2U/2Z9Z0X677W3B9tq084btw4vfXWWy3K3G63hg4d2mEMUlNS0OOPP65JkyZp4cKF2fLdd99df/zjH/Xaa6/p4IMPXm98Xfm8bOz9mrYEAgElk8k2X6PvAfQPJCQB/cT8+fN1wAEHaNy4cbrllls0bNgweb1e/fvf/9att97aKqO9rT/indW8rZtuukk77LBDm8u098Rsd1g39uZ4Tj755HYb0dttt1122W233Va33HJLm8ut25lZWyaT0UEHHaTq6mpdccUVGjdunEKhkJYtW6bTTz+9VR2vPfJNX9NeY62tjHmp/WNpr7wzme+dWfd3v/udfv3rX+vMM8/Uddddp+LiYtm2rUsuuaRTo3B19lxt60J7Vz366KOSpEsvvVSXXnppq9efeeaZVk+yt3cuP/LIIxo4cGCrbazdGZsyZYreeecd/fznP9cOO+ygcDgsx3H0wx/+sEdHKAMAAJse27Y1adIk3X777fr22281YcIEOY6jAQMGtDuSY3OCh2VZevrpp/Xee+/pH//4h15++WWdeeaZ+uMf/6j33nuvR9v9UlMiyVVXXaWnnnpKl1xyiZ588kkVFBTohz/8Ybfu4/rrr1dlZaXy8vL0wgsv6MQTT8y2vbrS3+gNbfXlOtvPcRxHlmXpxRdfbLM93tH7WVJSonQ6rYaGhm67IdKezvQXOnvcgUBAb7zxhmbNmqV//etfeumll/TEE09o//331yuvvCKXy6Xx48frm2++0T//+U+99NJLeuaZZ3T33Xfrmmuu0fTp07v/ADswaNAgrVixolV5c9ngwYOzyzWXr9ufXbFihXbbbbce3WazmpoalZaWdu7gAABAn+X1erXrrrtq11131ZZbbqkzzjhDTz31lKZNmyZJmjx5ssrLy/Xoo49q33331aOPPqqBAwe2mcSxsdeUN3T95vb75Zdf3u4oNus+hN2ejbmP0l2+/PJLSZ2PuSMbcn+nrevYXelXbMx9hHX325l+bHtKSko69TB1R9Z3XmzsObP2KEQd+c9//qMVK1bo8ccf1+OPP97q9RkzZrRKSGrvnkRnPi8be7+mLYMGDVImk1FFRUWLRLNkMqmqqqpsH2VtNTU17SbDAeh7SEgC+ol//OMfSiQSeuGFF1o8OdDREJVrGzFihGbPnt0qu3jt0V4kacyYMZKaRmvpKFu8N7KUy8rKlJeXp0wm02E8Y8aM0eeff64DDjigy7F98cUXmjt3rv7yl7/o1FNPzZbPnDlzg+KWmur8tddeU2NjY4tG+jfffLPB2+yM5qcbamtrW5Sv7+nxXHj66ac1adIk/fnPf25RXltb2+Jid3vvZWfP1bKyMgUCgezTIWvrzHthjNFjjz2mSZMm6fzzz2/1+nXXXacZM2a0SkhqL94BAwasN96amhq99tprmj59uq655ppseVvxAwAASFI6nZb0/dO1Y8aM0auvvqq99tqrUxdM99hjD+2xxx66/vrr9dhjj+nHP/6xHn/8cZ199tk92uYfNWqUdtttNz3xxBO68MIL9eyzz+roo49uMTrTiBEj9Oqrr7ZKkpkzZ0729fU54YQTNH36dD3zzDMqLy9XfX19i+mKu9LfGDFihL788stWfaqebt93tp8zZswYGWM0atQobbnlll3ez7hx4yRJCxcu3OgkrO44b7rSv7NtWwcccIAOOOAA3XLLLfrd736nq6++WrNmzcq+r6FQSCeccIJOOOEEJZNJHXPMMbr++ut11VVXtZheoTfssMMOevPNN+U4TosbEu+//76CwWD2/Wu+ifTRRx+1SBRavny5li5d2mK6wJ7YZrOFCxdq++233/gDBwAAfUbzqKtrJzS7XC6ddNJJevjhh3XDDTfo73//u84555w+9XDu6NGjJTWN0tNb9y/GjBmTTRzqTo2NjXruuec0bNiw7AiwG6sr93fWt42N6Ve0t833339fqVSq3ZFbu9qPXde4ceM0Y8aMVjOK9KTm/ug333zTamaEb775psP+6vrMmDFDAwYM0F133dXqtWeffVbPPfec7r333vXWVVc+L529X9MVa/c9Dj300Gz5Rx99JMdxWiXNpdNpfffddzryyCM3aH8Ael/nUiwB9HnNDf61M8rr6ur00EMPdXobkydP1rJly1rMCx2Px/XAAw+0WG7nnXfWmDFjdPPNN2dvaKxt9erV2f83zxu9buJLd3K5XDr22GP1zDPPtNnoXzueKVOmaNmyZa2OSWqaqzYSiax3P1LLOjbG6Pbbb9/g2A899FCl02ndc8892bJMJqM77rhjg7fZGc2djjfeeKPFftubgiJXXC5Xq6cknnrqqVZzfLd3nnX2XHW5XJo8ebL+/ve/a8mSJdnXv/76a7388ssdxvn2229r0aJFOuOMM3Tccce1+jnhhBM0a9YsLV++fL3bmTx5svLz8/W73/1OqVRqvfFKrZ8gue222zqMFQAAbH5SqZReeeUVeb3e7EXsKVOmKJPJ6Lrrrmu1fDqdzrarampqWrU5mi8INo8yGQwGJfVcm/+EE07Qe++9pwcffFCVlZUtpmuTmtrUmUxGd955Z4vyW2+9VZZl6ZBDDlnv9sePH69tt91WTzzxhJ544gkNGjRI++67b/b1rvQ3Dj30UC1fvlxPP/10tiwajfZ4O7uz/ZxjjjlGLpdL06dPb/W+GmNUVVW13v3sueeekpouDm+s7ugrdva4q6urW72+7nm87rF7vV5tvfXWMsa0aJvPmTOnRZ+hO6xYsUJz5sxpsZ/jjjtOq1at0rPPPpstq6ys1FNPPaUjjjgim5Q3YcIEjRs3Tvfff3+LEW/vueceWZal4447rke3KTVde5g/f75+8IMfdFONAACA3jRr1qw2R6r597//Lan1VFOnnHKKampqdN5556mxsVEnn3xyr8TZWQMGDNB+++2n++67r83RIXvi/sWxxx6bnepuXV0dBahZLBbTKaecourqal199dXdljzVlfs77dnYfkVbjj32WFVWVrbq1zVvU+p8P7Y9e+65p4wx+vjjj7sc34baZZddNGDAAN17770tZmp48cUX9fXXX+uwww7boO3GYjE9++yzOvzww9u8J3HhhReqoaGhxf2+tnTl89LZ+zWStGTJkuxDQuuz//77q7i4uMU9Mqmp7xEMBlvVz+zZsxWPx+l7AJsQRkgC+omDDz5YXq9XRxxxRLYj8MADD2jAgAFtNiLact555+nOO+/UiSeeqIsvvliDBg3SjBkzsk+CNjd4bdvWn/70Jx1yyCGaMGGCzjjjDA0ZMkTLli3TrFmzlJ+fr3/84x+Smhq3knT11Vdr6tSp8ng8OuKII7IN/e7yhz/8QbNmzdLuu++uc845R1tvvbWqq6v1ySef6NVXX81egD7llFP05JNP6ic/+YlmzZqlvfbaS5lMRnPmzNGTTz6pl19+Ofvkx7rGjRunMWPG6PLLL9eyZcuUn5+vZ555ZqOG+DziiCO011576corr9SiRYu09dZb69lnn1VdXd0Gb7MzJkyYoD322ENXXXWVqqurVVxcrMcffzz75Hxfcfjhh+s3v/mNzjjjDP3gBz/QF198oRkzZmSz9puNGTNGhYWFuvfee5WXl6dQKKTdd99do0aN6vS5On36dL300kvaZ599dP755yudTuuOO+7QhAkTWsxl3ZYZM2bI5XK123k48sgjdfXVV+vxxx/XZZdd1u528vPzdc899+iUU07RTjvtpKlTp6qsrExLlizRv/71L+2111668847lZ+fr3333Vc33nijUqmUhgwZoldeeaXFPNEAAGDz9eKLL2Yv/FVUVOixxx7Tt99+qyuvvFL5+fmSpIkTJ+q8887T73//e3322Wc6+OCD5fF49O233+qpp57S7bffruOOO05/+ctfdPfdd+tHP/qRxowZo4aGBj3wwAPKz8/PPr0YCAS09dZb64knntCWW26p4uJibbPNNtpmm23WG+ebb76peDzeqny77bZrMfrOlClTdPnll+vyyy9XcXFxq6c2jzjiCE2aNElXX321Fi1apO23316vvPKKnn/+eV1yySXZZPz1OeGEE3TNNdfI7/frrLPOajVEfmf7G+ecc47uvPNOnXrqqfr44481aNAgPfLII9mkrZ7S2X7OmDFj9Nvf/lZXXXWVFi1apKOPPlp5eXlauHChnnvuOZ177rm6/PLL293P6NGjtc022+jVV1/VmWeeuVExr68N393H/Zvf/EZvvPGGDjvsMI0YMUIVFRW6++67NXToUO29996SmvrUAwcO1F577aXy8nJ9/fXXuvPOO3XYYYe1GHlr/Pjxmjhxol5//fUO47vzzjtVW1ubfTDhH//4h5YuXSpJ+ulPf5p9Kvuqq67SX/7yFy1cuFAjR46U1JQ8tMcee+iMM87Q7NmzVVpaqrvvvluZTKbVFHI33XSTjjzySB188MGaOnWqvvzyS9155506++yzWzxJ3xPblKRXX31VxhgdddRRnXjXAABAX/PTn/5U0WhUP/rRjzRu3Dglk0m98847euKJJzRy5MhWo77vuOOO2mabbfTUU09p/Pjx2mmnnXIUefvuuusu7b333tp22211zjnnaPTo0Vq1apXeffddLV26VJ9//rmkpiR1l8ulG264QXV1dfL5fNp///1bTB3VGT//+c/19NNP6/jjj9eZZ56pnXfeWdXV1XrhhRd07733djiS5LJly/Too49KahoVafbs2Xrqqae0cuVK/exnP9N55523YRXRhq7c32nPxvYr2nLqqafqr3/9qy677DJ98MEH2meffRSJRPTqq6/q/PPP11FHHdXpfmx79t57b5WUlOjVV19tNVqRJH3yySfZ92Hd421+OKOrPB6PbrjhBp1xxhmaOHGiTjzxRK1atUq33367Ro4cqUsvvXSDtvvCCy+ooaGh3ZGC9thjD5WVlWnGjBmtHupZV2c/L529XyM1vZ///e9/O0zICwQCuu6663TBBRfo+OOP1+TJk/Xmm2/q0Ucf1fXXX6/i4uIWy8+cOVPBYFAHHXTQercLoA8xADZJF1xwgVn3I/zCCy+Y7bbbzvj9fjNy5Ehzww03mAcffNBIMgsXLswuN2LECHPYYYe1ud0FCxaYww47zAQCAVNWVmZ+9rOfmWeeecZIMu+9916LZT/99FNzzDHHmJKSEuPz+cyIESPMlClTzGuvvdZiueuuu84MGTLE2LbdKpb1mTBhgpk4cWKLMknmggsuaHP5VatWmQsuuMAMGzbMeDweM3DgQHPAAQeY+++/v8VyyWTS3HDDDWbChAnG5/OZoqIis/POO5vp06eburq69cY0e/Zsc+CBB5pwOGxKS0vNOeecYz7//HMjyTz00EPZ5U477TQTCoVarT9t2rRW71tVVZU55ZRTTH5+vikoKDCnnHKK+fTTT1ttsy2zZs0yksxTTz2VLXvooYda1fPEiRNb1eX8+fPNgQceaHw+nykvLze//OUvzcyZM40kM2vWrBbrTpgwodW+2zuP1n2P2oqnvXXXjTMej5uf/exnZtCgQSYQCJi99trLvPvuu20ez/PPP2+23npr43a7W9VdZ8/V//73v2bnnXc2Xq/XjB492tx7771tvmdrSyaTpqSkxOyzzz7tLmOMMaNGjTI77rhjizr58MMP21x21qxZZvLkyaagoMD4/X4zZswYc/rpp5uPPvoou8zSpUvNj370I1NYWGgKCgrM8ccfb5YvX24kmWnTpq03FgAA0D81tzHW/vH7/WaHHXYw99xzj3Ecp9U6999/v9l5551NIBAweXl5ZttttzW/+MUvzPLly40xxnzyySfmxBNPNMOHDzc+n88MGDDAHH744S3aJcYY884772TbUR21R5rbsO39tLXuXnvtZSSZs88+u81tNjQ0mEsvvdQMHjzYeDweM3bsWHPTTTe1OuYRI0aY0047rdX63377bXb/b731Vpv76Gx/Y/HixebII480wWDQlJaWmosvvti89NJLrdrZHWmrz9de29yYrvVznnnmGbP33nubUChkQqGQGTdunLngggvMN99802Fct9xyiwmHwyYajbYoX19frTn2zrbh2zvO0047zYwYMaLLx/3aa6+Zo446ygwePNh4vV4zePBgc+KJJ5q5c+dmt3PfffeZfffdN9tnGDNmjPn5z3/equ4ktTqO9owYMaLd83zt/tFpp53WZl+5urranHXWWaakpMQEg0EzceLEdvsQzz33nNlhhx2Mz+czQ4cONb/61a9MMplstVxPbPOEE04we++9d6fqBAAA9D0vvviiOfPMM824ceNMOBw2Xq/XbLHFFuanP/2pWbVqVZvr3HjjjUaS+d3vftfqtYULFxpJ5qabbmpR3ta1bGPavlba2WvP69vf/PnzzamnnmoGDhxoPB6PGTJkiDn88MPN008/3WK5Bx54wIwePdq4XK4Wbfb13Udpq19RVVVlLrzwQjNkyBDj9XrN0KFDzWmnnWYqKyvb3Mba22puI1qWZfLz882ECRPMOeecY95///0211m339SVum3WmWvmzdfGV69e3WYcnelXdKVtH41GzdVXX21GjRqV7XMdd9xxZv78+S2W66gfuz4XXXSR2WKLLVqUNZ9D7f2s/V63d1609x40e+KJJ8yOO+5ofD6fKS4uNj/+8Y/N0qVLW9VJW/eV2nLEEUcYv99vIpFIu8ucfvrpxuPxmMrKynY/J80683npyv2aiRMnrve+yrruv/9+s9VWWxmv12vGjBljbr311javYey+++7m5JNP7vR2AeSeZcwGjhUIYLNx22236dJLL9XSpUs1ZMiQXIcDAAAAAMiRuro6jR49WjfeeKPOOuusXIeDHFu5cqVGjRqlxx9/nBGSAADYjNx+++269NJLtWjRIg0fPjzX4QCdtmDBAo0bN04vvviiDjjggFyHgy747LPPtNNOO+mTTz7JTsENoO8jIQlAC7FYTIFAIPt7PB7XjjvuqEwmo7lz5+YwMgAAAABAX3DDDTfooYce0uzZs1tNb4fNy5VXXqn//Oc/+uCDD3IdCgAA6CXGGG2//fYqKSnRrFmzch0O0GX/93//p3nz5mnmzJm5DgVdMHXqVDmOoyeffDLXoQDoAhKSALRwyCGHaPjw4dphhx1UV1enRx99VF999ZVm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W6BWTGYO0dvby5wDB6jEfPTqq69WZ2cnjayz2GTG0e9//3t9//vf15133jkVIWIamMw4evnll/XTn/5Utm3r/vvv13XXXaevfvWr+vKXvzwVIaNGTWYsfehDH9IXv/hFnXbaaQoEAlq4cKHe8Y53sGUbJuRQ8+3R0VFls9lxP4/nDUnXXHONDMM47Nff//73fY//7Gc/q2eeeUYPPvigfD6fLrjgAo2tKjVzTTRHkrR9+3a9973v1Qc/+EF97GMf8yjyqTOZHAGojjVr1ugvf/mLNm3a5HUoNWfJkiV69tln9cQTT+gTn/iEVq9erb/97W9eh1UzXnvtNV122WX68Y9/rFAo5HU4Net973ufPvjBD+q4447TWWedpfvvv1/Dw8O65557vA4N8By1xfhQX5RHfQHUDuqLQ6O+ODzqi/KoLQBgfxs2bNCmTZt077338t6BcUsmkzr//PN15513qrm52etwMI05jqPW1lZ997vf1UknnaRzzz1Xn//85/Xtb3/b69AwzTzyyCP6yle+om9961t6+umn9bOf/Uy//OUv9aUvfcnr0DAL+b0O4Morr9SFF1542McsWLBg3/83NzerublZixcv1rJly9Td3a3HH398Ri9JPdEc7dixQ2eccYZOOeUUffe7361ydLVhojnCmObmZvl8Pu3atWu/47t27VJ7e7tHUWE6u/TSS/WLX/xCv/vd7zRnzhyvw6k5lmVp0aJFkqSTTjpJTz75pL7+9a/rO9/5jseR1YannnpKu3fv1oknnrjvmG3b+t3vfqfbb79d+XxePp/PwwhrU319vRYvXqwXX3zR61AAz1FbjA/1RXnUF5NDfYFKo744POqLw6O+mDhqC3hlMnOI9vZ25hw4wJHMR2+99VZt2LBBv/nNb3TcccdVM0zUuImOo5deeklbt27VOeecs++Y4ziSJL/fr+eff14LFy6sbtCoOZN5Pero6FAgENhvjrps2TL19vaqUCjIsqyqxozaNJmxdN111+n888/XRz/6UUnSscceq3Q6rf/8z//U5z//eZmm52vWYBo41Hw7kUgoHA6P+3k8b0hqaWlRS0vLpH527xt6Pp+vZEg1ZyI52r59u8444wyddNJJuuuuu2bNC8qRjKPZzLIsnXTSSdq8ebNWrVolaezf1ebNm3XppZd6GxymFdd19alPfUr33nuvHnnkEc2fP9/rkKYFx3Fm/HvYRLzrXe/Sn//85/2OXXTRRVq6dKmuvvpqbhYcQiqV0ksvvaTzzz/f61AAz1FbjA/1RXnUF5NDfYFKob6YHOqL/VFfTBy1BbwymTnEypUrtXnzZl1++eX7jj300EMz/sMFOLzJzkdvueUW3XTTTXrggQe0fPnyKYoWtWqi42jp0qUHzDm+8IUvKJlM6utf/7q6u7unImzUmMm8Hp166qnauHGjHMfZd/3lH//4hzo6OmhGmsUmM5YymcwB1/D21j+zYXV4VMbKlSt1//3373dsMvNtzxuSxuuJJ57Qk08+qdNOO00NDQ166aWXdN1112nhwoUUGXts375d73jHOzRv3jzdeuut6uvr2/d7fDLkDdu2bdPg4KC2bdsm27b17LPPSpIWLVqkWCzmbXAeWLt2rVavXq3ly5fr5JNP1m233aZ0Oq2LLrrI69BqRiqV2u/Tga+88oqeffZZNTY2au7cuR5GVjvWrFmjjRs36uc//7ni8fi+fWvr6uom1CU7k1177bV63/vep7lz5yqZTGrjxo165JFH9MADD3gdWs2Ix+M65phj9jsWjUbV1NR0wPHZ7DOf+YzOOecczZs3Tzt27NC6devk8/l03nnneR0aMG1QW4wP9cX4UF/sj/qiPOqL8qgvyqO+KI/6ojxqC9SScnOICy64QF1dXVq/fr0k6bLLLtPpp5+ur371qzr77LO1adMm/fGPf5w1K3ri0CY6lm6++WZdf/312rhxo3p6evbNO2Kx2Kycz2PMRMZRKBQ6YG5RX18vScw5ZrmJvh594hOf0O23367LLrtMn/rUp/TCCy/oK1/5ij796U97+cdADZjoWDrnnHP0ta99Tf/yL/+iFStW6MUXX9R1112nc845hw9mzGLlrkdde+212r59u/7nf/5HknTJJZfo9ttv11VXXaWPfOQj+u1vf6t77rlHv/zlLyd2Ynea+NOf/uSeccYZbmNjoxsMBt2enh73kksucV9//XWvQ6sZd911lyvpoF94w+rVqw+ao4cfftjr0DzzjW98w507d65rWZZ78sknu48//rjXIdWUhx9++KBjZvXq1V6HVjMO9dpz1113eR1azfjIRz7izps3z7Usy21paXHf9a53uQ8++KDXYdW8008/3b3sssu8DqOmnHvuuW5HR4drWZbb1dXlnnvuue6LL77odVjAtEJtMT7UF+NDfXEg6ovDo74oj/qiPOqLyaG+2B+1BWrN4eYQp59++gHvlffcc4+7ePFi17Is9+ijj3Z/+ctfTnHEqFUTGUvz5s076Lxj3bp1Ux84aspEX5PebPXq1e773//+6geJmjfRcfTYY4+5K1ascIPBoLtgwQL3pptuckul0hRHjVo0kbFULBbdG264wV24cKEbCoXc7u5u95Of/KQ7NDQ09YGjZpS7HrV69Wr39NNPP+BnTjjhBNeyLHfBggWTui5juC7rcgEAAAAAAAAAAAAAAACoDLP8QwAAAAAAAAAAAAAAAABgfGhIAgAAAAAAAAAAAAAAAFAxNCQBAAAAAAAAAAAAAAAAqBgakgAAAAAAAAAAAAAAAABUDA1JAAAAAAAAAAAAAAAAACqGhiQAAAAAAAAAAAAAAAAAFUNDEgAAAAAAAAAAAAAAAICKoSEJAAAAAAAAAAAAAAAAQMXQkAQAAAAAAAAAAAAAAACgYmhIAgAAAAAAAAAAAAAAAFAxNCQBAAAAAAAAAAAAAAAAqBgakgAAAAAAAAAAAAAAAABUzP8PL37rWmFGLF4AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 2400x800 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA18AAAIjCAYAAAD80aFnAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAaiZJREFUeJzt3XlcVXXi//H3ZQcRSUUQRVFMzVIsHIncc2GkcXLLdXLJNEsqZVo095qimgl1HJeaSvtpTpaRTW4jklqOW+MyVqa5lYqCS6OoCCKc3x98780boEjcew/X1/Px4AH3cz73nM/hfriet5/P+VyLYRiGAAAAAAAO5eHqBgAAAADArYDwBQAAAABOQPgCAAAAACcgfAEAAACAExC+AAAAAMAJCF8AAAAA4ASELwAAAABwAsIXAAAAADgB4QsAAAAAnIDwBQAVzGKxaNq0aa5uBpzohx9+kMVi0cKFC13dFFRCvGcAtw7CFwBTWLhwoSwWi91XrVq11KlTJ61evdphx83JydG0adO0YcOGMtXfsGFDsXZavwYMGFDiczZv3qxp06bp3LlzFddwF/jla+Tn56fGjRsrMTFRWVlZrm7eLW/FihX67W9/qxo1athem2eeeUZnz551ddNKdeTIESUmJqpx48YKCAhQQECAmjVrpjFjxmjPnj2ubl6FWrVqFQELgLxc3QAAuNaLL76oBg0ayDAMZWVlaeHChUpISNBnn32m3/3udxV+vJycHE2fPl2S1LFjxzI/76mnntJvfvMbu7LIyEhJ0uXLl+Xl9fPb6+bNmzV9+nQNGzZMwcHBv7bJLmd9jXJzc7Vp0ybNmzdPq1at0jfffKOAgABXN88l6tevr8uXL8vb29slx3/mmWf0xhtvKDo6Ws8//7yqV6+unTt36m9/+5s++OADpaenq0mTJi5pW2lWrFih/v37y8vLS4MHD1Z0dLQ8PDy0b98+paamat68eTpy5Ijq16/v6qZWiFWrVmnOnDklBrBfvmcAcF/8pQMwle7du6tVq1a2xyNGjFBoaKj+8Y9/OCR8lVe7du3Ut2/fErf5+fk5uTXOde1r9Oijj6pGjRpKSUnRp59+qoEDB5b4nEuXLqlKlSpOaZ8zj2VlHQl0hX/84x9644031L9/f73//vvy9PS0bRs2bJg6deqkhx56SDt37nTqBf71XodDhw5pwIABql+/vtLT01W7dm277a+99prmzp0rDw/zTtCpyH7m7u8ZAH5m3nc1AJAUHBwsf3//YheNhYWFmjlzpu688075+fkpNDRUjz32mP73v//Z1fvPf/6j+Ph41axZU/7+/mrQoIEeeeQRSUX36YSEhEiSpk+fbptO92unBl27j2nTpunZZ5+VJDVo0MB2jB9++MFWNzExUcuXL9ddd90lX19f3XnnnVqzZk2x/WZkZOiRRx5RaGiord67775brN7s2bN15513KiAgQLfddptatWqlJUuW2LZfuHBBY8eOVWRkpHx9fVWrVi117dpVO3fuLNf53n///ZKKppBJRRf8gYGBOnTokBISElS1alUNHjxYUtEF6x//+EdFRETI19dXTZo00V/+8hcZhmG3z8uXL+upp55SzZo1VbVqVf3+979XRkZGsddn2rRpslgs2rt3rwYNGqTbbrtNbdu2tW1fvHixYmJi5O/vr+rVq2vAgAE6duyY3bEOHDigPn36KCwsTH5+fqpbt64GDBig8+fP2+qkpaWpbdu2Cg4OVmBgoJo0aaIXXnjBtr20e74+//xztWvXTlWqVFFwcLAefPBBfffdd3Z1rOdw8OBB2+hotWrVNHz4cOXk5Nzw9z99+nTddttteuutt+yClyS1bt1azz//vL7++mstW7ZMkpSYmKjAwMAS9z1w4ECFhYWpoKDAVrZ69WrbOVStWlUPPPCAvv32W7vnXe81L8nrr7+uS5cuacGCBcWClyR5eXnpqaeeUkREhF35vn371LdvX1WvXl1+fn5q1aqV/vnPf9rVsU6P/fe//62kpCSFhISoSpUq6tWrl06fPl3sWL/2/L788ks99NBDqlevnnx9fRUREaFx48bp8uXLds+fM2eOJNlN3bUq6X1n165d6t69u4KCghQYGKjOnTtr69at5T7X670XAnAeRr4AmMr58+d15swZGYahU6dOafbs2bp48aL+8Ic/2NV77LHHtHDhQg0fPlxPPfWUjhw5or/97W/atWuX/v3vf8vb21unTp1St27dFBISovHjxys4OFg//PCDUlNTJUkhISGaN2+eHn/8cfXq1Uu9e/eWJLVo0eKG7bxw4YLOnDljV1a9evVi/1Pfu3dvff/99/rHP/6hGTNmqGbNmrZjW23atEmpqal64oknVLVqVf31r39Vnz59dPToUdWoUUOSlJWVpXvvvdcW1kJCQrR69WqNGDFC2dnZGjt2rCTp73//u5566in17dtXTz/9tHJzc7Vnzx5t27ZNgwYNkiSNHj1ay5YtU2Jiopo1a6azZ89q06ZN+u6773TPPfeU9aWyOXTokCTZ2ipJV69eVXx8vNq2bau//OUvCggIkGEY+v3vf6/169drxIgRatmypf71r3/p2WefVUZGhmbMmGF7/rBhw/Thhx/q4Ycf1r333quNGzfqgQceKLUNDz30kG6//Xa98sortiD38ssva/LkyerXr58effRRnT59WrNnz1b79u21a9cuBQcH68qVK4qPj1deXp6efPJJhYWFKSMjQytWrNC5c+dUrVo1ffvtt/rd736nFi1a6MUXX5Svr68OHjyof//739f9vaxbt07du3dXw4YNNW3aNF2+fFmzZ89WmzZttHPnTts0Vat+/fqpQYMGSk5O1s6dO/X222+rVq1aeu2110o9xoEDB7R//34NGzZMQUFBJdYZMmSIpk6dqhUrVmjAgAHq37+/5syZo5UrV+qhhx6y1cvJydFnn32mYcOG2ULcokWLNHToUMXHx+u1115TTk6O5s2bp7Zt22rXrl1251DSa16aFStWqFGjRoqNjb3u7/Ba3377rdq0aaM6depo/PjxqlKlij788EP17NlTH3/8sXr16mVX/8knn9Rtt92mqVOn6ocfftDMmTOVmJiopUuX2upUxPl99NFHysnJ0eOPP64aNWpo+/btmj17to4fP66PPvpIUtH71YkTJ5SWlqZFixaV6VzbtWunoKAgPffcc/L29tabb76pjh07auPGjcV+bzc61xu9FwJwIgMATGDBggWGpGJfvr6+xsKFC+3qfvnll4Yk4/3337crX7NmjV35J598Ykgyvvrqq1KPe/r0aUOSMXXq1DK1c/369SW2U5Jx5MgRwzCMYvv785//bLf9WpIMHx8f4+DBg7ay//73v4YkY/bs2bayESNGGLVr1zbOnDlj9/wBAwYY1apVM3JycgzDMIwHH3zQuPPOO697DtWqVTPGjBlTpvO9lvU1WrdunXH69Gnj2LFjxgcffGDUqFHD8Pf3N44fP24YhmEMHTrUkGSMHz/e7vnLly83JBl/+tOf7Mr79u1rWCwW2+9gx44dhiRj7NixdvWGDRtW7Hc7depUQ5IxcOBAu7o//PCD4enpabz88st25V9//bXh5eVlK9+1a5chyfjoo49KPe8ZM2YYkozTp0+XWufIkSOGJGPBggW2spYtWxq1atUyzp49ayv773//a3h4eBhDhgwpdg6PPPKI3T579epl1KhRo9RjGsbPv9MZM2Zct15QUJBxzz33GIZhGIWFhUadOnWMPn362NX58MMPDUnGF198YRiGYVy4cMEIDg42Ro4caVcvMzPTqFatml15aa95Sc6fP29IMnr27Fls2//+9z/j9OnTti9rvzYMw+jcubPRvHlzIzc311ZWWFho3Hfffcbtt99uK7P20y5duhiFhYW28nHjxhmenp7GuXPnKvT8rm2jVXJysmGxWIwff/zRVjZmzBijtMuuX/brnj17Gj4+PsahQ4dsZSdOnDCqVq1qtG/f/qbPtSzvhQCcg2mHAExlzpw5SktLU1pamhYvXqxOnTrp0Ucftfsf2o8++kjVqlVT165ddebMGdtXTEyMAgMDtX79ekmyLW6xYsUK5efnV2g7p0yZYmun9SssLKxc++rSpYuioqJsj1u0aKGgoCAdPnxYkmQYhj7++GP16NFDhmHYnXN8fLzOnz9vmzIYHBys48eP66uvvir1eMHBwdq2bZtOnDhR7vaGhIQoIiJCAwYMUGBgoD755BPVqVPHrt7jjz9u93jVqlXy9PTUU089ZVf+xz/+UYZh2Fa1tE65fOKJJ+zqPfnkk6W2afTo0XaPU1NTVVhYqH79+tn9vsLCwnT77bfb+ki1atUkSf/6179KneJn7UeffvqpCgsLS23DtU6ePKndu3dr2LBhql69uq28RYsW6tq1q1atWnXDc2jXrp3Onj2r7OzsUo9z4cIFSVLVqlWv256qVava9mOxWPTQQw9p1apVunjxoq3O0qVLVadOHdu0zbS0NJ07d04DBw60+x16enoqNjbW9ju81i9f85JY2xEYGFhsW8eOHRUSEmL7sk7V++mnn/T555+rX79+tlHnM2fO6OzZs4qPj9eBAweUkZFht69Ro0bZTe1r166dCgoK9OOPP1bo+fn7+9t+vnTpks6cOaP77rtPhmFo165dN/x9/FJBQYHWrl2rnj17qmHDhrby2rVra9CgQdq0aVOxPnGjc3XkeyGAm8O0QwCm0rp1a7sFNwYOHKi7775biYmJ+t3vficfHx8dOHBA58+fV61atUrcx6lTpyRJHTp0UJ8+fTR9+nTNmDFDHTt2VM+ePTVo0CD5+vr+qnY2b95cXbp0+VX7sKpXr16xsttuu812/9rp06d17tw5vfXWW3rrrbdK3If1nJ9//nmtW7dOrVu3VqNGjdStWzcNGjRIbdq0sdV9/fXXNXToUEVERCgmJkYJCQkaMmSI3YXe9cyZM0eNGzeWl5eXQkND1aRJk2LTLb28vFS3bl27sh9//FHh4eHFgsIdd9xh22797uHhoQYNGtjVa9SoUalt+mXdAwcOyDAM3X777SXWt65K2KBBAyUlJSklJUXvv/++2rVrp9///vf6wx/+YAtm/fv319tvv61HH31U48ePV+fOndW7d2/17du31AUhrOdS0gqDd9xxh/71r38VW7Dhl/3gtttukyT973//K3VKofV3aQ1hpblw4YLd30v//v01c+ZM/fOf/9SgQYN08eJFrVq1So899pjtIv7AgQOSfr6n75d+2aaSXvPrtfna4Gf15ptv6sKFC8rKyrKbanzw4EEZhqHJkydr8uTJJe731KlTdv8BcL3fp1Rx53f06FFNmTJF//znP4vdc3rtfYNldfr0aeXk5JTadwoLC3Xs2DHdeeedtvIbnasj3wsB3BzCFwBT8/DwUKdOnTRr1iwdOHBAd955pwoLC1WrVi29//77JT7Hej+VxWLRsmXLtHXrVn322Wf617/+pUceeURvvPGGtm7dWuL/vLvCLxdJsDL+794l62jLH/7wBw0dOrTEutb71O644w7t379fK1as0Jo1a/Txxx9r7ty5mjJlim1J/X79+qldu3b65JNPtHbtWv35z3/Wa6+9ptTUVHXv3v2G7f1lQC6Jr6+vU1equ3b0QSr6nVksFq1evbrE3++1r/0bb7yhYcOG6dNPP9XatWv11FNPKTk5WVu3blXdunXl7++vL774QuvXr9fKlSu1Zs0aLV26VPfff7/Wrl1b6ut3s27UD0piDa7X+0ysH3/8UdnZ2WrWrJmt7N5771VkZKQ+/PBDDRo0SJ999pkuX76s/v372+pY+92iRYtKHNX95SI4ZX3Nq1Wrptq1a+ubb74pts16L5N1QZpftuWZZ55RfHx8ifv9ZTgv69/Vrzm/goICde3aVT/99JOef/55NW3aVFWqVFFGRoaGDRtW5pHSX+tG51pZ3guBWwHhC4DpXb16VdLP/1MeFRWldevWqU2bNsUuukty77336t5779XLL7+sJUuWaPDgwfrggw/06KOP2k3VcZRfe4yQkBBVrVpVBQUFZRptq1Klivr376/+/fvrypUr6t27t15++WVNmDDBtqR17dq19cQTT+iJJ57QqVOndM899+jll18uU/gqr/r162vdunW6cOGC3ejXvn37bNut3wsLC3XkyBG7kauDBw+W+VhRUVEyDEMNGjRQ48aNb1i/efPmat68uSZNmqTNmzerTZs2mj9/vv70pz9JKvpPgM6dO6tz585KSUnRK6+8ookTJ2r9+vUlvibWc9m/f3+xbfv27VPNmjUrZJnyxo0bq3Hjxlq+fLlmzZpV4vTD//f//p8kFfuohn79+mnWrFnKzs7W0qVLFRkZqXvvvde23ToVtlatWhU2ymv1wAMP6O2339b27dvVunXrG9a3jsp6e3tXWFsq4vy+/vprff/993rvvfc0ZMgQW3laWlqxumV9HwgJCVFAQECpfcfDw6PYKpBldb33QgDOwT1fAEwtPz9fa9eulY+Pj+1/+fv166eCggK99NJLxepfvXpV586dk1Q05eaXowYtW7aUJOXl5UmSbcUy63McwXqRXd5jeHp6qk+fPvr4449LHC24dknps2fP2m3z8fFRs2bNZBiG8vPzVVBQUGwqVK1atRQeHm77nThKQkKCCgoK9Le//c2ufMaMGbJYLLbgZx3ZmDt3rl292bNnl/lYvXv3lqenp6ZPn16sDxiGYfs9ZWdn28K9VfPmzeXh4WH7ffz000/F9v/LfvRLtWvXVsuWLfXee+/Zve7ffPON1q5dq4SEhDKfy41MmTJF//vf/zR69Gi7JeIlaceOHXrttdd01113qU+fPnbb+vfvr7y8PL333ntas2aN+vXrZ7c9Pj5eQUFBeuWVV0q8T6ikZdvL6rnnnlNAQIAeeeQRZWVlFdv+y9esVq1a6tixo958802dPHmyQtpSEednHXG6tr2GYWjWrFnF6pb1fcDT01PdunXTp59+ajcCmJWVpSVLlqht27alTkMtTVneCwE4ByNfAExl9erVtpGQU6dOacmSJTpw4IDGjx9vu+Do0KGDHnvsMSUnJ2v37t3q1q2bvL29deDAAX300UeaNWuW+vbtq/fee09z585Vr169FBUVpQsXLujvf/+7goKCbBe//v7+atasmZYuXarGjRurevXquuuuu3TXXXdV2DnFxMRIkiZOnKgB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l/Hjjz8ahmEYr776qhEcHGx8+umnxp49e4wHH3zQaNCggXH58mXbPn77298ad999t7Ft2zZj06ZNxu23324MHDjQVacEk3n88ceNatWqGRs2bDBOnjxp+8rJybHVGT16tFGvXj3j888/N/7zn/8YcXFxRlxcnG371atXjbvuusvo1q2bsXv3bmPNmjVGSEiIMWHCBFecEkxk/PjxxsaNG40jR44Ye/bsMcaPH29YLBZj7dq1hmHQt+AY1652aBj0M9w8wpcbmD17tlGvXj3Dx8fHaN26tbF161ZXNwmVwPr16w1Jxb6GDh1qGEbRcvOTJ082QkNDDV9fX6Nz587G/v377fZx9uxZY+DAgUZgYKARFBRkDB8+3Lhw4YILzgZmVFL/kmQsWLDAVufy5cvGE088Ydx2221GQECA0atXL+PkyZN2+/nhhx+M7t27G/7+/kbNmjWNP/7xj0Z+fr6TzwZm88gjjxj169c3fHx8jJCQEKNz58624GUY9C04xi/DF/0MN8tiGIbhmjE3AAAAALh1cM8XAAAAADgB4QsAAAAAnIDwBQAAAABOQPgCAAAAACcgfAEAAACAExC+AAAAAMAJCF8AAAAA4ASELwAAAABwAsIXAAAmsHDhQgUHB7u6GQAAByJ8AQAqlczMTD399NNq1KiR/Pz8FBoaqjZt2mjevHnKyclxdfPKJDIyUjNnzrQr69+/v77//nvXNAgA4BRerm4AAABldfjwYbVp00bBwcF65ZVX1Lx5c/n6+urrr7/WW2+9pTp16uj3v/+9S9pmGIYKCgrk5VW+f1r9/f3l7+9fwa0CAJgJI18AgErjiSeekJeXl/7zn/+oX79+uuOOO9SwYUM9+OCDWrlypXr06CFJOnfunB599FGFhIQoKChI999/v/773//a9jNt2jS1bNlSixYtUmRkpKpVq6YBAwbowoULtjqFhYVKTk5WgwYN5O/vr+joaC1btsy2fcOGDbJYLFq9erViYmLk6+urTZs26dChQ3rwwQcVGhqqwMBA/eY3v9G6detsz+vYsaN+/PFHjRs3ThaLRRaLRVLJ0w7nzZunqKgo+fj4qEmTJlq0aJHddovForffflu9evVSQECAbr/9dv3zn/+ssN83AKBiEb4AAJXC2bNntXbtWo0ZM0ZVqlQpsY41yDz00EM6deqUVq9erR07duiee+5R586d9dNPP9nqHjp0SMuXL9eKFSu0YsUKbdy4Ua+++qpte3Jysv7f//t/mj9/vr799luNGzdOf/jDH7Rx40a7Y44fP16vvvqqvvvuO7Vo0UIXL15UQkKC0tPTtWvXLv32t79Vjx49dPToUUlSamqq6tatqxdffFEnT57UyZMnSzyXTz75RE8//bT++Mc/6ptvvtFjjz2m4cOHa/369Xb1pk+frn79+mnPnj1KSEjQ4MGD7c4TAGAiBgAAlcDWrVsNSUZqaqpdeY0aNYwqVaoYVapUMZ577jnjyy+/NIKCgozc3Fy7elFRUcabb75pGIZhTJ061QgICDCys7Nt25999lkjNjbWMAzDyM3NNQICAozNmzfb7WPEiBHGwIEDDcMwjPXr1xuSjOXLl9+w7Xfeeacxe/Zs2+P69esbM2bMsKuzYMECo1q1arbH9913nzFy5Ei7Og899JCRkJBgeyzJmDRpku3xxYsXDUnG6tWrb9gmAIDzcc8XAKBS2759uwoLCzV48GDl5eXpv//9ry5evKgaNWrY1bt8+bIOHTpkexwZGamqVavaHteuXVunTp2SJB08eFA5OTnq2rWr3T6uXLmiu+++266sVatWdo8vXryoadOmaeXKlTp58qSuXr2qy5cv20a+yuq7777TqFGj7MratGmjWbNm2ZW1aNHC9nOVKlUUFBRkOw8AgLkQvgAAlUKjRo1ksVi0f/9+u/KGDRtKkm2xiosXL6p27drasGFDsX1ce0+Vt7e33TaLxaLCwkLbPiRp5cqVqlOnjl09X19fu8e/nAL5zDPPKC0tTX/5y1/UqFEj+fv7q2/fvrpy5UoZz/TmXO88AADmQvgCAFQKNWrUUNeuXfW3v/1NTz75ZKn3fd1zzz3KzMyUl5eXIiMjy3WsZs2aydfXV0ePHlWHDh1u6rn//ve/NWzYMPXq1UtSUZD74Ycf7Or4+PiooKDguvu544479O9//1tDhw6123ezZs1uqj0AAPMgfAEAKo25c+eqTZs2atWqlaZNm6YWLVrIw8NDX331lfbt26eYmBh16dJFcXFx6tmzp15//XU1btxYJ06c0MqVK9WrV69i0wRLUrVqVT3zzDMaN26cCgsL1bZtW50/f17//ve/FRQUZBeIfun2229XamqqevToIYvFosmTJxcbiYqMjNQXX3yhAQMGyNfXVzVr1iy2n2effVb9+vXT3XffrS5duuizzz5Tamqq3cqJAIDKhfAFAKg0oqKitGvXLr3yyiuaMGGCjh8/Ll9fXzVr1kzPPPOMnnjiCVksFq1atUoTJ07U8OHDdfr0aYWFhal9+/YKDQ0t87FeeuklhYSEKDk5WYcPH1ZwcLDuuecevfDCC9d9XkpKih555BHdd999qlmzpp5//nllZ2fb1XnxxRf12GOPKSoqSnl5eTIMo9h+evbsqVmzZukvf/mLnn76aTVo0EALFixQx44dy3wOAABzsRglveMDAAAAACoUn/MFAAAAAE5A+AIAAAAAJyB8AQAAAIATEL4AAAAAwAkIXwAAAADgBIQvAAAAAHACwhcAAAAAOAHhCwAAAACcgPAFAAAAAE5A+AIAAAAAJyB8AQAAAIAT/H8n9JWKXvSYdwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Program evolution_of_morphological_trees_4.py\n",
    "# Morphological trees considered here are like lighting trees:\n",
    "# The electrical network has the structure of a tree and has a lamp at each node.\n",
    "# The lamp illuminates a region that represents\n",
    "# the region of influence of a center of production of messengers.\n",
    "# Each lamp has a given power and a circle of illumination,\n",
    "# whose radius is determined by a threshold intensity.\n",
    "# In morphology, this corresponds with a threshold concentration of a messenger.\n",
    "# Evolution is given the task of illuminating\n",
    "# the area determined by a random tree.\n",
    "# By Gemini 2.5 Flash with a minor help from the Author.\n",
    "\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "import copy  # For deep copying trees during reproduction and mutation\n",
    "import sys  # Import sys module to adjust recursion limit\n",
    "import math  # For math.floor, math.ceil, math.sqrt\n",
    "\n",
    "sys.setrecursionlimit(3000)  # Increase the recursion limit for potentially deep trees\n",
    "\n",
    "\n",
    "# --- SPATIAL TREE NODE FOR DIFFUSION ---\n",
    "\n",
    "class SpatialTreeNode_Evolution_Diffusion4:\n",
    "    def __init__(self, value, x, y, radius, occupied_squares_set, diffusion_nodes_info):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "\n",
    "        self.radius = radius\n",
    "        self.occupied_squares_set = occupied_squares_set  # Reference to the set of squares occupied by *this* tree's nodes\n",
    "        self.diffusion_nodes_info = diffusion_nodes_info  # Reference to the list of (x,y,radius) for *all* nodes in *this* tree\n",
    "\n",
    "        self.occupied_squares_set.add((x, y))  # Add current node's (x,y) square to the set\n",
    "        self.diffusion_nodes_info.append((x, y, radius))  # Add current node's (x,y,radius) to the list\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode_Evolution_Diffusion4):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode_Evolution_Diffusion3\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue  # Exclude the current square itself\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def _is_diffusion_overlapping_local(self, potential_nx, potential_ny, potential_radius, overlap_factor):\n",
    "        \"\"\"\n",
    "        Checks if a potential new node's diffusion circle overlaps \"too much\" with EXISTING nodes IN THE SAME TREE.\n",
    "        \"Too much overlap\" is defined by the overlap_factor.\n",
    "        \"\"\"\n",
    "        potential_center_x, potential_center_y = potential_nx + 0.5, potential_ny + 0.5\n",
    "\n",
    "        for ex, ey, er in self.diffusion_nodes_info:\n",
    "            # Skip checking against self if self is already in diffusion_nodes_info\n",
    "            if (ex, ey) == (self.x, self.y):\n",
    "                continue\n",
    "\n",
    "            existing_center_x, existing_center_y = ex + 0.5, ey + 0.5\n",
    "\n",
    "            # Calculate distance between centers\n",
    "            distance = np.sqrt((potential_center_x - existing_center_x) ** 2 + (potential_ny - existing_center_y) ** 2)\n",
    "\n",
    "            # Check for significant overlap\n",
    "            # If distance is less than a fraction of the sum of radii, it's too much overlap.\n",
    "            if distance < overlap_factor * (potential_radius + er):\n",
    "                return True  # Significant overlap detected\n",
    "        return False\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix, max_node_radius, overlap_factor):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "\n",
    "        # First, filter for unoccupied grid squares *within this tree*\n",
    "        available_square_neighbors = [coord for coord in coordinates_neighbors if\n",
    "                                      coord not in self.occupied_squares_set]\n",
    "\n",
    "        valid_child_candidates = []  # Store (nx, ny, child_radius) for candidates that pass overlap check\n",
    "\n",
    "        for nx, ny in available_square_neighbors:\n",
    "            # Generate potential radius for this child, ensuring it's not too large or small\n",
    "            child_radius = random.uniform(0.5, max_node_radius)\n",
    "            if not self._is_diffusion_overlapping_local(nx, ny, child_radius, overlap_factor):\n",
    "                valid_child_candidates.append((nx, ny, child_radius))\n",
    "\n",
    "        if not valid_child_candidates:\n",
    "            return None  # No available neighbors that satisfy both square and diffusion overlap conditions\n",
    "\n",
    "        # Choose a random valid candidate\n",
    "        chosen_nx, chosen_ny, chosen_child_radius = random.choice(valid_child_candidates)\n",
    "\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        # Create child node; its __init__ will update occupied_squares_set and diffusion_nodes_info\n",
    "        child_node = SpatialTreeNode_Evolution_Diffusion4(child_value, chosen_nx, chosen_ny, chosen_child_radius,\n",
    "                                                          self.occupied_squares_set, self.diffusion_nodes_info)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def get_all_nodes(self):\n",
    "        all_nodes = []\n",
    "        stack = [self]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            all_nodes.append(node)\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "        return all_nodes\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode_Evolution_Diffusion(value={self.value}, x={self.x}, y={self.y}, R={self.radius:.2f}, children={[child.value for child in self.children]!r})\"\n",
    "\n",
    "\n",
    "# --- TREE GENERATION ---\n",
    "\n",
    "def generate_random_spatial_tree_diffusion4(\n",
    "        max_depth, max_children, max_node_radius, initial_x, initial_y, node_prefix=\"Node\",\n",
    "        current_depth=0, parent_node=None, occupied_squares_set=None, diffusion_nodes_info=None, overlap_factor=0.7\n",
    "):\n",
    "    if occupied_squares_set is None:\n",
    "        occupied_squares_set = set()  # Initialize a new set for this tree's square coordinates\n",
    "    if diffusion_nodes_info is None:\n",
    "        diffusion_nodes_info = []  # Initialize a new list for this tree's node (x,y,radius) information\n",
    "\n",
    "    if parent_node is None:\n",
    "        # Root node at (initial_x, initial_y) with a random initial radius\n",
    "        node_value = f\"{node_prefix}_Root_{random.randint(0, 99)}\"\n",
    "        initial_radius = random.uniform(0.5, max_node_radius)\n",
    "        current_node = SpatialTreeNode_Evolution_Diffusion4(node_value, initial_x, initial_y, initial_radius,\n",
    "                                                            occupied_squares_set, diffusion_nodes_info)\n",
    "    else:\n",
    "        # Children are added by the parent's method, which handles their coordinates and radius\n",
    "        current_node = parent_node.add_child_in_random_neighbor(f\"{node_prefix}_{current_depth}\", max_node_radius,\n",
    "                                                                overlap_factor)\n",
    "        if current_node is None:\n",
    "            return None  # Branch terminated if no available neighbor\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        num_children = random.randint(0, max_children)  # Random number of children for this node\n",
    "        for _ in range(num_children):\n",
    "            generate_random_spatial_tree_diffusion4(\n",
    "                max_depth, max_children, max_node_radius, initial_x, initial_y, node_prefix,\n",
    "                current_depth + 1, current_node, occupied_squares_set, diffusion_nodes_info, overlap_factor\n",
    "            )\n",
    "    return current_node\n",
    "\n",
    "\n",
    "# --- ILLUMINATION AND FITNESS FUNCTIONS ---\n",
    "\n",
    "def get_illuminated_area4(tree):\n",
    "    \"\"\"\n",
    "    Calculates the set of (x,y) integer coordinates illuminated by the tree using the\n",
    "    algebraic approach described in the text, based on intersections with horizontal\n",
    "    and vertical grid lines.\n",
    "    \"\"\"\n",
    "    # Print the nodes of  tree\n",
    "    all_nodes_i = tree.get_all_nodes()\n",
    "    '''\n",
    "    print(\"get_illuminated_area4 159: Info of all nodes of tree:\")\n",
    "    for node_i in all_nodes_i:\n",
    "        print(f\"x: {node_i.x}, y: {node_i.y}, value: {node_i.value.split('_')[-1]}, r: {node_i.radius}\")\n",
    "    '''\n",
    "    if tree is None:\n",
    "        return set()\n",
    "\n",
    "    # diffusion_nodes_info contains (node_x, node_y, node_radius) for all nodes in the tree\n",
    "    all_nodes_info_i = tree.diffusion_nodes_info\n",
    "    # print(f\" get_illuminated_area4 169: Tree has {len(all_nodes_info_i)} nodes.\"  )\n",
    "\n",
    "    if not all_nodes_info_i:\n",
    "        return set()\n",
    "\n",
    "    illuminated_coords = set()\n",
    "\n",
    "    for node_i in all_nodes_i:\n",
    "        # Next line (seen as a comment) maybe inconsistent due to mutation and recombination. Basic information in nodes is preferred.\n",
    "        # for node_x, node_y, node_radius in all_nodes_info_i:\n",
    "        # print(f\" get_illuminated_area4 178 all_nodes_info_i: Processing node at ({node_i.x}, {node_i.y}) with radius {node_i.radius}\")\n",
    "        # The center of the circle is the center of the cell it occupies\n",
    "        circle_center_x = node_i.x + 0.5\n",
    "        circle_center_y = node_i.y + 0.5\n",
    "        r_sq = node_i.radius ** 2\n",
    "\n",
    "        # 1. Add the cell containing the center of the circle\n",
    "        # This covers the case of small circles not intersecting grid lines.\n",
    "        illuminated_coords.add((math.floor(circle_center_x), math.floor(circle_center_y)))\n",
    "\n",
    "        # 2. Horizontal Scan: Check intersections with horizontal grid lines\n",
    "        # Iterate y_line from floor(cy - r) to ciel(cy + r)\n",
    "        # These y_line values represent the y-coordinates of horizontal grid lines.\n",
    "        for y_line in range(math.floor(circle_center_y - node_i.radius),\n",
    "                            math.ceil(circle_center_y + node_i.radius) + 1):\n",
    "            dy = y_line - circle_center_y\n",
    "            discriminant = r_sq - dy * dy\n",
    "\n",
    "            if discriminant >= 0:\n",
    "                dx = math.sqrt(discriminant)\n",
    "                x_min_intersect = circle_center_x - dx\n",
    "                x_max_intersect = circle_center_x + dx\n",
    "\n",
    "                # For each integer x-coordinate that the horizontal segment crosses:\n",
    "                # Add the cells whose bottom-left corner's x-coordinate is in this range.\n",
    "                # This covers cells whose top edge is y_line AND cells whose bottom edge is y_line.\n",
    "                for ix in range(math.floor(x_min_intersect), math.floor(x_max_intersect) + 1):\n",
    "                    # Cell (ix, y_line) - its bottom edge is at y_line\n",
    "                    illuminated_coords.add((ix, y_line))\n",
    "                    # Cell (ix, y_line - 1) - its top edge is at y_line\n",
    "                    illuminated_coords.add((ix, y_line - 1))\n",
    "\n",
    "        # 3. Vertical Scan: Check intersections with vertical grid lines\n",
    "        # Iterate x_line from floor(cx - r) to ciel(cx + r)\n",
    "        # These x_line values represent the x-coordinates of vertical grid lines.\n",
    "        for x_line in range(math.floor(circle_center_x - node_i.radius),\n",
    "                            math.ceil(circle_center_x + node_i.radius) + 1):\n",
    "            dx = x_line - circle_center_x\n",
    "            discriminant = r_sq - dx * dx\n",
    "\n",
    "            if discriminant >= 0:\n",
    "                dy = math.sqrt(discriminant)\n",
    "                y_min_intersect = circle_center_y - dy\n",
    "                y_max_intersect = circle_center_y + dy\n",
    "\n",
    "                # For each integer y-coordinate that the vertical segment crosses:\n",
    "                # Add the cells whose bottom-left corner's y-coordinate is in this range.\n",
    "                # This covers cells whose right edge is x_line AND cells whose left edge is x_line.\n",
    "                for iy in range(math.floor(y_min_intersect), math.floor(y_max_intersect) + 1):\n",
    "                    # Cell (x_line, iy) - its left edge is at x_line\n",
    "                    illuminated_coords.add((x_line, iy))\n",
    "                    # Cell (x_line - 1, iy) - its right edge is at x_line\n",
    "                    illuminated_coords.add((x_line - 1, iy))\n",
    "\n",
    "    return illuminated_coords\n",
    "\n",
    "\n",
    "def calculate_fitness_illumination4(candidate_tree_root, target_illuminated_area):\n",
    "    \"\"\"\n",
    "    Calculates fitness based on the symmetric difference between illuminated areas.\n",
    "    Fitness is 1.0 for a perfect match, and decreases as symmetric difference increases.\n",
    "    \"\"\"\n",
    "    if candidate_tree_root is None:\n",
    "        # If the tree generation failed, assign a very low fitness\n",
    "        return 0.0001  # A small non-zero value to avoid division by zero issues later\n",
    "\n",
    "    candidate_illuminated_area = get_illuminated_area4(candidate_tree_root)\n",
    "\n",
    "    # Symmetric difference: (A U B) - (A intersect B)\n",
    "    # Or, the elements in A, but not B, plus elements in B but not A.\n",
    "    symmetric_difference = candidate_illuminated_area.symmetric_difference(target_illuminated_area)\n",
    "\n",
    "    # Union size: used for normalization\n",
    "    union_size = len(candidate_illuminated_area.union(target_illuminated_area))\n",
    "\n",
    "    if union_size == 0:\n",
    "        if not target_illuminated_area and not candidate_illuminated_area:\n",
    "            return 1.0  # Perfect match if both are empty\n",
    "        else:\n",
    "            return 0.0001  # Should not happen if target is non-empty, but handles cases where both are empty but expected non-empty\n",
    "\n",
    "    # Fitness is 1.0 - (len(symmetric_difference) / union_size)\n",
    "    # This gives 1.0 for a perfect match (symmetric_difference_area = 0)\n",
    "    # and approaches 0.0 for large differences.\n",
    "    fitness = 1.0 - (len(symmetric_difference) / union_size)\n",
    "    return max(0.0001, fitness)  # Ensure fitness is always positive\n",
    "\n",
    "\n",
    "# --- EVOLUTIONARY ALGORITHM COMPONENTS ---\n",
    "\n",
    "def create_initial_population_diffusion4(pop_size, max_depth, max_children, max_node_radius, initial_x, initial_y,\n",
    "                                         overlap_factor, node_prefix=\"Individual\"):\n",
    "    population = []\n",
    "    for i in range(pop_size):\n",
    "        # Each tree needs its own occupied_squares_set and diffusion_nodes_info for independent generation\n",
    "        occupied_squares = set()\n",
    "        diffusion_info = []\n",
    "        tree = generate_random_spatial_tree_diffusion4(\n",
    "            max_depth=max_depth, max_children=max_children, max_node_radius=max_node_radius,\n",
    "            initial_x=initial_x, initial_y=initial_y, node_prefix=f\"{node_prefix}_{i}\",\n",
    "            occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info, overlap_factor=overlap_factor\n",
    "        )\n",
    "        if tree:\n",
    "            population.append(tree)\n",
    "    # If not enough trees generated due to space constraints, fill with more random ones (or handle error)\n",
    "    while len(population) < pop_size:\n",
    "        occupied_squares = set()\n",
    "        diffusion_info = []\n",
    "        new_tree = generate_random_spatial_tree_diffusion4(\n",
    "            max_depth=max_depth, max_children=max_children, max_node_radius=max_node_radius,\n",
    "            initial_x=initial_x, initial_y=initial_y, node_prefix=f\"RandomFill_{len(population)}\",\n",
    "            occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info,\n",
    "            overlap_factor=overlap_factor\n",
    "        )\n",
    "        if new_tree:\n",
    "            population.append(new_tree)\n",
    "        else:\n",
    "            # Handle case where a new tree could not be generated\n",
    "            # This might happen if parameters are too restrictive or space is exhausted\n",
    "            break  # Exit if we can't generate enough valid trees\n",
    "    return population\n",
    "\n",
    "\n",
    "def select_parents_diffusion4(population, fitness_scores, num_parents):\n",
    "    parents = []\n",
    "    # Use roulette wheel selection or tournament selection. Tournament is generally robust.\n",
    "    for _ in range(num_parents):\n",
    "        tournament_size = min(5, len(population))\n",
    "        if tournament_size == 0:\n",
    "            break\n",
    "        tournament_candidates = random.sample(list(zip(population, fitness_scores)), tournament_size)\n",
    "        winner = max(tournament_candidates, key=lambda x: x[1])[0]\n",
    "        parents.append(winner)\n",
    "    return parents\n",
    "\n",
    "def update_nodes_info(tree, node_to_update):\n",
    "    temp_occupied_set = set()\n",
    "    temp_diffusion_info = []\n",
    "    # Re-populate temp_occupied_set and temp_diffusion_info by traversing the deep copied tree\n",
    "    stack = [tree]\n",
    "    while stack:\n",
    "        node = stack.pop()\n",
    "        temp_occupied_set.add((node.x, node.y))\n",
    "        temp_diffusion_info.append((node.x, node.y, node.radius))\n",
    "        for child in node.children:\n",
    "            stack.append(child)\n",
    "\n",
    "    # Now, try to add a child to the chosen node\n",
    "    node_to_update.occupied_squares_set = temp_occupied_set  # Update reference for chosen node\n",
    "    node_to_update.diffusion_nodes_info = temp_diffusion_info  # Update reference for chosen node\n",
    "    return node_to_update\n",
    "\n",
    "\n",
    "def mutate_tree_diffusion4(tree_root, max_depth, max_children, max_node_radius, mutation_rate, overlap_factor):\n",
    "    mutated_tree = copy.deepcopy(tree_root)  # Work on a deep copy\n",
    "    all_nodes = mutated_tree.get_all_nodes()\n",
    "\n",
    "    if not all_nodes:\n",
    "        return mutated_tree\n",
    "\n",
    "    node_to_mutate = random.choice(all_nodes)\n",
    "\n",
    "    # Mutation 1: Add a child\n",
    "    if random.random() < mutation_rate:\n",
    "        # Need to regenerate the local_occupied_set and diffusion_nodes_info for the deepcopy\n",
    "        # This is a bit inefficient but ensures correctness after deepcopy/mutation operations\n",
    "        node_to_mutate = update_nodes_info(mutated_tree, node_to_mutate)\n",
    "\n",
    "        node_to_mutate.add_child_in_random_neighbor(\"MutatedChild\", max_node_radius, overlap_factor)\n",
    "\n",
    "    # Mutation 2: Change node radius\n",
    "    if random.random() < mutation_rate:\n",
    "        node_to_mutate.radius = random.uniform(0.5, max_node_radius)\n",
    "\n",
    "    # Mutation 3: Remove a child (if any)\n",
    "    if random.random() < mutation_rate and node_to_mutate.children:\n",
    "        child_to_remove = random.choice(node_to_mutate.children)\n",
    "        node_to_mutate.children.remove(child_to_remove)\n",
    "        # Note: Removing a child means its coordinates and diffusion info are no longer strictly part of the tree\n",
    "        # The fitness function will re-evaluate the actual illuminated area, handling this implicitly.\n",
    "\n",
    "    return mutated_tree\n",
    "\n",
    "\n",
    "def crossover_trees_diffusion4(parent1_root, parent2_root, crossover_rate, max_node_radius, overlap_factor):\n",
    "    if random.random() > crossover_rate:\n",
    "        return copy.deepcopy(parent1_root), copy.deepcopy(parent2_root)\n",
    "\n",
    "    child1_root = copy.deepcopy(parent1_root)\n",
    "    child2_root = copy.deepcopy(parent2_root)\n",
    "\n",
    "    all_nodes_child1 = child1_root.get_all_nodes()\n",
    "    all_nodes_child2 = child2_root.get_all_nodes()\n",
    "\n",
    "    # Ensure there are nodes to swap beyond just the root\n",
    "    if len(all_nodes_child1) < 2 or len(all_nodes_child2) < 2:\n",
    "        return child1_root, child2_root\n",
    "\n",
    "    # Choose random nodes (not roots) to be crossover points\n",
    "    cross_point1 = random.choice([n for n in all_nodes_child1 if n != child1_root])\n",
    "    cross_point2 = random.choice([n for n in all_nodes_child2 if n != child2_root])\n",
    "\n",
    "    # Find parent of cross_point1 in child1_root tree\n",
    "    parent_cross_point1 = None\n",
    "    for node in all_nodes_child1:\n",
    "        if cross_point1 in node.children:\n",
    "            parent_cross_point1 = node\n",
    "            break\n",
    "\n",
    "    # Find parent of cross_point2 in child2_root tree\n",
    "    parent_cross_point2 = None\n",
    "    for node in all_nodes_child2:\n",
    "        if cross_point2 in node.children:\n",
    "            parent_cross_point2 = node\n",
    "            break\n",
    "\n",
    "    if parent_cross_point1 and parent_cross_point2:  # Perform swap\n",
    "        # Remove subtrees from parents\n",
    "        parent_cross_point1.children.remove(cross_point1)\n",
    "        parent_cross_point2.children.remove(cross_point2)\n",
    "\n",
    "        # Attach swapped subtrees\n",
    "        parent_cross_point1.add_child(cross_point2)\n",
    "        parent_cross_point2.add_child(cross_point1)\n",
    "\n",
    "        # After crossover, the `occupied_squares_set` and `diffusion_nodes_info` of the affected trees\n",
    "        # (child1_root, child2_root, and their subtrees) might be inconsistent.\n",
    "        # These will be implicitly re-calculated by `get_illuminated_area` for fitness evaluation.\n",
    "        # For mutation, we explicitly rebuild them (as seen in mutate_tree_diffusion).\n",
    "\n",
    "    return child1_root, child2_root\n",
    "\n",
    "\n",
    "# --- PLOTTING FUNCTIONS ---\n",
    "\n",
    "def plot_illuminated_area4(ax, illuminated_coords, title, color='blue', alpha=0.5):\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "    if not illuminated_coords:\n",
    "        ax.set_title(title)\n",
    "        ax.grid(True)\n",
    "        return\n",
    "\n",
    "    for x, y in illuminated_coords:\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=0.5)\n",
    "        ax.add_patch(rect)\n",
    "\n",
    "    min_x = min(c[0] for c in illuminated_coords) - 1\n",
    "    max_x = max(c[0] for c in illuminated_coords) + 2\n",
    "    min_y = min(c[1] for c in illuminated_coords) - 1\n",
    "    max_y = max(c[1] for c in illuminated_coords) + 2\n",
    "\n",
    "    ax.set_xlim(min_x, max_x)\n",
    "    ax.set_ylim(min_y, max_y)\n",
    "    ax.set_xticks(range(int(min_x), int(max_x)))\n",
    "    ax.set_yticks(range(int(min_y), int(max_y)))\n",
    "    ax.grid(True)\n",
    "    ax.set_title(title)\n",
    "\n",
    "\n",
    "def plot_tree_with_illumination4(tree_root, illuminated_coords, ax, tree_color='lightblue', diff_color='red', title=\"\"):\n",
    "    # Print the nodes of tree_root\n",
    "    all_nodes_t = tree_root.get_all_nodes()\n",
    "\n",
    "    '''\n",
    "    print(\"plot_tree_with_illumination4 430: Info of all nodes of tree_root:\")\n",
    "    for node_t in all_nodes_t:\n",
    "        print(f\"x: {node_t.x}, y: {node_t.y}, value: {node_t.value.split('_')[-1]}, r: {node_t.radius}\")\n",
    "    '''\n",
    "\n",
    "    # Plot illuminated area first (background)\n",
    "    for x, y in illuminated_coords:\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=diff_color, alpha=0.5,\n",
    "                                 zorder=0)  # Changed alpha for more transparency\n",
    "        ax.add_patch(rect)\n",
    "\n",
    "    if tree_root is None:\n",
    "        return\n",
    "\n",
    "    # Plot tree nodes and their diffusion circles\n",
    "    all_nodes = tree_root.get_all_nodes()\n",
    "    for node in all_nodes:\n",
    "        # Plot the square representing the cell\n",
    "        rect = patches.Rectangle((node.x, node.y), 1, 1, facecolor=tree_color, edgecolor='black', linewidth=1, zorder=1)\n",
    "        ax.add_patch(rect)\n",
    "        ax.text(node.x + 0.5, node.y + 0.5, node.value.split('_')[-1], ha='center', va='center', color='darkblue',\n",
    "                fontsize=7, zorder=2)\n",
    "\n",
    "        # Plot the circle representing the radius of influence\n",
    "        circle = patches.Circle((node.x + 0.5, node.y + 0.5), node.radius, color='red', alpha=0.2, zorder=2)\n",
    "        ax.add_patch(circle)\n",
    "\n",
    "    # Draw lines connecting parent to children\n",
    "    for node in all_nodes:\n",
    "        for child in node.children:\n",
    "            ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--', linewidth=0.8, zorder=3)\n",
    "\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "    ax.set_title(title)\n",
    "\n",
    "    # Set plot limits based on the illuminated coordinates\n",
    "    if illuminated_coords:\n",
    "        all_x = [c[0] for c in illuminated_coords]\n",
    "        all_y = [c[1] for c in illuminated_coords]\n",
    "\n",
    "        min_x_val = min(all_x) - 1\n",
    "        max_x_val = max(all_x) + 2\n",
    "        min_y_val = min(all_y) - 1\n",
    "        max_y_val = max(all_y) + 2\n",
    "\n",
    "        ax.set_xlim(min_x_val, max_x_val)\n",
    "        ax.set_ylim(min_y_val, max_y_val)\n",
    "        ax.set_xticks(range(int(min_x_val), int(max_x_val)))\n",
    "        ax.set_yticks(range(int(min_y_val), int(max_y_val)))\n",
    "    ax.grid(True)\n",
    "\n",
    "\n",
    "# --- MAIN EVOLUTIONARY SIMULATION LOOP ---\n",
    "\n",
    "def run_evolutionary_lighting4(target_tree_params, ga_params):\n",
    "    # 1. Generate Target Tree and its Illuminated Area\n",
    "    print(\"\\n--- Generating Target Tree ---\")\n",
    "    random.seed(ga_params['seed'] + 1)  # Use a different seed for target generation\n",
    "    target_occupied_squares = set()\n",
    "    target_diffusion_info = []\n",
    "    target_tree_root = generate_random_spatial_tree_diffusion4(\n",
    "        max_depth=target_tree_params['max_depth'], max_children=target_tree_params['max_children'],\n",
    "        max_node_radius=target_tree_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "        node_prefix=\"Target\", occupied_squares_set=target_occupied_squares,\n",
    "        diffusion_nodes_info=target_diffusion_info, overlap_factor=target_tree_params['overlap_factor']\n",
    "    )\n",
    "\n",
    "    if not target_tree_root:\n",
    "        print(\"Failed to generate target tree. Exiting.\")\n",
    "        return None, None, None, None, []\n",
    "\n",
    "    target_illuminated_area = get_illuminated_area4(target_tree_root)\n",
    "    print(\n",
    "        f\"Target Tree Generated with {len(target_tree_root.get_all_nodes())} nodes. Illuminated area size: {len(target_illuminated_area)}\")\n",
    "\n",
    "    # 2. Initialize Population\n",
    "    random.seed(ga_params['seed'])  # Reset seed for GA population generation\n",
    "    print(f\"\\n--- Initializing Population of {ga_params['pop_size']} Trees ---\")\n",
    "    population = create_initial_population_diffusion4(\n",
    "        pop_size=ga_params['pop_size'], max_depth=ga_params['max_depth'], max_children=ga_params['max_children'],\n",
    "        max_node_radius=ga_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "        overlap_factor=ga_params['overlap_factor']\n",
    "    )\n",
    "    print(f\"Population initialized with {len(population)} individuals.\")\n",
    "\n",
    "    best_tree_overall = None\n",
    "    best_fitness_overall = -1.0\n",
    "    history = []\n",
    "\n",
    "    # 4. Evolutionary Loop\n",
    "    print(f\"\\n--- Starting Evolutionary Loop for {ga_params['generations']} Generations ---\")\n",
    "    for generation in range(ga_params['generations']):\n",
    "        fitness_scores = [calculate_fitness_illumination4(tree, target_illuminated_area) for tree in population]\n",
    "\n",
    "        current_best_fitness = max(fitness_scores)\n",
    "        current_best_tree = population[np.argmax(fitness_scores)]\n",
    "\n",
    "        if current_best_fitness > best_fitness_overall:\n",
    "            best_fitness_overall = current_best_fitness\n",
    "            best_tree_overall = copy.deepcopy(current_best_tree)  # Deepcopy to save the best tree\n",
    "\n",
    "        # Print the nodes of current_best_tree\n",
    "        all_nodes_current_best_tree = current_best_tree.get_all_nodes()\n",
    "\n",
    "        '''\n",
    "        print(\"run_evolutionary_lighting4 A: Info of all nodes of current_best_tree:\")\n",
    "        for node_c in all_nodes_current_best_tree:\n",
    "            print(f\"x: {node_c.x}, y: {node_c.y}, value: {node_c.value.split('_')[-1]}, r: {node_c.radius}\")\n",
    "        '''\n",
    "\n",
    "        # Print the nodes of evolved_best_tree\n",
    "        all_nodes_best_tree = best_tree_overall.get_all_nodes()\n",
    "        '''\n",
    "        print(\"run_evolutionary_lighting4 A: Info of all nodes of evolved_best_tree:\")\n",
    "        for node_b in all_nodes_best_tree:\n",
    "            print(f\"x: {node_b.x}, y: {node_b.y}, value: {node_b.value.split('_')[-1]}, r: {node_b.radius}\")\n",
    "        '''\n",
    "\n",
    "        history.append(current_best_fitness)\n",
    "\n",
    "        print(\n",
    "            f\"Generation {generation + 1}/{ga_params['generations']}: Best Fitness = {current_best_fitness:.4f} (Overall Best: {best_fitness_overall:.4f})\")\n",
    "\n",
    "        if best_fitness_overall >= 0.999:  # Almost perfect match\n",
    "            print(\"Target illumination achieved (or very close)! Stopping evolution.\")\n",
    "            break\n",
    "\n",
    "        # Selection\n",
    "        parents = select_parents_diffusion4(population, fitness_scores, ga_params['pop_size'] // 2)\n",
    "\n",
    "        # Create next generation\n",
    "        next_population = []\n",
    "        # Elitism: Keep the best individual from the current generation\n",
    "        if best_tree_overall and current_best_fitness == best_fitness_overall:  # Only if it's the current best in this generation\n",
    "            next_population.append(copy.deepcopy(current_best_tree))\n",
    "\n",
    "        while len(next_population) < ga_params['pop_size']:\n",
    "            if len(parents) < 2:  # Not enough parents for crossover, fill with new random trees\n",
    "                occupied_squares = set()\n",
    "                diffusion_info = []\n",
    "                new_tree = generate_random_spatial_tree_diffusion4(\n",
    "                    max_depth=ga_params['max_depth'], max_children=ga_params['max_children'],\n",
    "                    max_node_radius=ga_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "                    node_prefix=f\"RandomFill_{len(next_population)}\",\n",
    "                    occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info,\n",
    "                    overlap_factor=ga_params['overlap_factor']\n",
    "                )\n",
    "                if new_tree:\n",
    "                    next_population.append(new_tree)\n",
    "                continue\n",
    "\n",
    "            # Randomly pick two parents (can be the same parent multiple times with replacement for simplicity)\n",
    "            p1 = random.choice(parents)\n",
    "            p2 = random.choice(parents)\n",
    "\n",
    "            # Crossover\n",
    "            child1, child2 = crossover_trees_diffusion4(p1, p2, ga_params['crossover_rate'],\n",
    "                                                        ga_params['max_node_radius'], ga_params['overlap_factor'])\n",
    "\n",
    "            # Mutation\n",
    "            mutated_child1 = mutate_tree_diffusion4(child1, ga_params['max_depth'], ga_params['max_children'],\n",
    "                                                    ga_params['max_node_radius'], ga_params['mutation_rate'],\n",
    "                                                    ga_params['overlap_factor'])\n",
    "            mutated_child2 = mutate_tree_diffusion4(child2, ga_params['max_depth'], ga_params['max_children'],\n",
    "                                                    ga_params['max_node_radius'], ga_params['mutation_rate'],\n",
    "                                                    ga_params['overlap_factor'])\n",
    "\n",
    "            next_population.append(mutated_child1)\n",
    "            if len(next_population) < ga_params['pop_size']:\n",
    "                next_population.append(mutated_child2)\n",
    "\n",
    "        population = next_population[:ga_params['pop_size']]\n",
    "\n",
    "    print(\"\\n--- Evolution Finished ---\")\n",
    "    print(f\"Final Best Fitness: {best_fitness_overall:.4f}\")\n",
    "    # Print the nodes of evolved_best_tree\n",
    "    all_nodes_b2 = best_tree_overall.get_all_nodes()\n",
    "    '''\n",
    "    print(\"run_evolutionary_lighting4 B: Info of all nodes of evolved_best_tree:\")\n",
    "    for node_b2 in all_nodes_b2:\n",
    "      print(f\"x: {node_b2.x}, y: {node_b2.y}, value: {node_b2.value.split('_')[-1]}, r: {node_b2.radius}\")\n",
    "    '''\n",
    "\n",
    "    return target_tree_root, target_illuminated_area, best_tree_overall, best_fitness_overall, history\n",
    "\n",
    "\n",
    "# --- MAIN EXECUTION ---\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    # Parameters for the target tree generation\n",
    "    TARGET_TREE_PARAMS = {\n",
    "        'max_depth': 3,\n",
    "        'max_children': 2,\n",
    "        'max_node_radius': 3.0,\n",
    "        'overlap_factor': 0.7\n",
    "    }\n",
    "\n",
    "    # Parameters for the Genetic Algorithm\n",
    "    GA_PARAMS = {\n",
    "        'seed': 676182,\n",
    "        'pop_size': 200,\n",
    "        'generations': 500,\n",
    "        'max_depth': 3,\n",
    "        'max_children': 3,\n",
    "        'max_node_radius': 3.0,\n",
    "        'mutation_rate': 0.1,\n",
    "        'crossover_rate': 0.7,\n",
    "        'overlap_factor': 0.7,\n",
    "        'illumination_resolution': 1  # This parameter is no longer used by get_illuminated_area4\n",
    "    }\n",
    "\n",
    "    '''\n",
    "    # Parameters for the target tree generation\n",
    "    TARGET_TREE_PARAMS = {\n",
    "        'max_depth': 20,\n",
    "        'max_children': 3,\n",
    "        'max_node_radius': 3.0,\n",
    "        'overlap_factor': 0.7\n",
    "    }\n",
    "\n",
    "    # Parameters for the Genetic Algorithm\n",
    "    GA_PARAMS = {\n",
    "        'seed': 67682,\n",
    "        'pop_size': 30,\n",
    "        'generations': 2,\n",
    "        'max_depth': 20,\n",
    "        'max_children': 3,\n",
    "        'max_node_radius': 3.0,\n",
    "        'mutation_rate': 0.1,\n",
    "        'crossover_rate': 0.7,\n",
    "        'overlap_factor': 0.7,\n",
    "        'illumination_resolution': 1 # This parameter is no longer used by get_illuminated_area4\n",
    "    }\n",
    "    '''\n",
    "    target_tree, target_area, evolved_best_tree, evolved_best_fitness, history = run_evolutionary_lighting4(\n",
    "        TARGET_TREE_PARAMS, GA_PARAMS)\n",
    "\n",
    "    '''\n",
    "    # Print the nodes of evolved_best_tree\n",
    "    all_nodes = evolved_best_tree.get_all_nodes()\n",
    "\n",
    "    print(\"Main 649: Info of all nodes of evolved_best_tree:\")\n",
    "    for node in all_nodes:\n",
    "      print(f\"x: {node.x}, y: {node.y}, value: {node.value.split('_')[-1]}, r: {node.radius}\")\n",
    "    '''\n",
    "\n",
    "    '''\n",
    "    # Plot tree nodes and their diffusion circles\n",
    "    all_nodes = tree_root.get_all_nodes()\n",
    "    for node in all_nodes:\n",
    "        # Plot the square representing the cell\n",
    "        rect = patches.Rectangle((node.x, node.y), 1, 1, facecolor=tree_color, edgecolor='black', linewidth=1, zorder=1)\n",
    "        ax.add_patch(rect)\n",
    "        ax.text(node.x + 0.5, node.y + 0.5, node.value.split('_')[-1], ha='center', va='center', color='darkblue', fontsize=7, zorder=2)\n",
    "\n",
    "        # Plot the circle representing the radius of influence\n",
    "        circle = patches.Circle((node.x + 0.5, node.y + 0.5), node.radius, color='red', alpha=0.2, zorder=2)\n",
    "        ax.add_patch(circle)\n",
    "    '''\n",
    "\n",
    "    # --- Plotting Results ---\n",
    "    if target_tree and evolved_best_tree:\n",
    "        fig, axes = plt.subplots(1, 3, figsize=(24, 8))\n",
    "\n",
    "        # Plot 1: Target Tree Structure and its Illumination\n",
    "        # print(\"# Plot 1: Target Tree Structure and its Illumination\")\n",
    "        plot_tree_with_illumination4(target_tree, target_area, axes[0], tree_color='skyblue', diff_color='green',\n",
    "                                     title=\"Target Tree and Illuminated Area\")\n",
    "\n",
    "        # Plot 2: Best Evolved Tree Structure and its Illumination\n",
    "        # print(\"# Main 680 Plot 2: Best Evolved Tree Structure and its Illumination\")\n",
    "        evolved_best_area = get_illuminated_area4(evolved_best_tree)\n",
    "        plot_tree_with_illumination4(evolved_best_tree, evolved_best_area, axes[1], tree_color='lightcoral',\n",
    "                                     diff_color='purple',\n",
    "                                     title=f\"Best Evolved Tree (Fitness: {evolved_best_fitness:.4f})\")\n",
    "\n",
    "        # Plot 4: Symmetric Difference Area\n",
    "        # print(\"# Plot 3: Symmetric Difference Area\")\n",
    "        symmetric_diff_area = target_area.symmetric_difference(evolved_best_area)\n",
    "        plot_illuminated_area4(axes[2], symmetric_diff_area,\n",
    "                               title=f\"Symmetric Difference (Error Area: {len(symmetric_diff_area)})\")\n",
    "\n",
    "        plt.tight_layout()\n",
    "        plt.show()\n",
    "\n",
    "        # Plot Fitness History\n",
    "        plt.figure(figsize=(10, 6))\n",
    "        plt.plot(history, marker='o', linestyle='-', color='blue')\n",
    "        plt.title('Best Fitness Progression Over Generations')\n",
    "        plt.xlabel('Generation')\n",
    "        plt.ylabel('Fitness')\n",
    "        plt.grid(True)\n",
    "        plt.show()\n",
    "    else:\n",
    "        print(\"No plot\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "tECNJ2QpdzsM"
   },
   "source": [
    "**Recommendation.** To get new results when running the previous program, change the seed of the random generator in line 647.\n",
    "\n",
    "**Warning.** The simulation continues to produce a disruption bug but with seemingly less frequency. Nevertheless, Evolution is by its very nature fault-tolerant and so, we can get a feeling for some questions that may be right. For that reason, we give a place for the study of important questions.\n",
    "\n",
    "**Exercise.** Play with the code enough to get an stable perception of the  performance of Evolution. Agree else disagree with the opinions of the Author.\n",
    ">\n",
    "> *Answer.* Our opinions over the performance of the Evolution of morphological trees consists of five points:\n",
    "\n",
    "> 1. Evolution is not gradualistic. *The Evolution of shape is always saltationist*. This means that the fitness does not follow a soft curve but always evolves in jumps that are intercalated with periods of ecstasy of unequal duration. Jumps are contrary to the gradualism of Darwin so, apart from some few cases, [jumps are not recognized by everybody](https://en.wikipedia.org/w/index.php?title=Saltation_(biology)&oldid=1357316682) because, it is said, small changes can cumulate over some few thousand of years to appear as jumps in the fossil record.\n",
    "\n",
    "> 2.  Evolution is scientific. This means that its overall behavior is always reproducible without amendments: Evolution can solve easy cases, but battles with complexity demanding growing resources. Or, equivalently, the more abundant are the resources, the higher are the pace in the direction of perfection and the achieved height.  \n",
    "\n",
    "> 3. The battle of Evolution against complexity is scientific. This means that the fitness history leaves for each example an objective history of jumps that connects a low fitness with a higher one. The lowest fitness is not zero because morphological fine details always can be imitated by coarse graining structures. From that beginning, Evolution marches in the direction of perfection advancing by jumps. And, what is in within jumps and jump? If one thinks of the fossil record, every period of ecstasy implies a huge amount of fossils of the same type that are next replaced by a variant. This is a prediction of the Evolutionary Theory.\n",
    "\n",
    "> 4. Complexity smashes Evolution. We propose to measure the complexity of the shape by the number of nodes in the target tree. This does not make justice to the richness of the algorithm, but is a good beginning. Now, Evolution can solve easy cases with 1 node just in the initial generation. But a problem with 6 nodes gives rise to a battle against complexity. One instance for a pop size of 200 and 45 minutes of work by Gemini:   \n",
    ">\n",
    ">> $0.8125 (gen 1) \\rightarrow 0.9167(gen3) \\rightarrow 0.9583 (gen 5) \\rightarrow  0.9783 (gen 307) \\rightarrow  0.9787 (gen 315) \\rightarrow 1.0 (gen 462)$.  \n",
    "\n",
    "**Exercise.** Express your opinion over the following question:\n",
    ">\n",
    ">  Does Evolution explain your morphology? Or, did species appear by Evolution?\n",
    ">\n",
    "> *Answer.*  Our Lighting Network Model of morphogenesis is simple and natural. So, we believe that it is the correct approach to morphogenesis. It is plainly scientific because our experiments or simulations can be unconditionally reproduced, and Evolution always has the same behavior that shows a hard battle against complexity. Now, we have found for our simple test cases an ascendant trend in the direction of perfection, in consequence we have three mandatory predictions for the Evolutionary Theory:\n",
    "1. Simple morphological traits can be evolvable in the lab. [This prediction is true](https://www.researchgate.net/publication/51658530_Scrutinising_snail_shells) (Schilthuizen, Menno. (2011). Scrutinizing snail shells. Heredity. 108. 364-365. 10.1038/hdy.2011.88.)\n",
    "2. Actual populations must show diversity of simple morphological traits. This is because according to our simulations Evolution always battles against complexity and something achieves.  According to what we see, this prediction is correct because we easily distinguish an Amerindian from a European, and our children from those of the neighbor. And all of us are brothers and sisters.\n",
    "3. The fossil record must be filled in every sort of deformed shapes that show that Evolution had a tremendous battle against complexity to generate so delicate traits as those of the [bones of the ear](https://youtu.be/eQEaiZ2j9oc)\n",
    "\n",
    "Those bones must transmit whispers and explosions altogether.  Or, consider that all our phalanges are roughly equal but, if one pays attention, they result to be all very different. Or, think of the delicate intricacies of the traits of a vertebra that must be a transmission and protective tube for the medulla but with orifices for vessels and nerves plus serving as a supporting mobile and resistant shaft for the whole body: where is the fossil record of the infinitely many trials that Evolution should have done to generate them? They are nowhere. So, there is no reason to consider that we and our morphology are a result of Evolution.\n",
    "\n",
    "The saltationist behavior observed by the Evolution of Lighting Networks shall have a mathematical explanation.  \n",
    "\n",
    "**Exercise.** We have associated trees with pleiotropy. That is why, we suspect that morphogenesis, according to the Lighting Network Model, is also loaded with pleiotropy. Show this, else prove that there is no pleiotropy at all. Warning: to show that the Lighting Network Model is prey of pleiotropy, you must exhibit the one-change-to-many-effects-signature of pleiotropy.\n",
    ">\n",
    "> *Answer.* Pleiotropy was transparent in the problem of fitting a distance matrix to a phylogenetic tree: if one changes the distance between two nodes in a tree, all distances associated to all paths that go through this sub-path change. We immediately see that a change has many effects. By the same token, we must find an intermediate variable in the Lighting Network Model and show that a change in one value associated to a node causes collateral effects in other variables associated with other nodes and that integrate the fitness of the tree. Our proposal follows:\n",
    ">\n",
    "> If a pixel is illuminated, it is illuminated by specific lamps. Imagine now that we turn off all the redundant lights, which are those lamps whose circle of action is completely contained in those of others. We can now make a partition of the illuminated area in disjoint sets. Examples:\n",
    "> 1. If the illuminated region is $I_2 = A \\cup B$, then the disjoint partition is $P_2 = A \\cup (B-A)$.  \n",
    "> 2. If the illuminated region is $I_3 = A \\cup B \\cup C$, then the disjoint partition is $P_3 = [ A \\cup (B-A)] \\cup (C- (A \\cup B))$.\n",
    ">\n",
    "> The generalization of this procedure defines the essential nodes plus their personal participation in the overall task of illuminating the target region. What happens if we change the radius of one circle? The node could become redundant, or dominant, or the disjoint partition can change in many components, the disjoint subsets. Thus, we have from traumatic changes to soft ones in diverse values. This is pleiotropy that results from an interaction of the complexity with the fitness function. The complexity results from the attached essential information to each node: its x and y coordinates and the radius of illumination. The fitness function measures the symmetric difference between illuminated areas of two complete lighting networks, the target and test nets, and this is a global observable that cannot be explained by addition of the illuminating effects of isolated nodes. The reason is that there are many regions with multiple illumination with complex patterns of overlapping.\n",
    "\n",
    "**Exercise.** Propose an explanation of why Gemini 2.5 Flash, an extremely powerful application, cannot produce perfect software.\n",
    ">\n",
    "> *Answer.* The nucleus of Gemini 2.5 Flash is a neural network. These learn from their teachers, which, in this case, consist of extant code, that by 2026 has been mostly created by human developers. So, for known tasks, Gemini can produce perfect code. But for unknown tasks, it must create, and it goes on the same way of life as we do: to develop a program that possibly fits a project, test it, find mistakes, make corrections, and repeat. We humans are very good for that process. This means that we can solve tasks but maybe with a great effort. For instance, to propose a remedy for the old illumination bug, the Author has invested up to now, apart from long discussions with Gemini, one week of work.\n",
    "\n",
    "**Exercise.** Express your opinion over the following question: Is the error-correcting-style-of-coding a necessity or an option that will be overcome by technical advances in computing in a near future?\n",
    ">\n",
    "> *Answer.* Humanity is code-hungry. So, we always pursue code of a degree of complexity that surpasses the possibilities of the day. Therefore, the error-correcting-style-of-coding will be a necessity for all ages.\n",
    "\n",
    "**Exercise.** The DNA contains instructions to continue life. These are encoded using the Genetic Code. So, the DNA is software. The Evolutionary Theory says that all the DNA-software of all species appeared by Natural Evolution. From this, we predict that it must be possible to design software using a simulation of Evolution. Right. This is a modern discipline that is called Genetic Programming whose essence is the error-correcting-style-of-coding. Do you consider that this must be also the essence of Natural Evolution? Do you have concrete testable predictions?\n",
    ">\n",
    "> *Answer.* By its very nature, the essence of Natural Evolution is the error-correcting-style-of-coding for gathering small progress: to initialize the process by randomness, select the best, make changes, reproduce it, and repeat. The immediate prediction is that an Evolution of Perfection must accompany every Evolutionary branch. So, the fossil record must be filled in every sort of malformed skeletons. And, since the Earth is very recent, every living population must have every sort of malformed skeletons and malfunctions. Thus, to know whether the Evolutionary Theory is the explanation of our existence, it is enough to look at own body. If it is filled in every kind of defects of anatomy and physiology, we appeared by Evolution. But, if we have some few tens of genetic defects, we are not here as a byproduct of Evolution. Please, look at yourself and decide.\n",
    "\n",
    "**Exercise.** Convert the previous program into a laboratory. To achieve this, some tasks are in order:\n",
    ">\n",
    "> 1. Include an ID for each experiment. The current time is a good option.\n",
    "> 2. Print the names and values of the arguments or control variables.\n",
    "> 3. Simplify the program, if only that is possible.\n",
    "\n",
    ">\n",
    "> *Answer.* We asked Colab for help. Gemini replied:\n",
    ">>\n",
    ">> Okay, I've converted the program into a laboratory setup. It now includes a timestamp-based experiment ID and prints all the control variables (target tree and GA parameters) at the beginning of each run. I've also refactored the code by removing the numeric suffixes from classes and functions to simplify it. The main execution function is now `run_evolutionary_lighting_lab`.\n",
    ">>\n",
    ">> Running the code will display the experiment details and then proceed with the evolutionary simulation and plotting.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "executionInfo": {
     "elapsed": 2102353,
     "status": "ok",
     "timestamp": 1788358306053,
     "user": {
      "displayName": "jose rodriguez",
      "userId": "08454562216435392883"
     },
     "user_tz": 300
    },
    "id": "aZljnoIb7_Qz",
    "outputId": "9a4cc0dd-b440-4803-bf64-35ae1bd7d03e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "--- Starting Experiment: 20260902_133643 ---\n",
      "Target Tree Parameters:\n",
      "  max_depth: 100\n",
      "  max_children: 3\n",
      "  max_node_radius: 3.0\n",
      "  overlap_factor: 0.7\n",
      "\n",
      "Genetic Algorithm Parameters:\n",
      "  seed: 679182\n",
      "  pop_size: 200\n",
      "  generations: 500\n",
      "  max_depth: 100\n",
      "  max_children: 3\n",
      "  max_node_radius: 3.0\n",
      "  mutation_rate: 0.1\n",
      "  crossover_rate: 0.7\n",
      "  overlap_factor: 0.7\n",
      "  illumination_resolution: 1\n",
      "\n",
      "--- Generating Target Tree ---\n",
      "Target Tree Generated with 8 nodes. Illuminated area size: 37\n",
      "\n",
      "--- Initializing Population of 200 Trees ---\n",
      "Population initialized with 200 individuals.\n",
      "\n",
      "--- Starting Evolutionary Loop for 500 Generations ---\n",
      "Generation 1/500: Best Fitness = 0.7838 (Overall Best: 0.7838)\n",
      "Generation 2/500: Best Fitness = 0.8222 (Overall Best: 0.8222)\n",
      "Generation 3/500: Best Fitness = 0.8222 (Overall Best: 0.8222)\n",
      "Generation 4/500: Best Fitness = 0.8571 (Overall Best: 0.8571)\n",
      "Generation 5/500: Best Fitness = 0.9250 (Overall Best: 0.9250)\n",
      "Generation 6/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 7/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 8/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 9/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 10/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 11/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 12/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 13/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 14/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 15/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 16/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 17/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 18/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 19/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 20/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 21/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 22/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 23/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 24/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 25/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 26/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 27/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 28/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 29/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 30/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 31/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 32/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 33/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 34/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 35/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 36/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 37/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 38/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 39/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 40/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 41/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 42/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 43/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 44/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 45/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 46/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 47/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 48/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 49/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 50/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 51/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 52/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 53/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 54/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 55/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 56/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 57/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 58/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 59/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 60/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 61/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 62/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 63/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 64/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 65/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 66/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 67/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 68/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 69/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 70/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 71/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 72/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 73/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 74/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 75/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 76/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 77/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 78/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 79/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 80/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 81/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 82/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 83/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 84/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 85/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 86/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 87/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 88/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 89/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 90/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 91/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 92/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 93/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 94/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 95/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 96/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 97/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 98/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 99/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 100/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 101/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 102/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 103/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 104/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 105/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 106/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 107/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 108/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 109/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 110/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 111/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 112/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 113/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 114/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 115/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 116/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 117/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 118/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 119/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 120/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 121/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 122/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 123/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 124/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 125/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 126/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 127/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 128/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 129/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 130/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 131/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 132/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 133/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 134/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 135/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 136/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 137/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 138/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 139/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 140/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 141/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 142/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 143/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 144/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 145/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 146/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 147/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 148/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 149/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 150/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 151/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 152/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 153/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 154/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 155/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 156/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 157/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 158/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 159/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 160/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 161/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 162/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 163/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 164/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 165/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 166/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 167/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 168/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 169/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 170/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 171/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 172/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 173/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 174/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 175/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 176/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 177/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 178/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 179/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 180/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 181/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 182/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 183/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 184/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 185/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 186/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 187/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 188/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 189/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 190/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 191/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 192/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 193/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 194/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 195/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 196/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 197/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 198/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 199/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 200/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 201/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 202/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 203/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 204/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 205/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 206/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 207/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 208/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 209/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 210/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 211/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 212/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 213/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 214/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 215/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 216/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 217/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 218/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 219/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 220/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 221/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 222/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 223/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 224/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 225/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 226/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 227/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 228/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 229/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 230/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 231/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 232/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 233/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 234/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 235/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 236/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 237/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 238/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 239/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 240/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 241/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 242/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 243/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 244/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 245/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 246/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 247/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 248/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 249/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 250/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 251/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 252/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 253/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 254/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 255/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 256/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 257/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 258/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 259/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 260/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 261/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 262/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 263/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 264/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 265/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 266/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 267/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 268/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 269/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 270/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 271/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 272/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 273/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 274/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 275/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 276/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 277/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 278/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 279/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 280/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 281/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 282/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 283/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 284/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 285/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 286/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 287/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 288/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 289/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 290/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 291/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 292/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 293/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 294/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 295/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 296/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 297/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 298/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 299/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 300/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 301/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 302/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 303/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 304/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 305/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 306/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 307/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 308/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 309/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 310/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 311/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 312/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 313/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 314/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 315/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 316/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 317/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 318/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 319/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 320/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 321/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 322/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 323/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 324/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 325/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 326/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 327/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 328/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 329/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 330/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 331/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 332/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 333/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 334/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 335/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 336/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 337/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 338/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 339/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 340/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 341/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 342/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 343/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 344/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 345/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 346/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 347/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 348/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 349/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 350/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 351/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 352/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 353/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 354/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 355/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 356/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 357/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 358/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 359/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 360/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 361/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 362/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 363/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 364/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 365/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 366/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 367/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 368/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 369/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 370/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 371/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 372/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 373/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 374/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 375/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 376/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 377/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 378/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 379/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 380/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 381/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 382/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 383/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 384/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 385/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 386/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 387/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 388/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 389/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 390/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 391/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 392/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 393/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 394/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 395/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 396/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 397/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 398/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 399/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 400/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 401/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 402/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 403/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 404/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 405/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 406/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 407/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 408/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 409/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 410/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 411/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 412/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 413/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 414/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 415/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 416/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 417/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 418/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 419/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 420/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 421/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 422/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 423/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 424/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 425/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 426/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 427/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 428/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 429/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 430/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 431/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 432/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 433/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 434/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 435/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 436/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 437/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 438/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 439/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 440/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 441/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 442/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 443/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 444/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 445/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 446/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 447/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 448/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 449/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 450/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 451/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 452/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 453/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 454/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 455/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 456/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 457/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 458/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 459/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 460/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 461/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 462/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 463/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 464/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 465/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 466/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 467/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 468/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 469/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 470/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 471/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 472/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 473/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 474/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 475/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 476/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 477/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 478/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 479/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 480/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 481/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 482/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 483/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 484/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 485/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 486/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 487/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 488/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 489/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 490/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 491/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 492/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 493/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 494/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 495/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 496/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 497/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 498/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 499/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "Generation 500/500: Best Fitness = 0.9487 (Overall Best: 0.9487)\n",
      "\n",
      "--- Evolution Finished ---\n",
      "Final Best Fitness: 0.9487\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAACVYAAAMvCAYAAAAz3hnmAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xl8XFX9//H3vbNv2btRoCtQKMhO2UvBUtkR20L5skNBAUEE2VSg8EUFUeQHWhYFFFvZEfDLVrTIjqCAQNlaum/ZM8lMZr3n90eaoZkkbdImnaR5PR+PPNLcuTPzmTN3pvfc+77nWMYYIwAAAAAAAAAAAAAAAABAjl3oAgAAAAAAAAAAAAAAAACgryFYBQAAAAAAAAAAAAAAAAB5CFYBAAAAAAAAAAAAAAAAQB6CVQAAAAAAAAAAAAAAAACQh2AVAAAAAAAAAAAAAAAAAOQhWAUAAAAAAAAAAAAAAAAAeQhWAQAAAAAAAAAAAAAAAEAeglUAAAAAAAAAAAAAAAAAkIdgFQAAAAAAAAAAAAAAAADkIVgFAOgRS5YskWVZevDBB7t93wcffFCWZWnJkiW5ZYcddpgOO+ywHqtvc+vpT2644QZZllXoMgAAANALRo4cqbPOOmuLP+8rr7wiy7L0yiuvbPHn7g233nqrxo0bJ8dxunyfQvZR0HtOOeUUTZ8+vdBlAAAAFESh+hetLMvSDTfc0GbZu+++qwMPPFChUEiWZemDDz6QJL3wwgvaY4895Pf7ZVmW6uvrt3i9fc2FF16oyZMnF7oMdNPVV1+tCRMmFLoMAN1AsApAr7Esq0s/fe3A/JtvvqkbbrhhozvlrScWuvKDr7W22+OPP17oUgpq1apVuuGGG3KdwkKbPn26LMvSVVddVehSAADAANYacF//Z/DgwZo0aZKef/75XnveeDyuG264oct9k431BR5++OFeq7Uv6y99wGg0qltuuUVXXXWVbPvrQ2Od1Tt06NAOH6ev7dP3hmQyqauuukrbbLONAoGAJkyYoHnz5nX5/g8//LD22msv+f1+DRo0SOeee66qq6s3eJ/XX3891/Ydrfvyyy9r0qRJqqioUElJifbbbz899NBDbdbp6Ltk/Z85c+bk1r3qqqv0xBNP6MMPP+zy6wIAAH3XRx99pKlTp2rEiBHy+/0aPny4Jk+erDvvvLPQpfWqBQsW6IYbbijoxcIjR47M7W/Ztq2SkhLttttuOv/88/XOO+906THS6bSmTZum2tpa3X777XrooYc0YsQI1dTUaPr06QoEAvrtb3+rhx56SKFQqJdfUd+2ePFi/f73v9e1116bW9Z6AXxnP7/4xS8KWHHX/O53v5NlWf0ueLR8+XLNmjVL++23n0pLS1VRUaHDDjtML7/8crt1f/CDH+jDDz/UM888U4BKAWwKd6ELALD1yj+w+ac//Unz5s1rt3znnXfekmVt1JtvvqlZs2bprLPOUklJSafr7bzzzu1eyzXXXKNwOKwf//jHvVwletPpp5+uU045RT6fr9eeY9WqVZo1a5ZGjhypPfbYo9eepyui0aieffZZjRw5Un/5y1/0i1/8gkAgAAAoqBtvvFGjRo2SMUZr167Vgw8+qKOPPlrPPvusjj322B5/vng8rlmzZklSt0YkuuSSS7Tvvvu2W37AAQf0VGn9Sn/pA95///3KZDKaMWNGu9smT56sM844o82yQCAgSXrppZfaLO9L+/S95ayzztLjjz+uH/zgB9phhx1yn8X58+fr4IMP3uB9Z8+erQsvvFBHHHGEfv3rX2vFihW644479N577+mdd96R3+9vdx/HcfT9739foVBIsVis3e3PPPOMTjzxRB1wwAG5kXofffRRnXHGGaqurtZll10mSTr00EPbbXeSdPvtt+vDDz/UEUcckVu25557ap999tGvfvUr/elPf+puEwEAgD7kzTff1KRJk7T99ttr5syZGjp0qJYvX663335bd9xxh77//e8XusRes2DBAs2aNUuHHXaYRo4c2eX7ff75520uNthce+yxhy6//HJJUmNjoz799FM99thjuu+++3TZZZfp17/+dZv1m5ub5XZ/fbp60aJFWrp0qe677z6dd955ueUvvPCCGhsbddNNN+mb3/xmj9Xbn91xxx0aNWqUJk2a1O62GTNm6Oijj263fM8999wSpW2WOXPmaOTIkfrXv/6lhQsXauzYsYUuqUuefvpp3XLLLTrxxBN15plnKpPJ6E9/+pMmT56s+++/X2effXZu3aFDh+qEE07QbbfdpuOPP76AVQPoKoJVAHrNaaed1ubvt99+W/PmzWu3fFMYY5RIJHIHuAthyJAh7V7LL37xC1VUVGzwNTqOo1Qq1eFBZPQNLpdLLper0GVsMU888YSy2azuv/9+HX744Xr11Vc1ceLEjd4vFosN+KuCAABA7zjqqKO0zz775P4+99xzNWTIEP3lL3/plWDVpjrkkEM0derUQpfRZ2xqHzAejysYDPZmaW088MADOv744zvsk+24446d1uv1enu7tD7lX//6lx5++GH98pe/1BVXXCFJOuOMM7Trrrvqyiuv1JtvvtnpfVOplK699lodeuihmjdvXu7CjQMPPFDHHXec7rvvvg5PbN57771avny5zjvvPN1xxx3tbr/rrrs0bNgw/eMf/8hdCHPBBRdo3LhxevDBB3PBqtGjR2v06NFt7tvc3KwLL7xQhx9+eLtRyKZPn67rr79ev/vd7xQOh7vRSgAAoC+5+eabVVxcrHfffbfdRdOVlZWFKaoPWv/8Sk9fXDx8+PB2+9O33HKLTj31VN1+++3aYYcd9L3vfS93W/4+eev71Nn7t6GL4burPx/fTqfTmjNnjr773e92ePtee+3V7XNxGzrvlkgk5PV6NyuE15X2Xrx4sd588009+eSTuuCCCzRnzhxdf/31G33sTCYjx3EK2mebNGmSli1bpoqKityy7373u9pjjz103XXXtQlWSS19kGnTpumrr75q13cB0PcwFSCAgnrggQd0+OGHa/DgwfL5fNpll100e/bsduuNHDlSxx57rF588UXts88+CgQCuueeeyRJS5cu1fHHH69QKKTBgwfrsssu04svvtjhFBPvvPOOvvWtb6m4uFjBYFATJ07UG2+8kbv9hhtu0I9+9CNJ0qhRo3LDo27O8LmWZeniiy/WnDlzNH78ePl8Pr3wwguSpJUrV+qcc87RkCFD5PP5NH78eN1///3tHiOZTOr666/X2LFj5fP5tN122+nKK69UMpnc6PO/9tprmjZtmrbffvvcfS+77DI1Nze3We+ss85SOBzWypUrdeKJJyocDmvQoEG64oorlM1m26xbX1+vs846S8XFxSopKdGZZ57Z6/OZt07lkP9etE7Dsv57fdhhh2nXXXfVf//7X02cOFHBYFBjx47NTT/4z3/+UxMmTFAgENBOO+3UbijWjp6rdRt8/fXXtd9++8nv92v06NHtrmiura3VFVdcod12203hcFhFRUU66qij2kwr8corr+RGNjj77LNz29mDDz6YW2dj22qr119/Xfvuu6/8fr/GjBmT+1x0x5w5czR58mRNmjRJO++8c5tpMfLb5J///KcuvPBCDR48WNtuu23u9ueff16HHHKIQqGQIpGIjjnmGH3yySdtHuO///2vzjrrLI0ePVp+v19Dhw7VOeeco5qamm7XDAAABpaSkhIFAoE2VzJLLRct/OY3v9H48ePl9/s1ZMgQXXDBBaqrq2uz3nvvvacpU6aooqJCgUBAo0aN0jnnnCOpZaqEQYMGSZJmzZqV2ze74YYbNrvuXXfdtcOrhx3H0fDhw9uEsmKxmC6//HJtt9128vl82mmnnXTbbbfJGNPp47/33nuyLEt//OMf293W2if629/+llvW1f7HihUrdOKJJ7bpY3Wl79EVrfvq//73v3XooYcqGAzmpq7oTr/nz3/+s/bee28FAgGVlZXplFNO0fLlyzf6/IsXL9Z///vfTbrK/bDDDsuNaLaxffrW17lgwQJNmjRJwWBQw4cP16233trucbv6uufNm6eDDz5YJSUlCofD2mmnndpM+yFJd955p8aPH69gMKjS0lLts88+mjt3bpt1PvvsMy1btmyjr/fxxx+Xy+XS+eefn1vm9/t17rnn6q233tpge3/88ceqr6/XySef3GY03GOPPVbhcLjD6TJra2v1k5/8RDfeeGOnJ8yi0ahKS0vbnAB0u925z/aGPPvss2psbNT//M//tLtt8uTJisVi3ZrmEAAA9D2LFi3S+PHjO9yXGDx4cO7fEydO1O67797hY+y0006aMmWKpK+nVbvtttv029/+VqNHj1YwGNSRRx6p5cuXyxijm266Sdtuu60CgYBOOOEE1dbWtnm81uPKr7zySu7cxm677ZY7nv3kk09qt912k9/v1957763333+/XU2fffaZpk6dqrKyMvn9fu2zzz5tphB78MEHNW3aNEkt4Y78Kbg3dH5l5MiROuuss9o8X319vS677DKNHDlSPp9P2267bW6E0E0RCAT00EMPqaysTDfffHObPs76fa+zzjord8HvtGnTZFlWbh/8zDPPlCTtu+++siyrTc1dOZbeOtrpggULdOqpp6q0tLTNCKxd6V90Zx8/kUjohhtu0I477ii/369hw4bppJNO0qJFi3LrdLU/25HXX39d1dXVmzV6V2fbRes5l4cfflg/+clPNHz4cAWDQUWjUUnSY489lmur1oEGVq5c2eaxW883LVq0SEcffbQikUiH++H55syZo9LSUh1zzDGaOnVqh+cq1v9c/uY3v9GYMWPk8/m0YMECSRv/vEhdO4/TatmyZfrss882Wvv48ePbhKokyefz6eijj9aKFSvU2NjY5rbW9+7pp5/e6GMDKDxGrAJQULNnz9b48eN1/PHHy+1269lnn9WFF14ox3F00UUXtVn3888/14wZM3TBBRdo5syZ2mmnnRSLxXT44Ydr9erVuvTSSzV06FDNnTtX8+fPb/dc//jHP3TUUUdp77331vXXXy/btnPBrtdee0377befTjrpJH3xxRf6y1/+ottvvz23E9R6omVT/eMf/9Cjjz6qiy++WBUVFRo5cqTWrl2r/fffPxe8GjRokJ5//nmde+65ikaj+sEPfiCpZef6+OOP1+uvv67zzz9fO++8sz766CPdfvvt+uKLL/TXv/51g8/92GOPKR6P63vf+57Ky8v1r3/9S3feeadWrFihxx57rM262WxWU6ZM0YQJE3Tbbbfp5Zdf1q9+9SuNGTMmdxWJMUYnnHCCXn/9dX33u9/VzjvvrKeeeirXsekr6urqdOyxx+qUU07RtGnTNHv2bJ1yyimaM2eOfvCDH+i73/2uTj31VP3yl7/U1KlTtXz5ckUikQ0+5sKFCzV16lSde+65OvPMM3X//ffrrLPO0t57763x48dLkr766iv99a9/1bRp0zRq1CitXbtW99xzjyZOnKgFCxZom2220c4776wbb7xR1113nc4//3wdcsghklqu3pa6tq1K0kcffaQjjzxSgwYN0g033KBMJqPrr79eQ4YM6XI7rVq1SvPnz8+djJsxY4Zuv/123XXXXR1e3XHhhRdq0KBBuu6663JTczz00EM688wzNWXKFN1yyy2Kx+OaPXu2Dj74YL3//vu5oafnzZunr776SmeffbaGDh2qTz75RPfee68++eQTvf3220w/CAAAchoaGlRdXS1jjCorK3XnnXeqqamp3RW3F1xwgR588EGdffbZuuSSS7R48WLdddddev/99/XGG2/I4/GosrIyt8909dVXq6SkREuWLNGTTz4pqWVff/bs2fre976nb3/72zrppJMkSd/4xjc2WmdjY2OHJxfKy8tlWZZOPvlk3XDDDVqzZk2bEXJef/11rVq1Sqeccoqkln3s448/XvPnz9e5556rPfbYQy+++KJ+9KMfaeXKlbr99ts7fP599tlHo0eP1qOPPtpuf/yRRx5RaWlp7qRQV/sfzc3NOuKII7Rs2TJdcskl2mabbfTQQw/pH//4x0bbo6tqamp01FFH6ZRTTtFpp52mIUOGdKvfc/PNN+unP/2ppk+frvPOO09VVVW68847deihh+r999/f4FXsraMs7bXXXh3enkgk2r2nkUik3ZX8G9unl1r6JN/61rd00kknafr06Xr88cd11VVXabfddtNRRx0lqev9vU8++UTHHnusvvGNb+jGG2+Uz+fTwoUL25wwuu+++3TJJZdo6tSpuvTSS5VIJPTf//5X77zzjk499dQ2tU+cOLHdhUj53n//fe24444qKipqs7y1P/LBBx9ou+226/C+raGwjsJOgUBA77//vhzHaXPF+09/+lMNHTpUF1xwgW666aYOH/ewww7TLbfcop/+9Kc688wzZVmW5s6dq/fee0+PPvroBl/PnDlzFAgEcp/x9e2yyy4KBAJ644039O1vf3uDjwMAAPquESNG6K233tLHH3+sXXfdtdP1Tj/9dM2cObPdeu+++66++OIL/eQnP2mz/pw5c5RKpfT9739ftbW1uvXWWzV9+nQdfvjheuWVV3TVVVdp4cKFuvPOO3XFFVe0u3hh4cKFOvXUU3XBBRfotNNO02233abjjjtOd999t6699lpdeOGFkqSf//znmj59epvp+T755BMddNBBGj58uK6++mqFQiE9+uijOvHEE/XEE0/o29/+tg499FBdcskl+n//7//p2muvzU29vf4U3B2dX+lIU1OTDjnkEH366ac655xztNdee6m6ulrPPPOMVqxY0S440lXhcFjf/va39Yc//EELFizIHU9f3wUXXKDhw4frZz/7WW7a9dZj3TvttJPuvffe3LTxY8aMkdT1Y+mtpk2bph122EE/+9nPcgGv7vQvurKPn81mdeyxx+rvf/+7TjnlFF166aVqbGzUvHnz9PHHH+dq70p/tjNvvvmmLMvqdGq/eDzeYV+1pKSkzQVLG9oubrrpJnm9Xl1xxRVKJpPyer25evfdd1/9/Oc/19q1a3XHHXfojTfeaNdWmUxGU6ZM0cEHH6zbbrutS6MUz5kzRyeddJK8Xq9mzJih2bNn6913381d1LK+Bx54QIlEQueff758Pp/Kysq69HmRunYep9UZZ5yhf/7znxu86GlD1qxZo2Aw2O71FxcXa8yYMXrjjTdyI+8C6MMMAGwhF110kcn/2onH4+3WmzJlihk9enSbZSNGjDCSzAsvvNBm+a9+9Ssjyfz1r3/NLWtubjbjxo0zksz8+fONMcY4jmN22GEHM2XKFOM4TpvnHzVqlJk8eXJu2S9/+UsjySxevLjbr3H8+PFm4sSJbZZJMrZtm08++aTN8nPPPdcMGzbMVFdXt1l+yimnmOLi4lzbPPTQQ8a2bfPaa6+1We/uu+82kswbb7yxwZo6auOf//znxrIss3Tp0tyyM88800gyN954Y5t199xzT7P33nvn/v7rX/9qJJlbb701tyyTyZhDDjnESDIPPPDABuuZP3++kWQee+yx3LIHHnigXZtPnDixTVt2tM76j9f6XrfeV5KZO3dubtlnn32Wey/efvvt3PIXX3yxXd0dPVfrNvjqq6/mllVWVhqfz2cuv/zy3LJEImGy2WybGhcvXmx8Pl+btn333Xc7bK/ubKsnnnii8fv9bd7HBQsWGJfL1e6z1pnbbrvNBAIBE41GjTHGfPHFF0aSeeqpp9qs19omBx98sMlkMrnljY2NpqSkxMycObPN+mvWrDHFxcVtlne0Lf7lL39p164AAGDgat3nyP/x+XzmwQcfbLPua6+9ZiSZOXPmtFn+wgsvtFn+1FNPGUnm3Xff7fR5q6qqjCRz/fXXd6nO1n3Qzn5Wr15tjDHm888/N5LMnXfe2eb+F154oQmHw7n9o9Z97P/93/9ts97UqVONZVlm4cKFuWUjRowwZ555Zu7va665xng8HlNbW5tblkwmTUlJiTnnnHNyy7ra//jNb35jJJlHH300t04sFjNjx45tt9+9MR31AVv31e++++42y7va71myZIlxuVzm5ptvbrPeRx99ZNxud7vl+X7yk58YSaaxsbHdbZ29n6377Pl9lM726dd/nX/6059yy5LJpBk6dKj5zne+0+3XffvttxtJpqqqqtPXdsIJJ5jx48dv8PW3vs78fmtHxo8fbw4//PB2yz/55JMO38P1VVVVGcuyzLnnnttmeWu/TFKbbfHDDz80LpfLvPjii8YYY66//voOX29TU5OZPn26sSwr9zjBYLDNMYGO1NTUGK/Xa6ZPn97pOjvuuKM56qijNvg4AACgb3vppZeMy+UyLpfLHHDAAebKK680L774okmlUm3Wq6+vN36/31x11VVtll9yySUmFAqZpqYmY0zLcV1JZtCgQaa+vj633jXXXGMkmd13392k0+nc8hkzZhiv12sSiURuWetx5TfffDO3rPWYdCAQaHNs95577mm3z33EEUeY3Xbbrc1jOo5jDjzwQLPDDjvklj322GOd7q93dn6l9bb1+xfXXXedkWSefPLJduuuf7y6IyNGjDDHHHNMp7e37tM+/fTTuWX5/bCOzh8Y83Vfcf1+XXeOpbfuX86YMaPN43anf9HVffz777/fSDK//vWv27VBa51d7c925rTTTjPl5eXtlrdus539vPXWW7l1O9suWt+D0aNHtzmmn0qlzODBg82uu+5qmpubc8v/9re/GUnmuuuuyy1rPd909dVXb/B1rO+9994zksy8efOMMS1tte2225pLL720w9dYVFRkKisr29zW1c9LV8/jGPP1+74pvvzyS+P3+83pp5/e4e1HHnmk2XnnnTfpsQFsWUwFCKCg1r96tfWq9IkTJ+qrr75SQ0NDm3VHjRqVu9q61QsvvKDhw4fr+OOPzy3z+/2aOXNmm/U++OADffnllzr11FNVU1Oj6upqVVdXKxaL6YgjjtCrr74qx3F64RW2mDhxonbZZZfc38YYPfHEEzruuONkjMnVU11drSlTpqihoUH/+c9/JLWMOLXzzjtr3LhxbdY7/PDDJanD0bnWt34bx2IxVVdX68ADD5QxpsNhhfPn5D7kkEP01Vdf5f5+7rnn5Ha728yD7nK59P3vf78bLdL7wuFwbgQAqeWKlpKSEu28886aMGFCbnnrv9d/jZ3ZZZddcleiSy2jG+y0005t7uvz+XJXE2WzWdXU1OSm6Wh9Tzekq9tqNpvViy++qBNPPFHbb7997v4777xzu8/JhsyZM0fHHHNMbrSuHXbYQXvvvXeHQ+xK0syZM+VyuXJ/z5s3T/X19ZoxY0ab7dPlcmnChAltts/1t8XWkQD2339/SepS2wAAgIHjt7/9rebNm6d58+bpz3/+syZNmqTzzjsvN8qU1LKfXFxcrMmTJ7fZD9l7770VDodz+yGtV8z+7W9/Uzqd7tE6r7vuulyd6/+UlZVJknbccUftscceeuSRR3L3yWazevzxx3Xcccfl9o+ee+45uVwuXXLJJW0e//LLL5cxRs8//3ynNZx88slKp9Nt2uall17KTcMmda//8dxzz2nYsGFtpikMBoNtpoPbXD6fT2effXabZV3t9zz55JNyHEfTp09vs97QoUO1ww47bLR/VFNTI7fbrXA43OHtJ5xwQrv3szv71+sLh8NtRlnzer3ab7/92vQfuvq6W7fjp59+utO+a0lJiVasWKF33313g3UZYzY6WpXUMnpZ/khdUkufu/X2zlRUVGj69On64x//qF/96lf66quv9Nprr+nkk0/OXXm//v0vueQSHXXUUTryyCM3WJPP59OOO+6oqVOn6i9/+Yv+/Oc/a5999tFpp52mt99+u9P7Pf7440qlUhucfqS0tHSTp7cBAAB9w+TJk/XWW2/p+OOP14cffqhbb71VU6ZM0fDhw9tMBVZcXKwTTjhBf/nLX3Kj0GSzWT3yyCO5KbHXN23aNBUXF+f+bj2mfNppp7UZ/WfChAlKpVLtpkXbZZdddMABB7S7/+GHH97m2G7+sera2lr94x//0PTp03Oj5VZXV6umpkZTpkzRl19+2e65OtPR+ZWOPPHEE9p99907HMVzc2ccaN0Hz58SbVNtynmf/PMf3e1fdGUf/4knnlBFRUWH50xa27Cr/dnO1NTUqLS0tNPbzz///A77quufp5I2vF2ceeaZbY7pv/fee6qsrNSFF16Y6xNI0jHHHKNx48bp//7v/9o9xvrnkTZmzpw5GjJkiCZNmiRJuVGgH374YWWz2Xbrf+c732kz20x3Pi/dOY/zyiuvbNJoVfF4XNOmTVMgENAvfvGLDtehDwL0H0wFCKCg3njjDV1//fV66623FI/H29zW0NDQprMyatSodvdfunSpxowZ026HfuzYsW3+/vLLLyVpg9PVNTQ0bHBHdHPk115VVaX6+nrde++9uvfeezu8T2VlpaSW2j/99NNOpyNsXa8zy5Yt03XXXadnnnmm3dzc+eE1v9/f7nlKS0vb3G/p0qUaNmxYuxMRnQ0dXCjbbrttu+2iuLi43VQVrdtYV+YtX7+T2yq/fRzH0R133KHf/e53Wrx4cZsd/vLy8o0+R1e31WQyqebmZu2www7tbt9pp5303HPPbfS5Pv30U73//vs644wztHDhwtzyww47TL/97W8VjUbbTfuRvy231tt64iff+vevra3VrFmz9PDDD7fbbvO3RQAAMLDtt99+2meffXJ/z5gxQ3vuuacuvvhiHXvssfJ6vfryyy/V0NCgwYMHd/gYrfsbEydO1He+8x3NmjVLt99+uw477DCdeOKJOvXUUzsMjXTHbrvtpm9+85sbXOfkk0/Wtddeq5UrV2r48OF65ZVXVFlZmQs9SS372Ntss027qalbp+5YunRpp4+/++67a9y4cXrkkUd07rnnSmqZBrCioiK3j9ad/sfSpUs1duzYdvvSPbm/P3z48HbTTne13/Pll1/KGNPhfrCkDU6X0RXbbrvtRt/T7jxWfjuWlpbqv//9b+7vrr7uk08+Wb///e913nnn6eqrr9YRRxyhk046SVOnTs2dELjqqqv08ssva7/99tPYsWN15JFH6tRTT9VBBx20SfUHAoHclH7rSyQSuds35J577lFzc7OuuOIKXXHFFZJaTj6OGTNGTz75ZK5P+cgjj+jNN9/Uxx9/vNGaLr74Yr399tv6z3/+k3vd06dP1/jx43XppZfqnXfe6fB+c+bMUVlZWW56lo4YY5ieHACArcC+++6rJ598UqlUSh9++KGeeuop3X777Zo6dao++OCDXLDkjDPO0COPPKLXXntNhx56qF5++WWtXbtWp59+ervHzD8u3HpMuavHmjf1/gsXLpQxRj/96U/105/+tMPXW1lZqeHDh3fSGl/r6PxKRxYtWqTvfOc7XVq3u5qamiSpXb9nU23KeZ+Ojm93p3/RlX38RYsWaaeddmoTuuuo9q70ZzdkQ2GfHXbYoUv9mg1tF/m3tfZLO+objhs3Tq+//nqbZW63W9tuu+1Ga5Bawk0PP/ywJk2apMWLF+eWT5gwQb/61a/097//vd1FGPn1defzsrnncbryek455RQtWLBAzz//fJupBddHHwToPwhWASiYRYsW6YgjjtC4ceP061//Wtttt528Xq+ee+453X777e2uJNjYQdsNaX2sX/7yl9pjjz06XKezK5Z7Qn7trfWcdtppne70f+Mb38itu9tuu+nXv/51h+vld77Wl81mNXnyZNXW1uqqq67SuHHjFAqFtHLlSp111lnt2nj9kYj6ms52Lju6UkHq/LV0trwrVxx05b4/+9nP9NOf/lTnnHOObrrpJpWVlcm2bf3gBz/o0qhoXd1WOzrB0V1//vOfJUmXXXZZh3N4P/HEE+1GEuhsW37ooYc0dOjQdo+xfudx+vTpevPNN/WjH/1Ie+yxh8LhsBzH0be+9a1eHTEOAAD0f7Zta9KkSbrjjjv05Zdfavz48XIcR4MHD+50pM3WoIplWXr88cf19ttv69lnn9WLL76oc845R7/61a/09ttv92o/QGoJxFxzzTV67LHH9IMf/ECPPvqoiouL9a1vfatHn+Pmm29WdXW1IpGInnnmGc2YMSO3L9ad/seW0FHfrqv9HsdxZFmWnn/++Q73zzf2fpaXlyuTyaixsbHHTuh0piv9h66+7kAgoFdffVXz58/X//3f/+mFF17QI488osMPP1wvvfSSXC6Xdt55Z33++ef629/+phdeeEFPPPGEfve73+m6667TrFmzul3/sGHDOhwBYfXq1ZLU6cmBVsXFxXr66ae1bNkyLVmyRCNGjNCIESN04IEHatCgQblRuH70ox9p2rRp8nq9WrJkiSSpvr5ekrR8+XKlUilts802SqVS+sMf/qArr7wyF6qSWk52HXXUUbrrrruUSqXahfaWLVum1157Teeff/4Gg3d1dXWdnlADAAD9j9fr1b777qt9991XO+64o84++2w99thjuv766yVJU6ZM0ZAhQ/TnP/9Zhx56qP785z9r6NChHYZRNvdY86bev3U//oorruh0VKH8i8w7sznnV3pKa5C+qzVvzKac9+no+HZ3+hebc34h/3m70p/tTHl5eZcuFt+YDW0Xm7vNrD8q1Mb84x//0OrVq/Xwww/r4Ycfbnf7nDlz2gWrOjtX0ZXPy+aex9mYmTNn6m9/+5vmzJnT6UXpUksfpKKiYrOfD0DvI1gFoGCeffZZJZNJPfPMM22u2NjYEKfrGzFihBYsWNAu1b3+6DuSNGbMGEkto+dsLKW/JdLhgwYNUiQSUTab3Wg9Y8aM0Ycffqgjjjii27V99NFH+uKLL/THP/5RZ5xxRm75vHnzNqluqaXN//73v6upqalNp+Lzzz/f5MfsitarSloPsLfa0NX7hfD4449r0qRJ+sMf/tBmeX19fZsd5M7ey65uq4MGDVIgEMhdlbO+rrwXxhjNnTtXkyZN0oUXXtju9ptuuklz5sxpF6zqrN7BgwdvsN66ujr9/e9/16xZs3TdddfllndUPwAAQEcymYykr69yHjNmjF5++WUddNBBXTrgu//++2v//ffXzTffrLlz5+p//ud/9PDDD+u8887r1T7AqFGjtN9+++mRRx7RxRdfrCeffFInnnhim9GyRowYoZdffrld2Oezzz7L3b4hJ598smbNmqUnnnhCQ4YMUTQabTMtdnf6HyNGjNDHH3/cro/V2/v7Xe33jBkzRsYYjRo1SjvuuGO3n2fcuHGSpMWLF292mKwntpvu9Pds29YRRxyhI444Qr/+9a/1s5/9TD/+8Y81f/783PsaCoV08skn6+STT1YqldJJJ52km2++Wddcc02b6Tq6Yo899tD8+fPbjWTbOipUZyev8m2//fa5Pn99fb3+/e9/txkFYfny5Zo7d67mzp3b7r577bWXdt99d33wwQeqqalRJpPp8OKadDqdmzI9X+sUPxuaBjCTyWj58uU6/vjju/SaAABA/9I6Gm5rQFxqCciceuqpevDBB3XLLbfor3/9q2bOnNmnLj4ePXq0pJYg+ZY6rzFmzJgujSTaXU1NTXrqqae03Xbb5Ubm3VzdOe+zocfYnP5FZ4/5zjvvKJ1Odxrs725/Nt+4ceM0Z86cdjO/9KbWfunnn3/eLiz0+eefb7TfuiFz5szR4MGD9dvf/rbdbU8++aSeeuop3X333Rtsq+58Xrp6HmdT/OhHP9IDDzyg3/zmN5oxY8YG1128eLF23333zXo+AFtG12KiANALWjso6yf5Gxoa9MADD3T5MaZMmaKVK1e2mR89kUjovvvua7Pe3nvvrTFjxui2227LnYhZX1VVVe7frfOn5wd4epLL5dJ3vvMdPfHEEx12UtavZ/r06Vq5cmW71yRJzc3NisViG3weqW0bG2N0xx13bHLtRx99tDKZjGbPnp1bls1mdeedd27yY3ZFayfp1VdfbfO8nU1lUigul6vd1SmPPfZYuyu9O9vOurqtulwuTZkyRX/961+1bNmy3O2ffvqpXnzxxY3W+cYbb2jJkiU6++yzNXXq1HY/J598subPn69Vq1Zt8HGmTJmioqIi/exnP1M6nd5gvVL7K3d+85vfbLRWAACAdDqtl156SV6vN3cQfvr06cpms7rpppvarZ/JZHL7WXV1de32QVoDIa2jgAaDQUm91wc4+eST9fbbb+v+++9XdXV1m2kApZZ97Gw2q7vuuqvN8ttvv12WZW1w+jKpZcrA3XbbTY888ogeeeQRDRs2TIceemju9u70P44++mitWrVKjz/+eG5ZPB7v9f3urvZ7TjrpJLlcLs2aNavd+2qMUU1NzQaf54ADDpAkvffee5tdc0/0Hbv6umtra9vdnr8d5792r9erXXbZRcaYNvvqn332WZs+RGemTp3ars+VTCb1wAMPaMKECW1GT162bFkuCLgh11xzjTKZTJsRc5966ql2P62fkT/96U+6/fbbJbVczFFSUqKnnnpKqVQqd/+mpiY9++yzGjduXIcnWubOnavtt99eBx98cKd1LViwQIlEQgceeOBGXwMAAOi75s+f3+HIQc8995yk9lOYnX766aqrq9MFF1ygpqYmnXbaaVukzq4aPHiwDjvsMN1zzz1tQmGteuO8xne+853cFIr5ujsqU6vm5madfvrpqq2t1Y9//OMeC4F157xPZza3f9GR73znO6qurm7Xv2t9TKnr/dnOHHDAATLG6N///ne369tU++yzjwYPHqy77767zYwazz//vD799FMdc8wxm/S4zc3NevLJJ3Xsscd2eK7i4osvVmNjY5vzgB3pzuelq+dxpK73daSW0dNuu+02XXvttbr00ks3uG5DQ4MWLVpEHwToJxixCkDBHHnkkfJ6vTruuONyHZf77rtPgwcP7nCnpyMXXHCB7rrrLs2YMUOXXnqphg0bpjlz5uSuxG3dQbdtW7///e911FFHafz48Tr77LM1fPhwrVy5UvPnz1dRUZGeffZZSS0745L04x//WKeccoo8Ho+OO+64XMekp/ziF7/Q/PnzNWHCBM2cOVO77LKLamtr9Z///Ecvv/xy7sD56aefrkcffVTf/e53NX/+fB100EHKZrP67LPP9Oijj+rFF1/MXXGTb9y4cRozZoyuuOIKrVy5UkVFRXriiSc2a4jY4447TgcddJCuvvpqLVmyRLvssouefPJJNTQ0bPJjdsX48eO1//7765prrlFtba3Kysr08MMP50Yu6CuOPfZY3XjjjTr77LN14IEH6qOPPtKcOXNyV0u0GjNmjEpKSnT33XcrEokoFAppwoQJGjVqVJe31VmzZumFF17QIYccogsvvFCZTEZ33nmnxo8f32ZO947MmTNHLper087O8ccfrx//+Md6+OGH9cMf/rDTxykqKtLs2bN1+umna6+99tIpp5yiQYMGadmyZfq///s/HXTQQbrrrrtUVFSkQw89VLfeeqvS6bSGDx+ul156qc186QAAAK2ef/753IHLyspKzZ07V19++aWuvvrq3Mg5EydO1AUXXKCf//zn+uCDD3TkkUfK4/Hoyy+/1GOPPaY77rhDU6dO1R//+Ef97ne/07e//W2NGTNGjY2Nuu+++1RUVKSjjz5aUssUArvssoseeeQR7bjjjiorK9Ouu+6qXXfddYN1vvbaa0okEu2Wf+Mb32gzGtL06dN1xRVX6IorrlBZWVm7q2ePO+44TZo0ST/+8Y+1ZMkS7b777nrppZf09NNP6wc/+EHuIoMNOfnkk3XdddfJ7/fr3HPPbTflQlf7HzNnztRdd92lM844Q//+9781bNgwPfTQQ7nwWW/par9nzJgx+t///V9dc801WrJkiU488URFIhEtXrxYTz31lM4//3xdccUVnT7P6NGjteuuu+rll1/WOeecs1k1b2ifvqdf94033qhXX31VxxxzjEaMGKHKykr97ne/07bbbpsLDB155JEaOnSoDjroIA0ZMkSffvqp7rrrLh1zzDFtRkLbeeedNXHiRL3yyisbrG3ChAmaNm2arrnmGlVWVmrs2LH64x//qCVLlrS7svuMM87QP//5zzYnJ37xi1/o448/1oQJE+R2u/XXv/5VL730kv73f/9X++67b269E088sd1zf/DBB5Kko446KnfFuMvl0hVXXKGf/OQn2n///XXGGWcom83qD3/4g1asWJGb6nx9H3/8sf773//q6quv3uAJvHnz5ikYDGry5MkbbBMAANC3ff/731c8Hte3v/1tjRs3TqlUSm+++aYeeeQRjRw5st3o/Hvuuad23XVXPfbYY9p555211157Fajyzv32t7/VwQcfrN12200zZ87U6NGjtXbtWr311ltasWKFPvzwQ0ktoXuXy6VbbrlFDQ0N8vl8OvzwwzV48OBuPd+PfvQjPf7445o2bZrOOecc7b333qqtrdUzzzyju+++e6Oj66xcuTK3X9bU1KQFCxboscce05o1a3T55Zfrggsu2LSG6EB3zvt0ZnP7Fx0544wz9Kc//Uk//OEP9a9//UuHHHKIYrGYXn75ZV144YU64YQTutyf7czBBx+s8vJyvfzyyx1ONfef//ynw/3jMWPG5C426S6Px6NbbrlFZ599tiZOnKgZM2Zo7dq1uuOOOzRy5Mg2F090xzPPPKPGxsZOR4/df//9NWjQIM2ZM6fdRUr5uvp56ep5HKnjvk5HnnrqKV155ZXaYYcdtPPOO7dr/8mTJ2vIkCG5v19++WUZY3TCCSds8HEB9BEGALaQiy66yOR/7TzzzDPmG9/4hvH7/WbkyJHmlltuMffff7+RZBYvXpxbb8SIEeaYY47p8HG/+uorc8wxx5hAIGAGDRpkLr/8cvPEE08YSebtt99us+77779vTjrpJFNeXm58Pp8ZMWKEmT59uvn73//eZr2bbrrJDB8+3Ni23a6WDRk/fryZOHFim2WSzEUXXdTh+mvXrjUXXXSR2W677YzH4zFDhw41RxxxhLn33nvbrJdKpcwtt9xixo8fb3w+nyktLTV77723mTVrlmloaNhgTQsWLDDf/OY3TTgcNhUVFWbmzJnmww8/NJLMAw88kFvvzDPPNKFQqN39r7/++nbvW01NjTn99NNNUVGRKS4uNqeffrp5//332z1mR+bPn28kmcceeyy37IEHHmjXzhMnTmzXlosWLTLf/OY3jc/nM0OGDDHXXnutmTdvnpFk5s+f3+a+48ePb/fcnW1H+e9RR/V0dt/8OhOJhLn88svNsGHDTCAQMAcddJB56623Onw9Tz/9tNlll12M2+1u13Zd3Vb/+c9/mr333tt4vV4zevRoc/fdd3f4nq0vlUqZ8vJyc8ghh3S6jjHGjBo1yuy5555t2uTdd9/tcN358+ebKVOmmOLiYuP3+82YMWPMWWedZd57773cOitWrDDf/va3TUlJiSkuLjbTpk0zq1atMpLM9ddfv8FaAADAwNC6z7H+j9/vN3vssYeZPXu2cRyn3X3uvfdes/fee5tAIGAikYjZbbfdzJVXXmlWrVpljDHmP//5j5kxY4bZfvvtjc/nM4MHDzbHHntsm/0UY4x58803c/tVG9s/ad2n7eyno/sedNBBRpI577zzOnzMxsZGc9lll5ltttnGeDwes8MOO5hf/vKX7V7ziBEjzJlnntnu/l9++WXu+V9//fUOn6Or/Y+lS5ea448/3gSDQVNRUWEuvfRS88ILL7Tb796YjvqAne2rG9O9fs8TTzxhDj74YBMKhUwoFDLjxo0zF110kfn88883Wtevf/1rEw6HTTweb7N8Q3231tq7uk/f2es888wzzYgRI7r9uv/+97+bE044wWyzzTbG6/WabbbZxsyYMcN88cUXuce55557zKGHHprrQ4wZM8b86Ec/atd2ktq9js40NzebK664wgwdOtT4fD6z7777mhdeeKHDtsl/r//2t7+Z/fbbz0QiERMMBs3+++9vHn300S49b2ufpqqqqt1tc+bMMfvtt58pKSkxgUDATJgwwTz++OMdPs7VV19t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a1KFft3ViYiIiIiIiIiIiIiIiIg8koJVIiIiQBkFDDZ7DNe7NIZTOrsjXnitoHvnkCwJyJoxVkGgpxbkJdE4I8xLimbC6OpVXr8Gk06kcX8iIiIiIiIiIiIiIiIishAUrBIREXkH5xkmvSZpt81+6/3csUe0dw5pDqd4ZUUZBuSNiDIOFBB6J+cI04J4ms/WUxSQtRN2NrtMe2266VXSzh4YW3elIiIiIiIiIiIiIiIiIiJPRcEqERGRR6gaDQ67qxxc6hJPMpJRSmt/RDJKaQ4mWM8jb0bkSQTe8oWsTGWJpjlRWmCso0hCRv0249UWaTshb8y6U3nOg7TuakVERERERERERERERERETkbBKhERkSdwniFtJ6TthMOtHmFazMJVRxOaR2O6e0MA8iQkb0TY4OKODPSLkmiaE2YlGEPWiDi4ssq01yRtxZRxWHeJIiIiIiIiIiIiIiIiIiKnQsEqERGRkzCGohFRNCKGG138vCQZZySDKe2DEc3BFK+ajbsrA58yDiijYCHDVn5REuSzm19acI4qmo1CPLi8StZpkLbihfxvExERERERERERERERERF5EgWrREREnkMVBYyjgPFqi/2r/eNuTgXRNCcZpsSTbCHCVo8KUZVhwLjfJm03KJKQIp515XJLOPpQRERERERERERERERERJaLglUiIiKnxPkeWTshayf3f+aVFWFa3A9bNYYp0b2wVVmBMYDDGYP1PSrfx/reAzeeI8RkrMWrHn4zDnAOMFSR/9AQVZGEsxpERERERERERERERERERJaMglUiIiJnyAY+Wdt/eNgqL/HKCr+0+Pnsz0FW4Bd29ndVhV85sPY4gAW44/87DmTBO74eh6Qw7vh+BucZbOBhvVlIK08iyngWmqoiHxv4VL43+5lCVCIiIiIiIiIiIiIiIiIi9ylYJSIics7uh60e8femsviVvR+68soKv7IY647DU7M4Fc7NMlQGMGaWpeL4e89Q+d4sOBX697/XCD8RERERERERERERERERkaejYJWIiMiccb5H6XsQ6WNaRERERERERERERERERKQumvcjIiIiIiIiIiIiIiIiIiIiIiLyLgpWiYiIiIiIiIiIiIiIiIiIiIiIvIuCVSIiIiIiIiIiIiIiIiIiIiIiIu9yLsGqLMv4xm/8RowxfOELXziPRYqIiIiIyBLQvoaIiIiI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",
      "text/plain": [
       "<Figure size 2400x800 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA18AAAIjCAYAAAD80aFnAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAZc5JREFUeJzt3Xlc1VXi//H3ZQcRcUFwQVFMzXIpTTK1zYWRhskt18kltSwpk6w0F7SmqGZSHHOpqbRf5mSL1WTqiKaWuTUuU43puKap4NIoCop4Ob8/+HLzCigQcj98ej0fDx5wz+fcz+d84HQ7b8+55zqMMUYAAAAAgGvKy9MNAAAAAIDfAsIXAAAAAJQDwhcAAAAAlAPCFwAAAACUA8IXAAAAAJQDwhcAAAAAlAPCFwAAAACUA8IXAAAAAJQDwhcAAAAAlAPCFwCUMYfDoSlTpni6GShHBw4ckMPh0Pz58z3dFFRAvGYAvx2ELwCWMH/+fDkcDrevmjVr6q677tKyZcuu2XWzsrI0ZcoUrVmzplj116xZU6Cd+V/9+vUr9Dnr16/XlClTdOrUqbJruAdc/jcKCAhQ48aNlZCQoPT0dE837zdvyZIl+t3vfqfq1au7/jZjx47VyZMnPd20Iu3fv18JCQlq3LixgoKCFBQUpGbNmmnUqFH69ttvPd28MrV06VICFgD5eLoBAHCpZ599Vg0aNJAxRunp6Zo/f77i4uL02Wef6fe//32ZXy8rK0tTp06VJN15553Fft5jjz2mW265xa0sKipKknTu3Dn5+Pzy8rp+/XpNnTpVQ4YMUWho6K9tssfl/43Onz+vdevWac6cOVq6dKm+//57BQUFebp5HlG/fn2dO3dOvr6+Hrn+2LFj9corr6hly5Z6+umnVa1aNW3dulWvvvqq3nvvPa1atUpNmjTxSNuKsmTJEvXt21c+Pj4aOHCgWrZsKS8vL+3cuVOLFy/WnDlztH//ftWvX9/TTS0TS5cu1axZswoNYJe/ZgCwL/5LB2Ap3bp1U5s2bVyPhw0bpvDwcP3973+/JuGrtDp27KjevXsXeiwgIKCcW1O+Lv0bDR8+XNWrV9e0adP06aefqn///oU+JzMzU5UqVSqX9pXntfLlzwR6wt///ne98sor6tu3r9599115e3u7jg0ZMkR33XWX7rvvPm3durVcB/hX+jvs3btX/fr1U/369bVq1SrVqlXL7fhLL72k2bNny8vLugt0yrKf2f01A8AvrPuqBgCSQkNDFRgYWGDQmJubq5SUFN1www0KCAhQeHi4HnroIf3vf/9zq/evf/1LsbGxqlGjhgIDA9WgQQM98MADkvLepxMWFiZJmjp1qms53a9dGnTpOaZMmaInn3xSktSgQQPXNQ4cOOCqm5CQoE8++UQ33nij/P39dcMNN2j58uUFznv48GE98MADCg8Pd9V76623CtSbOXOmbrjhBgUFBalq1apq06aNFi5c6Dp+5swZPf7444qKipK/v79q1qypLl26aOvWraW637vvvltS3hIyKW/AHxwcrL179youLk6VK1fWwIEDJeUNWJ944glFRkbK399fTZo00V/+8hcZY9zOee7cOT322GOqUaOGKleurD/84Q86fPhwgb/PlClT5HA4tGPHDg0YMEBVq1ZVhw4dXMcXLFig1q1bKzAwUNWqVVO/fv106NAht2vt3r1bvXr1UkREhAICAlS3bl3169dPp0+fdtVJTU1Vhw4dFBoaquDgYDVp0kTPPPOM63hR7/n64osv1LFjR1WqVEmhoaG699579cMPP7jVyb+HPXv2uGZHq1SpoqFDhyorK+uqv/+pU6eqatWqev31192ClyS1bdtWTz/9tL777jt9+OGHkqSEhAQFBwcXeu7+/fsrIiJCTqfTVbZs2TLXPVSuXFn33HOP/vOf/7g970p/88K8/PLLyszM1Lx58woEL0ny8fHRY489psjISLfynTt3qnfv3qpWrZoCAgLUpk0b/eMf/3Crk7889uuvv1ZiYqLCwsJUqVIl9ejRQ8ePHy9wrV97f1999ZXuu+8+1atXT/7+/oqMjNSYMWN07tw5t+fPmjVLktyW7uYr7HVn27Zt6tatm0JCQhQcHKxOnTpp48aNpb7XK70WAig/zHwBsJTTp0/rxIkTMsbo2LFjmjlzps6ePas//vGPbvUeeughzZ8/X0OHDtVjjz2m/fv369VXX9W2bdv09ddfy9fXV8eOHVPXrl0VFhamcePGKTQ0VAcOHNDixYslSWFhYZozZ44efvhh9ejRQz179pQktWjR4qrtPHPmjE6cOOFWVq1atQL/Ut+zZ0/997//1d///ndNnz5dNWrUcF0737p167R48WI98sgjqly5sv7617+qV69eOnjwoKpXry5JSk9P16233uoKa2FhYVq2bJmGDRumjIwMPf7445Kkv/3tb3rsscfUu3dvjR49WufPn9e3336rTZs2acCAAZKkkSNH6sMPP1RCQoKaNWumkydPat26dfrhhx908803F/dP5bJ3715JcrVVki5evKjY2Fh16NBBf/nLXxQUFCRjjP7whz9o9erVGjZsmFq1aqV//vOfevLJJ3X48GFNnz7d9fwhQ4bo/fff1/33369bb71Va9eu1T333FNkG+677z5dd911euGFF1xB7vnnn9ekSZPUp08fDR8+XMePH9fMmTN1++23a9u2bQoNDdWFCxcUGxur7OxsPfroo4qIiNDhw4e1ZMkSnTp1SlWqVNF//vMf/f73v1eLFi307LPPyt/fX3v27NHXX399xd/LypUr1a1bNzVs2FBTpkzRuXPnNHPmTLVv315bt251LVPN16dPHzVo0EDJycnaunWr3njjDdWsWVMvvfRSkdfYvXu3du3apSFDhigkJKTQOoMGDVJSUpKWLFmifv36qW/fvpo1a5Y+//xz3Xfffa56WVlZ+uyzzzRkyBBXiHvnnXc0ePBgxcbG6qWXXlJWVpbmzJmjDh06aNu2bW73UNjfvChLlixRo0aNFBMTc8Xf4aX+85//qH379qpTp47GjRunSpUq6f3331f37t310UcfqUePHm71H330UVWtWlVJSUk6cOCAUlJSlJCQoEWLFrnqlMX9ffDBB8rKytLDDz+s6tWra/PmzZo5c6Z++uknffDBB5LyXq+OHDmi1NRUvfPOO8W6144dOyokJERPPfWUfH199dprr+nOO+/U2rVrC/zernavV3stBFCODABYwLx584ykAl/+/v5m/vz5bnW/+uorI8m8++67buXLly93K//444+NJPPNN98Ued3jx48bSSYpKalY7Vy9enWh7ZRk9u/fb4wxBc735z//2e34pSQZPz8/s2fPHlfZv//9byPJzJw501U2bNgwU6tWLXPixAm35/fr189UqVLFZGVlGWOMuffee80NN9xwxXuoUqWKGTVqVLHu91L5f6OVK1ea48ePm0OHDpn33nvPVK9e3QQGBpqffvrJGGPM4MGDjSQzbtw4t+d/8sknRpL505/+5Fbeu3dv43A4XL+DLVu2GEnm8ccfd6s3ZMiQAr/bpKQkI8n079/fre6BAweMt7e3ef75593Kv/vuO+Pj4+Mq37Ztm5FkPvjggyLve/r06UaSOX78eJF19u/fbySZefPmucpatWplatasaU6ePOkq+/e//228vLzMoEGDCtzDAw884HbOHj16mOrVqxd5TWN++Z1Onz79ivVCQkLMzTffbIwxJjc319SpU8f06tXLrc77779vJJkvv/zSGGPMmTNnTGhoqBkxYoRbvbS0NFOlShW38qL+5oU5ffq0kWS6d+9e4Nj//vc/c/z4cddXfr82xphOnTqZ5s2bm/Pnz7vKcnNzzW233Wauu+46V1l+P+3cubPJzc11lY8ZM8Z4e3ubU6dOlen9XdrGfMnJycbhcJgff/zRVTZq1ChT1LDr8n7dvXt34+fnZ/bu3esqO3LkiKlcubK5/fbbS3yvxXktBFA+WHYIwFJmzZql1NRUpaamasGCBbrrrrs0fPhwt3+h/eCDD1SlShV16dJFJ06ccH21bt1awcHBWr16tSS5NrdYsmSJcnJyyrSdkydPdrUz/ysiIqJU5+rcubOio6Ndj1u0aKGQkBDt27dPkmSM0UcffaT4+HgZY9zuOTY2VqdPn3YtGQwNDdVPP/2kb775psjrhYaGatOmTTpy5Eip2xsWFqbIyEj169dPwcHB+vjjj1WnTh23eg8//LDb46VLl8rb21uPPfaYW/kTTzwhY4xrV8v8JZePPPKIW71HH320yDaNHDnS7fHixYuVm5urPn36uP2+IiIidN1117n6SJUqVSRJ//znP4tc4pffjz799FPl5uYW2YZLHT16VNu3b9eQIUNUrVo1V3mLFi3UpUsXLV269Kr30LFjR508eVIZGRlFXufMmTOSpMqVK1+xPZUrV3adx+Fw6L777tPSpUt19uxZV51FixapTp06rmWbqampOnXqlPr37+/2O/T29lZMTIzrd3ipy//mhclvR3BwcIFjd955p8LCwlxf+Uv1fv75Z33xxRfq06ePa9b5xIkTOnnypGJjY7V7924dPnzY7VwPPvig29K+jh07yul06scffyzT+wsMDHT9nJmZqRMnTui2226TMUbbtm276u/jck6nUytWrFD37t3VsGFDV3mtWrU0YMAArVu3rkCfuNq9XsvXQgAlw7JDAJbStm1btw03+vfvr5tuukkJCQn6/e9/Lz8/P+3evVunT59WzZo1Cz3HsWPHJEl33HGHevXqpalTp2r69Om688471b17dw0YMED+/v6/qp3NmzdX586df9U58tWrV69AWdWqVV3vXzt+/LhOnTql119/Xa+//nqh58i/56efflorV65U27Zt1ahRI3Xt2lUDBgxQ+/btXXVffvllDR48WJGRkWrdurXi4uI0aNAgt4HelcyaNUuNGzeWj4+PwsPD1aRJkwLLLX18fFS3bl23sh9//FG1a9cuEBSuv/561/H8715eXmrQoIFbvUaNGhXZpsvr7t69W8YYXXfddYXWz9+VsEGDBkpMTNS0adP07rvvqmPHjvrDH/6gP/7xj65g1rdvX73xxhsaPny4xo0bp06dOqlnz57q3bt3kRtC5N9LYTsMXn/99frnP/9ZYMOGy/tB1apVJUn/+9//ilxSmP+7zA9hRTlz5ozbfy99+/ZVSkqK/vGPf2jAgAE6e/asli5dqoceesg1iN+9e7ekX97Td7nL21TY3/xKbb40+OV77bXXdObMGaWnp7stNd6zZ4+MMZo0aZImTZpU6HmPHTvm9g8AV/p9SmV3fwcPHtTkyZP1j3/8o8B7Ti9932BxHT9+XFlZWUX2ndzcXB06dEg33HCDq/xq93otXwsBlAzhC4CleXl56a677tKMGTO0e/du3XDDDcrNzVXNmjX17rvvFvqc/PdTORwOffjhh9q4caM+++wz/fOf/9QDDzygV155RRs3biz0X9494fJNEvKZ/3vvUv5syx//+EcNHjy40Lr571O7/vrrtWvXLi1ZskTLly/XRx99pNmzZ2vy5MmuLfX79Omjjh076uOPP9aKFSv05z//WS+99JIWL16sbt26XbW9lwfkwvj7+5frTnWXzj5Ieb8zh8OhZcuWFfr7vfRv/8orr2jIkCH69NNPtWLFCj322GNKTk7Wxo0bVbduXQUGBurLL7/U6tWr9fnnn2v58uVatGiR7r77bq1YsaLIv19JXa0fFCY/uF7pM7F+/PFHZWRkqFmzZq6yW2+9VVFRUXr//fc1YMAAffbZZzp37pz69u3rqpPf7955551CZ3Uv3wSnuH/zKlWqqFatWvr+++8LHMt/L1P+hjSXt2Xs2LGKjY0t9LyXh/Pi/nf1a+7P6XSqS5cu+vnnn/X000+radOmqlSpkg4fPqwhQ4YUe6b017ravVaU10Lgt4DwBcDyLl68KOmXfymPjo7WypUr1b59+wKD7sLceuutuvXWW/X8889r4cKFGjhwoN577z0NHz7cbanOtfJrrxEWFqbKlSvL6XQWa7atUqVK6tu3r/r27asLFy6oZ8+eev755zV+/HjXlta1atXSI488okceeUTHjh3TzTffrOeff75Y4au06tevr5UrV+rMmTNus187d+50Hc//npubq/3797vNXO3Zs6fY14qOjpYxRg0aNFDjxo2vWr958+Zq3ry5Jk6cqPXr16t9+/aaO3eu/vSnP0nK+0eATp06qVOnTpo2bZpeeOEFTZgwQatXry70b5J/L7t27SpwbOfOnapRo0aZbFPeuHFjNW7cWJ988olmzJhR6PLD//f//p8kFfiohj59+mjGjBnKyMjQokWLFBUVpVtvvdV1PH8pbM2aNctsljffPffcozfeeEObN29W27Ztr1o/f1bW19e3zNpSFvf33Xff6b///a/efvttDRo0yFWemppaoG5xXwfCwsIUFBRUZN/x8vIqsAtkcV3ptRBA+eA9XwAsLScnRytWrJCfn5/rX/n79Okjp9Op5557rkD9ixcv6tSpU5LyltxcPmvQqlUrSVJ2drYkuXYsy3/OtZA/yC7tNby9vdWrVy999NFHhc4WXLql9MmTJ92O+fn5qVmzZjLGKCcnR06ns8BSqJo1a6p27dqu38m1EhcXJ6fTqVdffdWtfPr06XI4HK7glz+zMXv2bLd6M2fOLPa1evbsKW9vb02dOrVAHzDGuH5PGRkZrnCfr3nz5vLy8nL9Pn7++ecC57+8H12uVq1aatWqld5++223v/v333+vFStWKC4urtj3cjWTJ0/W//73P40cOdJti3hJ2rJli1566SXdeOON6tWrl9uxvn37Kjs7W2+//baWL1+uPn36uB2PjY1VSEiIXnjhhULfJ1TYtu3F9dRTTykoKEgPPPCA0tPTCxy//G9Ws2ZN3XnnnXrttdd09OjRMmlLWdxf/ozTpe01xmjGjBkF6hb3dcDb21tdu3bVp59+6jYDmJ6eroULF6pDhw5FLkMtSnFeCwGUD2a+AFjKsmXLXDMhx44d08KFC7V7926NGzfONeC444479NBDDyk5OVnbt29X165d5evrq927d+uDDz7QjBkz1Lt3b7399tuaPXu2evTooejoaJ05c0Z/+9vfFBIS4hr8BgYGqlmzZlq0aJEaN26satWq6cYbb9SNN95YZvfUunVrSdKECRPUr18/+fr6Kj4+vkQzHy+++KJWr16tmJgYjRgxQs2aNdPPP/+srVu3auXKla6A0LVrV0VERKh9+/YKDw/XDz/8oFdffVX33HOPKleurFOnTqlu3brq3bu3WrZsqeDgYK1cuVLffPONXnnllTK758LEx8frrrvu0oQJE3TgwAG1bNlSK1as0KeffqrHH3/cNRPRunVr9erVSykpKTp58qRrq/n//ve/koo3gxAdHa0//elPGj9+vA4cOKDu3burcuXK2r9/vz7++GM9+OCDGjt2rL744gslJCTovvvuU+PGjXXx4kW98847rsArSc8++6y+/PJL3XPPPapfv76OHTum2bNnq27dum6fKXa5P//5z+rWrZvatWunYcOGubaar1Klyq/+LLlLDRw4UN98841mzJihHTt2aODAgapataq2bt2qt956S9WrV9eHH37oep9bvptvvlmNGjXShAkTlJ2d7bbkUMp7z9OcOXN0//336+abb1a/fv0UFhamgwcP6vPPP1f79u0LBOniuu6667Rw4UL1799fTZo00cCBA9WyZUsZY7R//34tXLhQXl5ebu+xmjVrljp06KDmzZtrxIgRatiwodLT07Vhwwb99NNP+ve//12iNpTF/TVt2lTR0dEaO3asDh8+rJCQEH300UcF3vsl/fI68Nhjjyk2Nlbe3t7q169foef905/+5PpsuUceeUQ+Pj567bXXlJ2drZdffrlE9ympWK+FAMpJ+W6uCACFK2yr+YCAANOqVSszZ84ct22U873++uumdevWJjAw0FSuXNk0b97cPPXUU+bIkSPGGGO2bt1q+vfvb+rVq2f8/f1NzZo1ze9//3vzr3/9y+0869evN61btzZ+fn5X3XY+f6v5K21NXtg5nnvuOVOnTh3j5eVVYFv6wrZ9r1+/vhk8eLBbWXp6uhk1apSJjIw0vr6+JiIiwnTq1Mm8/vrrrjqvvfaauf3220316tWNv7+/iY6ONk8++aQ5ffq0McaY7Oxs8+STT5qWLVuaypUrm0qVKpmWLVua2bNnF3k/+fL/Rlfbrnrw4MGmUqVKhR47c+aMGTNmjKldu7bx9fU11113nfnzn/9c4O+bmZlpRo0aZapVq2aCg4NN9+7dza5du4wk8+KLL7rq5W/TXtQ28B999JHp0KGDqVSpkqlUqZJp2rSpGTVqlNm1a5cxxph9+/aZBx54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qdD+kn8sLS1NNWvWdDvu4+OjatWquerAnnJzc/X444+rffv2uvHGGyXl9Qc/Pz+Fhoa61b28zxTWp/KPwZ6+++47tWvXTufPn1dwcLA+/vhjNWvWTNu3b6fPoID33ntPW7du1TfffFPgGK8zKExMTIzmz5+vJk2a6OjRo5o6dao6duyo77//vsL3GcIXAECjRo3S999/77amHihKkyZNtH37dp0+fVoffvihBg8erLVr13q6WbCgQ4cOafTo0UpNTVVAQICnm4MKolu3bq6fW7RooZiYGNWvX1/vv/++AgMDPdiyX49lhxVYjRo15O3tXWB3l/T0dEVERHioVbCq/D5xpf4SERFRYLOWixcv6ueff6ZP2VhCQoKWLFmi1atXq27duq7yiIgIXbhwQadOnXKrf3mfKaxP5R+DPfn5+alRo0Zq3bq1kpOT1bJlS82YMYM+gwK2bNmiY8eO6eabb5aPj498fHy0du1a/fWvf5WPj4/Cw8PpM7iq0NBQNW7cWHv27KnwrzOErwrMz89PrVu31qpVq1xlubm5WrVqldq1a+fBlsGKGjRooIiICLf+kpGRoU2bNrn6S7t27XTq1Clt2bLFVeeLL75Qbm6uYmJiyr3NuLaMMUpISNDHH3+sL774Qg0aNHA73rp1a/n6+rr1mV27dungwYNufea7775zC+2pqakKCQlRs2bNyudG4HG5ubnKzs6mz6CATp066bvvvtP27dtdX23atNHAgQNdP9NncDVnz57V3r17VatWrYr/OuPR7T7wq7333nvG39/fzJ8/3+zYscM8+OCDJjQ01G13F/x2nDlzxmzbts1s27bNSDLTpk0z27ZtMz/++KMxxpgXX3zRhIaGmk8//dR8++235t577zUNGjQw586dc53jd7/7nbnpppvMpk2bzLp168x1111n+vfv76lbwjX08MMPmypVqpg1a9aYo0ePur6ysrJcdUaOHGnq1atnvvjiC/Ovf/3LtGvXzrRr1851/OLFi+bGG280Xbt2Ndu3bzfLly83YWFhZvz48Z64JZSDcePGmbVr15r9+/ebb7/91owbN844HA6zYsUKYwx9Bld36W6HxtBnUNATTzxh1qxZY/bv32++/vpr07lzZ1OjRg1z7NgxY0zF7jOELxuYOXOmqVevnvHz8zNt27Y1Gzdu9HST4CGrV682kgp8DR482BiTt938pEmTTHh4uPH39zedOnUyu3btcjvHyZMnTf/+/U1wcLAJCQkxQ4cONWfOnPHA3eBaK6yvSDLz5s1z1Tl37px55JFHTNWqVU1QUJDp0aOHOXr0qNt5Dhw4YLp162YCAwNNjRo1zBNPPGFycnLK+W5QXh544AFTv3594+fnZ8LCwkynTp1cwcsY+gyu7vLwRZ/B5fr27Wtq1apl/Pz8TJ06dUzfvn3Nnj17XMcrcp9xGGOMZ+bcAAAAAOC3g/d8AQAAAEA5IHwBAAAAQDkgfAEAAABAOSB8AQAAAEA5IHwBAAAAQDkgfAEAAABAOSB8AQAAAEA5IHwBAAAAQDkgfAEAYAHz589XaGiop5sBALiGCF8AgAolLS1No0ePVqNGjRQQEKDw8HC1b99ec+bMUVZWlqebVyxRUVFKSUlxK+vbt6/++9//eqZBAIBy4ePpBgAAUFz79u1T+/btFRoaqhdeeEHNmzeXv7+/vvvuO73++uuqU6eO/vCHP3ikbcYYOZ1O+fiU7n+tgYGBCgwMLONWAQCshJkvAECF8cgjj8jHx0f/+te/1KdPH11//fVq2LCh7r33Xn3++eeKj4+XJJ06dUrDhw9XWFiYQkJCdPfdd+vf//636zxTpkxRq1at9M477ygqKkpVqlRRv379dObMGVed3NxcJScnq0GDBgoMDFTLli314Ycfuo6vWbNGDodDy5YtU+vWreXv769169Zp7969uvfeexUeHq7g4GDdcsstWrlypet5d955p3788UeNGTNGDodDDodDUuHLDufMmaPo6Gj5+fmpSZMmeuedd9yOOxwOvfHGG+rRo4eCgoJ03XXX6R//+EeZ/b4BAGWL8AUAqBBOnjypFStWaNSoUapUqVKhdfKDzH333adjx45p2bJl2rJli26++WZ16tRJP//8s6vu3r179cknn2jJkiVasmSJ1q5dqxdffNF1PDk5Wf/v//0/zZ07V//5z380ZswY/fGPf9TatWvdrjlu3Di9+OKL+uGHH9SiRQudPXtWcXFxWrVqlbZt26bf/e53io+P18GDByVJixcvVt26dfXss8/q6NGjOnr0aKH38vHHH2v06NF64okn9P333+uhhx7S0KFDtXr1ard6U6dOVZ8+ffTtt98qLi5OAwcOdLtPAICFGAAAKoCNGzcaSWbx4sVu5dWrVzeVKlUylSpVMk899ZT56quvTEhIiDl//rxbvejoaPPaa68ZY4xJSkoyQUFBJiMjw3X8ySefNDExMcYYY86fP2+CgoLM+vXr3c4xbNgw079/f2OMMatXrzaSzCeffHLVtt9www1m5syZrsf169c306dPd6szb948U6VKFdfj2267zYwYMcKtzn333Wfi4uJcjyWZiRMnuh6fPXvWSDLLli27apsAAOWP93wBACq0zZs3Kzc3VwMHDlR2drb+/e9/6+zZs6pevbpbvXPnzmnv3r2ux1FRUapcubLrca1atXTs2DFJ0p49e5SVlaUuXbq4nePChQu66aab3MratGnj9vjs2bOaMmWKPv/8cx09elQXL17UuXPnXDNfxfXDDz/owQcfdCtr3769ZsyY4VbWokUL18+VKlVSSEiI6z4AANZC+AIAVAiNGjWSw+HQrl273MobNmwoSa7NKs6ePatatWppzZo1Bc5x6XuqfH193Y45HA7l5ua6ziFJn3/+uerUqeNWz9/f3+3x5Usgx44dq9TUVP3lL39Ro0aNFBgYqN69e+vChQvFvNOSudJ9AACshfAFAKgQqlevri5duujVV1/Vo48+WuT7vm6++WalpaXJx8dHUVFRpbpWs2bN5O/vr4MHD+qOO+4o0XO//vprDRkyRD169JCUF+QOHDjgVsfPz09Op/OK57n++uv19ddfa/DgwW7nbtasWYnaAwCwDsIXAKDCmD17ttq3b682bdpoypQpatGihby8vPTNN99o586dat26tTp37qx27dqpe/fuevnll9W4cWMdOXJEn3/+uXr06FFgmWBhKleurLFjx2rMmDHKzc1Vhw4ddPr0aX399dcKCQlxC0SXu+6667R48WLFx8fL4XBo0qRJBWaioqKi9OWXX6pfv37y9/dXjRo1CpznySefVJ8+fXTTTTepc+fO+uyzz7R48WK3nRMBABUL4QsAUGFER0dr27ZteuGFFzR+/Hj99NNP8vf3V7NmzTR27Fg98sgjcjgcWrp0qSZMmKChQ4fq+PHjioiI0O23367w8PBiX+u5555TWFiYkpOTtW/fPoWGhurmm2/WM888c8XnTZs2TQ888IBuu+021ahRQ08//bQyMjLc6jz77LN66KGHFB0drezsbBljCpyne/fumjFjhv7yl79o9OjRatCggebNm6c777yz2PcAALAWhynsFR8AAAAAUKb4nC8AAAAAKAeELwAAAAAoB4QvAAAAACgHhC8AAAAAKAeELwAAAAAoB4QvAAAAACgHhC8AAAAAKAeELwAAAAAoB4QvAAAAACgHhC8AAAAAKAeELwAAAAAoB/8fxVlPExkykrcAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Program morpho_trees_evolution_lab.py\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "import copy  # For deep copying trees during reproduction and mutation\n",
    "import sys  # Import sys module to adjust recursion limit\n",
    "import math  # For math.floor, math.ceil, math.sqrt\n",
    "from datetime import datetime # For generating unique experiment IDs\n",
    "\n",
    "sys.setrecursionlimit(3000)  # Increase the recursion limit for potentially deep trees\n",
    "\n",
    "\n",
    "# --- SPATIAL TREE NODE FOR DIFFUSION ---\n",
    "\n",
    "class SpatialTreeNode_Evolution_Diffusion5:\n",
    "    def __init__(self, value, x, y, radius, occupied_squares_set, diffusion_nodes_info):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "\n",
    "        self.radius = radius\n",
    "        self.occupied_squares_set = occupied_squares_set  # Reference to the set of squares occupied by *this* tree's nodes\n",
    "        self.diffusion_nodes_info = diffusion_nodes_info  # Reference to the list of (x,y,radius) for *all* nodes in *this* tree\n",
    "\n",
    "        self.occupied_squares_set.add((x, y))  # Add current node's (x,y) square to the set\n",
    "        self.diffusion_nodes_info.append((x, y, radius))  # Add current node's (x,y,radius) to the list\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode_Evolution_Diffusion5):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode_Evolution_Diffusion\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue  # Exclude the current square itself\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def _is_diffusion_overlapping_local(self, potential_nx, potential_ny, potential_radius, overlap_factor):\n",
    "        \"\"\"\n",
    "        Checks if a potential new node's diffusion circle overlaps \"too much\" with EXISTING nodes IN THE SAME TREE.\n",
    "        \"Too much overlap\" is defined by the overlap_factor.\n",
    "        \"\"\"\n",
    "        potential_center_x, potential_center_y = potential_nx + 0.5, potential_ny + 0.5\n",
    "\n",
    "        for ex, ey, er in self.diffusion_nodes_info:\n",
    "            # Skip checking against self if self is already in diffusion_nodes_info\n",
    "            if (ex, ey) == (self.x, self.y):\n",
    "                continue\n",
    "\n",
    "            existing_center_x, existing_center_y = ex + 0.5, ey + 0.5\n",
    "\n",
    "            # Calculate distance between centers\n",
    "            distance = np.sqrt((potential_center_x - existing_center_x) ** 2 + (potential_ny - existing_center_y) ** 2)\n",
    "\n",
    "            # Check for significant overlap\n",
    "            # If distance is less than a fraction of the sum of radii, it's too much overlap.\n",
    "            if distance < overlap_factor * (potential_radius + er):\n",
    "                return True  # Significant overlap detected\n",
    "        return False\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix, max_node_radius, overlap_factor):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "\n",
    "        # First, filter for unoccupied grid squares *within this tree*\n",
    "        available_square_neighbors = [coord for coord in coordinates_neighbors if\n",
    "                                      coord not in self.occupied_squares_set]\n",
    "\n",
    "        valid_child_candidates = []  # Store (nx, ny, child_radius) for candidates that pass overlap check\n",
    "\n",
    "        for nx, ny in available_square_neighbors:\n",
    "            # Generate potential radius for this child, ensuring it's not too large or small\n",
    "            child_radius = random.uniform(0.5, max_node_radius)\n",
    "            if not self._is_diffusion_overlapping_local(nx, ny, child_radius, overlap_factor):\n",
    "                valid_child_candidates.append((nx, ny, child_radius))\n",
    "\n",
    "        if not valid_child_candidates:\n",
    "            return None  # No available neighbors that satisfy both square and diffusion overlap conditions\n",
    "\n",
    "        # Choose a random valid candidate\n",
    "        chosen_nx, chosen_ny, chosen_child_radius = random.choice(valid_child_candidates)\n",
    "\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        # Create child node; its __init__ will update occupied_squares_set and diffusion_nodes_info\n",
    "        child_node = SpatialTreeNode_Evolution_Diffusion5(child_value, chosen_nx, chosen_ny, chosen_child_radius,\n",
    "                                                            self.occupied_squares_set, self.diffusion_nodes_info)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def get_all_nodes(self):\n",
    "        all_nodes = []\n",
    "        stack = [self]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            all_nodes.append(node)\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "        return all_nodes\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode_Evolution_Diffusion(value={self.value}, x={self.x}, y={self.y}, R={self.radius:.2f}, children={[child.value for child in self.children]!r})\"\n",
    "\n",
    "\n",
    "# --- TREE GENERATION ---\n",
    "\n",
    "def generate_random_spatial_tree_diffusion5(\n",
    "        max_depth, max_children, max_node_radius, initial_x, initial_y, node_prefix=\"Node\",\n",
    "        current_depth=0, parent_node=None, occupied_squares_set=None, diffusion_nodes_info=None, overlap_factor=0.7\n",
    "):\n",
    "    if occupied_squares_set is None:\n",
    "        occupied_squares_set = set()  # Initialize a new set for this tree's square coordinates\n",
    "    if diffusion_nodes_info is None:\n",
    "        diffusion_nodes_info = []  # Initialize a new list for this tree's node (x,y,radius) information\n",
    "\n",
    "    if parent_node is None:\n",
    "        # Root node at (initial_x, initial_y) with a random initial radius\n",
    "        node_value = f\"{node_prefix}_Root_{random.randint(0, 99)}\"\n",
    "        initial_radius = random.uniform(0.5, max_node_radius)\n",
    "        current_node = SpatialTreeNode_Evolution_Diffusion5(node_value, initial_x, initial_y, initial_radius,\n",
    "                                                            occupied_squares_set, diffusion_nodes_info)\n",
    "    else:\n",
    "        # Children are added by the parent's method, which handles their coordinates and radius\n",
    "        current_node = parent_node.add_child_in_random_neighbor(f\"{node_prefix}_{current_depth}\", max_node_radius,\n",
    "                                                                overlap_factor)\n",
    "        if current_node is None:\n",
    "            return None  # Branch terminated if no available neighbor\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        num_children = random.randint(0, max_children)  # Random number of children for this node\n",
    "        for _ in range(num_children):\n",
    "            generate_random_spatial_tree_diffusion5(\n",
    "                max_depth, max_children, max_node_radius, initial_x, initial_y, node_prefix,\n",
    "                current_depth + 1, current_node, occupied_squares_set, diffusion_nodes_info, overlap_factor\n",
    "            )\n",
    "    return current_node\n",
    "\n",
    "\n",
    "# --- ILLUMINATION AND FITNESS FUNCTIONS ---\n",
    "\n",
    "def get_illuminated_area5(tree):\n",
    "    \"\"\"\n",
    "    Calculates the set of (x,y) integer coordinates illuminated by the tree using the\n",
    "    algebraic approach described in the text, based on intersections with horizontal\n",
    "    and vertical grid lines.\n",
    "    \"\"\"\n",
    "    if tree is None:\n",
    "        return set()\n",
    "\n",
    "    illuminated_coords = set()\n",
    "\n",
    "    all_nodes_in_tree = tree.get_all_nodes()\n",
    "\n",
    "    if not all_nodes_in_tree:\n",
    "        return set()\n",
    "\n",
    "    for node_i in all_nodes_in_tree:\n",
    "        circle_center_x = node_i.x + 0.5\n",
    "        circle_center_y = node_i.y + 0.5\n",
    "        r_sq = node_i.radius ** 2\n",
    "\n",
    "        # 1. Add the cell containing the center of the circle\n",
    "        illuminated_coords.add((math.floor(circle_center_x), math.floor(circle_center_y)))\n",
    "\n",
    "        # 2. Horizontal Scan: Check intersections with horizontal grid lines\n",
    "        for y_line in range(math.floor(circle_center_y - node_i.radius),\n",
    "                            math.ceil(circle_center_y + node_i.radius) + 1):\n",
    "            dy = y_line - circle_center_y\n",
    "            discriminant = r_sq - dy * dy\n",
    "\n",
    "            if discriminant >= 0:\n",
    "                dx = math.sqrt(discriminant)\n",
    "                x_min_intersect = circle_center_x - dx\n",
    "                x_max_intersect = circle_center_x + dx\n",
    "\n",
    "                for ix in range(math.floor(x_min_intersect), math.floor(x_max_intersect) + 1):\n",
    "                    illuminated_coords.add((ix, y_line))\n",
    "                    illuminated_coords.add((ix, y_line - 1))\n",
    "\n",
    "        # 3. Vertical Scan: Check intersections with vertical grid lines\n",
    "        for x_line in range(math.floor(circle_center_x - node_i.radius),\n",
    "                            math.ceil(circle_center_x + node_i.radius) + 1):\n",
    "            dx = x_line - circle_center_x\n",
    "            discriminant = r_sq - dx * dx\n",
    "\n",
    "            if discriminant >= 0:\n",
    "                dy = math.sqrt(discriminant)\n",
    "                y_min_intersect = circle_center_y - dy\n",
    "                y_max_intersect = circle_center_y + dy\n",
    "\n",
    "                for iy in range(math.floor(y_min_intersect), math.floor(y_max_intersect) + 1):\n",
    "                    illuminated_coords.add((x_line, iy))\n",
    "                    illuminated_coords.add((x_line - 1, iy))\n",
    "\n",
    "    return illuminated_coords\n",
    "\n",
    "\n",
    "def calculate_fitness_illumination5(candidate_tree_root, target_illuminated_area):\n",
    "    \"\"\"\n",
    "    Calculates fitness based on the symmetric difference between illuminated areas.\n",
    "    Fitness is 1.0 for a perfect match, and decreases as symmetric difference increases.\n",
    "    \"\"\"\n",
    "    if candidate_tree_root is None:\n",
    "        # If the tree generation failed, assign a very low fitness\n",
    "        return 0.0001  # A small non-zero value to avoid division by zero issues later\n",
    "\n",
    "    candidate_illuminated_area = get_illuminated_area5(candidate_tree_root)\n",
    "\n",
    "    # Symmetric difference: (A U B) - (A intersect B)\n",
    "    # Or, the elements in A, but not B, plus elements in B but not A.\n",
    "    symmetric_difference = candidate_illuminated_area.symmetric_difference(target_illuminated_area)\n",
    "\n",
    "    # Union size: used for normalization\n",
    "    union_size = len(candidate_illuminated_area.union(target_illuminated_area))\n",
    "\n",
    "    if union_size == 0:\n",
    "        if not target_illuminated_area and not candidate_illuminated_area:\n",
    "            return 1.0  # Perfect match if both are empty\n",
    "        else:\n",
    "            return 0.0001  # Should not happen if target is non-empty, but handles cases where both are empty but expected non-empty\n",
    "\n",
    "    # Fitness is 1.0 - (len(symmetric_difference) / union_size)\n",
    "    # This gives 1.0 for a perfect match (symmetric_difference_area = 0)\n",
    "    # and approaches 0.0 for large differences.\n",
    "    fitness = 1.0 - (len(symmetric_difference) / union_size)\n",
    "    return max(0.0001, fitness)  # Ensure fitness is always positive\n",
    "\n",
    "\n",
    "# --- EVOLUTIONARY ALGORITHM COMPONENTS ---\n",
    "\n",
    "def create_initial_population_diffusion5(pop_size, max_depth, max_children, max_node_radius, initial_x, initial_y,\n",
    "                                         overlap_factor, node_prefix=\"Individual\"):\n",
    "    population = []\n",
    "    for i in range(pop_size):\n",
    "        # Each tree needs its own occupied_squares_set and diffusion_nodes_info for independent generation\n",
    "        occupied_squares = set()\n",
    "        diffusion_info = []\n",
    "        tree = generate_random_spatial_tree_diffusion5(\n",
    "            max_depth=max_depth, max_children=max_children, max_node_radius=max_node_radius,\n",
    "            initial_x=initial_x, initial_y=initial_y, node_prefix=f\"{node_prefix}_{i}\",\n",
    "            occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info, overlap_factor=overlap_factor\n",
    "        )\n",
    "        if tree:\n",
    "            population.append(tree)\n",
    "    # If not enough trees generated due to space constraints, fill with more random ones (or handle error)\n",
    "    while len(population) < pop_size:\n",
    "        occupied_squares = set()\n",
    "        diffusion_info = []\n",
    "        new_tree = generate_random_spatial_tree_diffusion5(\n",
    "            max_depth=max_depth, max_children=max_children, max_node_radius=max_node_radius,\n",
    "            initial_x=initial_x, initial_y=initial_y, node_prefix=f\"RandomFill_{len(population)}\",\n",
    "            occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info,\n",
    "            overlap_factor=overlap_factor\n",
    "        )\n",
    "        if new_tree:\n",
    "            population.append(new_tree)\n",
    "        else:\n",
    "            # Handle case where a new tree could not be generated\n",
    "            # This might happen if parameters are too restrictive or space is exhausted\n",
    "            break  # Exit if we can't generate enough valid trees\n",
    "    return population\n",
    "\n",
    "\n",
    "def select_parents_diffusion5(population, fitness_scores, num_parents):\n",
    "    parents = []\n",
    "    # Use roulette wheel selection or tournament selection. Tournament is generally robust.\n",
    "    for _ in range(num_parents):\n",
    "        tournament_size = min(5, len(population))\n",
    "        if tournament_size == 0:\n",
    "            break\n",
    "        tournament_candidates = random.sample(list(zip(population, fitness_scores)), tournament_size)\n",
    "        winner = max(tournament_candidates, key=lambda x: x[1])[0]\n",
    "        parents.append(winner)\n",
    "    return parents\n",
    "\n",
    "def update_nodes_info_for_tree5(tree_root):\n",
    "    # This function rebuilds the occupied_squares_set and diffusion_nodes_info for a tree\n",
    "    # This is necessary after deepcopy, mutation, or crossover to ensure consistency\n",
    "    # for the mutated/crossed-over part.\n",
    "    new_occupied_squares_set = set()\n",
    "    new_diffusion_nodes_info = []\n",
    "\n",
    "    # Traverse the tree to collect all current node info\n",
    "    stack = [tree_root]\n",
    "    visited = set()\n",
    "    while stack:\n",
    "        node = stack.pop()\n",
    "        # Avoid processing same node multiple times if tree structure has cycles (unlikely here but good practice)\n",
    "        if node in visited: continue\n",
    "        visited.add(node)\n",
    "\n",
    "        new_occupied_squares_set.add((node.x, node.y))\n",
    "        new_diffusion_nodes_info.append((node.x, node.y, node.radius))\n",
    "        for child in node.children:\n",
    "            stack.append(child)\n",
    "\n",
    "    # Now, update all nodes in the tree with the new references\n",
    "    stack = [tree_root]\n",
    "    visited.clear()\n",
    "    while stack:\n",
    "        node = stack.pop()\n",
    "        if node in visited: continue\n",
    "        visited.add(node)\n",
    "\n",
    "        node.occupied_squares_set = new_occupied_squares_set\n",
    "        node.diffusion_nodes_info = new_diffusion_nodes_info\n",
    "        for child in node.children:\n",
    "            stack.append(child)\n",
    "    return tree_root\n",
    "\n",
    "\n",
    "def mutate_tree_diffusion5(tree_root, max_depth, max_children, max_node_radius, mutation_rate, overlap_factor):\n",
    "    mutated_tree = copy.deepcopy(tree_root)  # Work on a deep copy\n",
    "    mutated_tree = update_nodes_info_for_tree5(mutated_tree) # Ensure info sets are consistent after deepcopy\n",
    "\n",
    "    all_nodes = mutated_tree.get_all_nodes()\n",
    "\n",
    "    if not all_nodes:\n",
    "        return mutated_tree\n",
    "\n",
    "    node_to_mutate = random.choice(all_nodes)\n",
    "\n",
    "    # Mutation 1: Add a child\n",
    "    if random.random() < mutation_rate:\n",
    "        # Ensure node_to_mutate has correct references to the tree's global sets\n",
    "        # which should be updated by update_nodes_info_for_tree already.\n",
    "        node_to_mutate.add_child_in_random_neighbor(\"MutatedChild\", max_node_radius, overlap_factor)\n",
    "        mutated_tree = update_nodes_info_for_tree5(mutated_tree) # Re-update after potential addition\n",
    "\n",
    "    # Mutation 2: Change node radius\n",
    "    if random.random() < mutation_rate:\n",
    "        node_to_mutate.radius = random.uniform(0.5, max_node_radius)\n",
    "\n",
    "    # Mutation 3: Remove a child (if any)\n",
    "    if random.random() < mutation_rate and node_to_mutate.children:\n",
    "        child_to_remove = random.choice(node_to_mutate.children)\n",
    "        node_to_mutate.children.remove(child_to_remove)\n",
    "        mutated_tree = update_nodes_info_for_tree5(mutated_tree) # Re-update after potential removal\n",
    "\n",
    "    return mutated_tree\n",
    "\n",
    "\n",
    "def crossover_trees_diffusion5(parent1_root, parent2_root, crossover_rate, max_node_radius, overlap_factor):\n",
    "    if random.random() > crossover_rate:\n",
    "        return copy.deepcopy(parent1_root), copy.deepcopy(parent2_root)\n",
    "\n",
    "    child1_root = copy.deepcopy(parent1_root)\n",
    "    child2_root = copy.deepcopy(parent2_root)\n",
    "\n",
    "    # Ensure consistency after deepcopy for both children\n",
    "    child1_root = update_nodes_info_for_tree5(child1_root)\n",
    "    child2_root = update_nodes_info_for_tree5(child2_root)\n",
    "\n",
    "    all_nodes_child1 = child1_root.get_all_nodes()\n",
    "    all_nodes_child2 = child2_root.get_all_nodes()\n",
    "\n",
    "    # Ensure there are nodes to swap beyond just the root\n",
    "    if len(all_nodes_child1) < 2 or len(all_nodes_child2) < 2:\n",
    "        return child1_root, child2_root\n",
    "\n",
    "    # Choose random nodes (not roots) to be crossover points\n",
    "    cross_point1 = random.choice([n for n in all_nodes_child1 if n != child1_root])\n",
    "    cross_point2 = random.choice([n for n in all_nodes_child2 if n != child2_root])\n",
    "\n",
    "    # Find parent of cross_point1 in child1_root tree\n",
    "    parent_cross_point1 = None\n",
    "    for node in all_nodes_child1:\n",
    "        if cross_point1 in node.children:\n",
    "            parent_cross_point1 = node\n",
    "            break\n",
    "\n",
    "    # Find parent of cross_point2 in child2_root tree\n",
    "    parent_cross_point2 = None\n",
    "    for node in all_nodes_child2:\n",
    "        if cross_point2 in node.children:\n",
    "            parent_cross_point2 = node\n",
    "            break\n",
    "\n",
    "    if parent_cross_point1 and parent_cross_point2:  # Perform swap\n",
    "        # Remove subtrees from parents\n",
    "        parent_cross_point1.children.remove(cross_point1)\n",
    "        parent_cross_point2.children.remove(cross_point2)\n",
    "\n",
    "        # Attach swapped subtrees\n",
    "        parent_cross_point1.add_child(cross_point2)\n",
    "        parent_cross_point2.add_child(cross_point1)\n",
    "\n",
    "        # After crossover, the `occupied_squares_set` and `diffusion_nodes_info` of the affected trees\n",
    "        # need to be re-synced across all nodes within each child tree.\n",
    "        child1_root = update_nodes_info_for_tree5(child1_root)\n",
    "        child2_root = update_nodes_info_for_tree5(child2_root)\n",
    "\n",
    "    return child1_root, child2_root\n",
    "\n",
    "\n",
    "# --- PLOTTING FUNCTIONS ---\n",
    "\n",
    "def plot_illuminated_area5(ax, illuminated_coords, title, color='blue', alpha=0.5):\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "    if not illuminated_coords:\n",
    "        ax.set_title(title)\n",
    "        ax.grid(True)\n",
    "        return\n",
    "\n",
    "    for x, y in illuminated_coords:\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=0.5)\n",
    "        ax.add_patch(rect)\n",
    "\n",
    "    min_x = min(c[0] for c in illuminated_coords) - 1\n",
    "    max_x = max(c[0] for c in illuminated_coords) + 2\n",
    "    min_y = min(c[1] for c in illuminated_coords) - 1\n",
    "    max_y = max(c[1] for c in illuminated_coords) + 2\n",
    "\n",
    "    ax.set_xlim(min_x, max_x)\n",
    "    ax.set_ylim(min_y, max_y)\n",
    "    ax.set_xticks(range(int(min_x), int(max_x)))\n",
    "    ax.set_yticks(range(int(min_y), int(max_y)))\n",
    "    ax.grid(True)\n",
    "    ax.set_title(title)\n",
    "\n",
    "\n",
    "def plot_tree_with_illumination5(tree_root, illuminated_coords, ax, tree_color='lightblue', diff_color='red', title=\"\"):\n",
    "\n",
    "    # Plot illuminated area first (background)\n",
    "    for x, y in illuminated_coords:\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=diff_color, alpha=0.5,\n",
    "                                 zorder=0)  # Changed alpha for more transparency\n",
    "        ax.add_patch(rect)\n",
    "\n",
    "    if tree_root is None:\n",
    "        return\n",
    "\n",
    "    # Plot tree nodes and their diffusion circles\n",
    "    all_nodes = tree_root.get_all_nodes()\n",
    "    for node in all_nodes:\n",
    "        # Plot the square representing the cell\n",
    "        rect = patches.Rectangle((node.x, node.y), 1, 1, facecolor=tree_color, edgecolor='black', linewidth=1, zorder=1)\n",
    "        ax.add_patch(rect)\n",
    "        ax.text(node.x + 0.5, node.y + 0.5, node.value.split('_')[-1], ha='center', va='center', color='darkblue',\n",
    "                fontsize=7, zorder=2)\n",
    "\n",
    "        # Plot the circle representing the radius of influence\n",
    "        circle = patches.Circle((node.x + 0.5, node.y + 0.5), node.radius, color='red', alpha=0.2, zorder=2)\n",
    "        ax.add_patch(circle)\n",
    "\n",
    "    # Draw lines connecting parent to children\n",
    "    for node in all_nodes:\n",
    "        for child in node.children:\n",
    "            ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--', linewidth=0.8, zorder=3)\n",
    "\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "    ax.set_title(title)\n",
    "\n",
    "    # Set plot limits based on the illuminated coordinates\n",
    "    if illuminated_coords:\n",
    "        all_x = [c[0] for c in illuminated_coords]\n",
    "        all_y = [c[1] for c in illuminated_coords]\n",
    "\n",
    "        min_x_val = min(all_x) - 1\n",
    "        max_x_val = max(all_x) + 2\n",
    "        min_y_val = min(all_y) - 1\n",
    "        max_y_val = max(all_y) + 2\n",
    "\n",
    "        ax.set_xlim(min_x_val, max_x_val)\n",
    "        ax.set_ylim(min_y_val, max_y_val)\n",
    "        ax.set_xticks(range(int(min_x_val), int(max_x_val)))\n",
    "        ax.set_yticks(range(int(min_y_val), int(max_y_val)))\n",
    "    ax.grid(True)\n",
    "\n",
    "\n",
    "# --- MAIN EVOLUTIONARY SIMULATION LOOP ---\n",
    "\n",
    "def run_evolutionary_lighting_lab5(target_tree_params, ga_params):\n",
    "    experiment_id = datetime.now().strftime(\"%Y%m%d_%H%M%S\")\n",
    "    print(f\"\\n--- Starting Experiment: {experiment_id} ---\")\n",
    "    print(\"Target Tree Parameters:\")\n",
    "    for key, value in target_tree_params.items():\n",
    "        print(f\"  {key}: {value}\")\n",
    "    print(\"\\nGenetic Algorithm Parameters:\")\n",
    "    for key, value in ga_params.items():\n",
    "        print(f\"  {key}: {value}\")\n",
    "\n",
    "    # 1. Generate Target Tree and its Illuminated Area\n",
    "    print(\"\\n--- Generating Target Tree ---\")\n",
    "    random.seed(ga_params['seed'] + 1)  # Use a different seed for target generation\n",
    "    target_occupied_squares = set()\n",
    "    target_diffusion_info = []\n",
    "    target_tree_root = generate_random_spatial_tree_diffusion5(\n",
    "        max_depth=target_tree_params['max_depth'], max_children=target_tree_params['max_children'],\n",
    "        max_node_radius=target_tree_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "        node_prefix=\"Target\", occupied_squares_set=target_occupied_squares,\n",
    "        diffusion_nodes_info=target_diffusion_info, overlap_factor=target_tree_params['overlap_factor']\n",
    "    )\n",
    "\n",
    "    if not target_tree_root:\n",
    "        print(\"Failed to generate target tree. Exiting.\")\n",
    "        return None, None, None, None, []\n",
    "\n",
    "    target_illuminated_area = get_illuminated_area5(target_tree_root)\n",
    "    print(\n",
    "        f\"Target Tree Generated with {len(target_tree_root.get_all_nodes())} nodes. Illuminated area size: {len(target_illuminated_area)}\")\n",
    "\n",
    "    # 2. Initialize Population\n",
    "    random.seed(ga_params['seed'])  # Reset seed for GA population generation\n",
    "    print(f\"\\n--- Initializing Population of {ga_params['pop_size']} Trees ---\")\n",
    "    population = create_initial_population_diffusion5(\n",
    "        pop_size=ga_params['pop_size'], max_depth=ga_params['max_depth'], max_children=ga_params['max_children'],\n",
    "        max_node_radius=ga_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "        overlap_factor=ga_params['overlap_factor']\n",
    "    )\n",
    "    print(f\"Population initialized with {len(population)} individuals.\")\n",
    "\n",
    "    best_tree_overall = None\n",
    "    best_fitness_overall = -1.0\n",
    "    history = []\n",
    "\n",
    "    # 4. Evolutionary Loop\n",
    "    print(f\"\\n--- Starting Evolutionary Loop for {ga_params['generations']} Generations ---\")\n",
    "    for generation in range(ga_params['generations']):\n",
    "        fitness_scores = [calculate_fitness_illumination5(tree, target_illuminated_area) for tree in population]\n",
    "\n",
    "        current_best_fitness = max(fitness_scores)\n",
    "        current_best_tree = population[np.argmax(fitness_scores)]\n",
    "\n",
    "        if current_best_fitness > best_fitness_overall:\n",
    "            best_fitness_overall = current_best_fitness\n",
    "            best_tree_overall = copy.deepcopy(current_best_tree)  # Deepcopy to save the best tree\n",
    "            best_tree_overall = update_nodes_info_for_tree5(best_tree_overall) # Ensure consistency\n",
    "\n",
    "        history.append(current_best_fitness)\n",
    "\n",
    "        print(\n",
    "            f\"Generation {generation + 1}/{ga_params['generations']}: Best Fitness = {current_best_fitness:.4f} (Overall Best: {best_fitness_overall:.4f})\")\n",
    "\n",
    "        if best_fitness_overall >= 0.999:  # Almost perfect match\n",
    "            print(\"Target illumination achieved (or very close)! Stopping evolution.\")\n",
    "            break\n",
    "\n",
    "        # Selection\n",
    "        parents = select_parents_diffusion5(population, fitness_scores, ga_params['pop_size'] // 2)\n",
    "\n",
    "        # Create next generation\n",
    "        next_population = []\n",
    "        # Elitism: Keep the best individual from the current generation\n",
    "        if best_tree_overall and current_best_fitness == best_fitness_overall:  # Only if it's the current best in this generation\n",
    "            next_population.append(copy.deepcopy(current_best_tree))\n",
    "\n",
    "        while len(next_population) < ga_params['pop_size']:\n",
    "            if len(parents) < 2:  # Not enough parents for crossover, fill with new random trees\n",
    "                occupied_squares = set()\n",
    "                diffusion_info = []\n",
    "                new_tree = generate_random_spatial_tree_diffusion(\n",
    "                    max_depth=ga_params['max_depth'], max_children=ga_params['max_children'],\n",
    "                    max_node_radius=ga_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "                    node_prefix=f\"RandomFill_{len(next_population)}\",\n",
    "                    occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info,\n",
    "                    overlap_factor=ga_params['overlap_factor']\n",
    "                )\n",
    "                if new_tree:\n",
    "                    next_population.append(new_tree)\n",
    "                continue\n",
    "\n",
    "            # Randomly pick two parents (can be the same parent multiple times with replacement for simplicity)\n",
    "            p1 = random.choice(parents)\n",
    "            p2 = random.choice(parents)\n",
    "\n",
    "            # Crossover\n",
    "            child1, child2 = crossover_trees_diffusion5(p1, p2, ga_params['crossover_rate'],\n",
    "                                                        ga_params['max_node_radius'], ga_params['overlap_factor'])\n",
    "\n",
    "            # Mutation\n",
    "            mutated_child1 = mutate_tree_diffusion5(child1, ga_params['max_depth'], ga_params['max_children'],\n",
    "                                                    ga_params['max_node_radius'], ga_params['mutation_rate'],\n",
    "                                                    ga_params['overlap_factor'])\n",
    "            mutated_child2 = mutate_tree_diffusion5(child2, ga_params['max_depth'], ga_params['max_children'],\n",
    "                                                    ga_params['max_node_radius'], ga_params['mutation_rate'],\n",
    "                                                    ga_params['overlap_factor'])\n",
    "\n",
    "            next_population.append(mutated_child1)\n",
    "            if len(next_population) < ga_params['pop_size']:\n",
    "                next_population.append(mutated_child2)\n",
    "\n",
    "        population = next_population[:ga_params['pop_size']]\n",
    "\n",
    "    print(\"\\n--- Evolution Finished ---\")\n",
    "    print(f\"Final Best Fitness: {best_fitness_overall:.4f}\")\n",
    "\n",
    "    return target_tree_root, target_illuminated_area, best_tree_overall, best_fitness_overall, history\n",
    "\n",
    "\n",
    "# --- MAIN EXECUTION ---\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    # Parameters for the target tree generation\n",
    "    TARGET_TREE_PARAMS = {\n",
    "        'max_depth': 100,\n",
    "        'max_children': 3,\n",
    "        'max_node_radius': 3.0,\n",
    "        'overlap_factor': 0.7\n",
    "    }\n",
    "\n",
    "    # Parameters for the Genetic Algorithm\n",
    "    GA_PARAMS = {\n",
    "        'seed': 679182,\n",
    "        'pop_size': 200,\n",
    "        'generations': 500,\n",
    "        'max_depth': 100,\n",
    "        'max_children': 3,\n",
    "        'max_node_radius': 3.0,\n",
    "        'mutation_rate': 0.1,\n",
    "        'crossover_rate': 0.7,\n",
    "        'overlap_factor': 0.7,\n",
    "        'illumination_resolution': 1  # This parameter is no longer used by get_illuminated_area\n",
    "    }\n",
    "\n",
    "    target_tree, target_area, evolved_best_tree, evolved_best_fitness, history = run_evolutionary_lighting_lab5(\n",
    "        TARGET_TREE_PARAMS, GA_PARAMS)\n",
    "\n",
    "    # --- Plotting Results ---\n",
    "    if target_tree and evolved_best_tree:\n",
    "        fig, axes = plt.subplots(1, 3, figsize=(24, 8))\n",
    "\n",
    "        # Plot 1: Target Tree Structure and its Illumination\n",
    "        plot_tree_with_illumination5(target_tree, target_area, axes[0], tree_color='skyblue', diff_color='green',\n",
    "                                     title=\"Target Tree and Illuminated Area\")\n",
    "\n",
    "        # Plot 2: Best Evolved Tree Structure and its Illumination\n",
    "        evolved_best_area = get_illuminated_area5(evolved_best_tree)\n",
    "        plot_tree_with_illumination5(evolved_best_tree, evolved_best_area, axes[1], tree_color='lightcoral',\n",
    "                                     diff_color='purple',\n",
    "                                     title=f\"Best Evolved Tree (Fitness: {evolved_best_fitness:.4f})\")\n",
    "\n",
    "        # Plot 3: Symmetric Difference Area\n",
    "        symmetric_diff_area = target_area.symmetric_difference(evolved_best_area)\n",
    "        plot_illuminated_area5(axes[2], symmetric_diff_area,\n",
    "                               title=f\"Symmetric Difference (Error Area: {len(symmetric_diff_area)})\")\n",
    "\n",
    "        plt.tight_layout()\n",
    "        plt.show()\n",
    "\n",
    "        # Plot Fitness History\n",
    "        plt.figure(figsize=(10, 6))\n",
    "        plt.plot(history, marker='o', linestyle='-', color='blue')\n",
    "        plt.title('Best Fitness Progression Over Generations')\n",
    "        plt.xlabel('Generation')\n",
    "        plt.ylabel('Fitness')\n",
    "        plt.grid(True)\n",
    "        plt.show()\n",
    "    else:\n",
    "        print(\"No plot\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "9xDMw5I3O_zr"
   },
   "source": [
    "**Exercise.** Play with the program to see how it functions. Does Evolution achieve perfection for every case of complexity?\n",
    ">\n",
    "> *Answer.* Perfection is reached in less than 500 generations for a simple case of the target tree with complexity parameters max_`depth = 3`, `max_children = 2`. Perfection was also achieved after a very long period of ecstasy for the case `max_depth = 7`, `max_children = 3`. The same happened for the case `max_depth = 10`, `max_children = 3`. The same happened for the case `max_depth = 20`, `max_children = 3`. The same happened for the case `max_depth = 50`, `max_children = 3`.  Needed time to run 500 generation was by far longer for the case `max_depth = 100`, `max_children = 3` but perfection was not achieved.\n",
    "\n",
    "**Protest.** The previous program does not have a neat indicator of complexity as the real number of nodes could be. This is understandable because one may suppose that the number of children and the final architecture of the trees must be at random. But, the result is not transparent. For instance, for a case with `max_depth = 100`, `max_children = 3`, the real number of nodes was 8, and the number of children were 0, 1, and 2.\n",
    ">\n",
    "> *Answer.* The criticism is right. To attack it, without losing the variability proportioned by randomness, we need statistics.\n",
    "\n",
    "**A present from Gemini.**  The following program outputs a graphic of the dependency of the cost in number of generations to achieve a fitness of 0.9999 as a function of the average number of nodes in the population. Randomness is not lost nor restricted because one can fix a number of generations to know how far the fitness is risen depending on the complexity indicators max-depth and number of children that determine the target tree.  The program functions well for low values of max-depth."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "executionInfo": {
     "elapsed": 89233,
     "status": "ok",
     "timestamp": 1788353917297,
     "user": {
      "displayName": "jose rodriguez",
      "userId": "08454562216435392883"
     },
     "user_tz": 300
    },
    "id": "HwXhb4PWKgJ1",
    "outputId": "efa3154b-2448-42bb-a901-d830830d4de5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "=== Starting Evolution Cost Study ===\n",
      "GA Parameters used for study: {'seed': 12345, 'pop_size': 50, 'generations': 200, 'max_depth': 4, 'max_children': 3, 'max_node_radius': 3.0, 'mutation_rate': 0.1, 'crossover_rate': 0.7, 'overlap_factor': 0.7}\n",
      "\n",
      "--- Studying Target Tree Complexity Config 1/6 ---\n",
      "  Target Tree Params: Max Depth=1, Max Children=1\n",
      "  Run 1/5 for this complexity...\n",
      "  Run 2/5 for this complexity...\n",
      "  Run 3/5 for this complexity...\n",
      "  Run 4/5 for this complexity...\n",
      "  Run 5/5 for this complexity...\n",
      "  Average Generations: 1.20, Average Nodes: 1.20\n",
      "\n",
      "--- Studying Target Tree Complexity Config 2/6 ---\n",
      "  Target Tree Params: Max Depth=2, Max Children=1\n",
      "  Run 1/5 for this complexity...\n",
      "  Run 2/5 for this complexity...\n",
      "  Run 3/5 for this complexity...\n",
      "  Run 4/5 for this complexity...\n",
      "  Run 5/5 for this complexity...\n",
      "  Average Generations: 15.60, Average Nodes: 1.80\n",
      "\n",
      "--- Studying Target Tree Complexity Config 3/6 ---\n",
      "  Target Tree Params: Max Depth=2, Max Children=2\n",
      "  Run 1/5 for this complexity...\n",
      "  Run 2/5 for this complexity...\n",
      "  Run 3/5 for this complexity...\n",
      "  Run 4/5 for this complexity...\n",
      "  Run 5/5 for this complexity...\n",
      "  Average Generations: 4.80, Average Nodes: 1.60\n",
      "\n",
      "--- Studying Target Tree Complexity Config 4/6 ---\n",
      "  Target Tree Params: Max Depth=3, Max Children=1\n",
      "  Run 1/5 for this complexity...\n",
      "  Run 2/5 for this complexity...\n",
      "  Run 3/5 for this complexity...\n",
      "  Run 4/5 for this complexity...\n",
      "  Run 5/5 for this complexity...\n",
      "  Average Generations: 44.00, Average Nodes: 2.20\n",
      "\n",
      "--- Studying Target Tree Complexity Config 5/6 ---\n",
      "  Target Tree Params: Max Depth=3, Max Children=2\n",
      "  Run 1/5 for this complexity...\n",
      "  Run 2/5 for this complexity...\n",
      "  Run 3/5 for this complexity...\n",
      "  Run 4/5 for this complexity...\n",
      "  Run 5/5 for this complexity...\n",
      "  Average Generations: 62.80, Average Nodes: 3.20\n",
      "\n",
      "--- Studying Target Tree Complexity Config 6/6 ---\n",
      "  Target Tree Params: Max Depth=3, Max Children=3\n",
      "  Run 1/5 for this complexity...\n",
      "  Run 2/5 for this complexity...\n",
      "  Run 3/5 for this complexity...\n",
      "  Run 4/5 for this complexity...\n",
      "  Run 5/5 for this complexity...\n",
      "  Average Generations: 83.20, Average Nodes: 4.40\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Cost Study Results:\n",
      "  Nodes: 1.20, Avg. Generations: 1.20\n",
      "  Nodes: 1.60, Avg. Generations: 4.80\n",
      "  Nodes: 1.80, Avg. Generations: 15.60\n",
      "  Nodes: 2.20, Avg. Generations: 44.00\n",
      "  Nodes: 3.20, Avg. Generations: 62.80\n",
      "  Nodes: 4.40, Avg. Generations: 83.20\n"
     ]
    }
   ],
   "source": [
    "# Program cost_to_match_target_tree_with_n_nodes.py\n",
    "# By Gemini 2.5 Flash\n",
    "\n",
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patches as patches\n",
    "import numpy as np\n",
    "import copy  # For deep copying trees during reproduction and mutation\n",
    "import sys  # Import sys module to adjust recursion limit\n",
    "import math  # For math.floor, math.ceil, math.sqrt\n",
    "import re # Regular expressions, for finding patterns inside strings\n",
    "from datetime import datetime # For generating unique experiment IDs\n",
    "\n",
    "sys.setrecursionlimit(3000)  # Increase the recursion limit for potentially deep trees\n",
    "\n",
    "\n",
    "# --- SPATIAL TREE NODE FOR DIFFUSION --- #\n",
    "\n",
    "class SpatialTreeNode_Evolution_Diffusion6:\n",
    "    def __init__(self, value, x, y, radius, occupied_squares_set, diffusion_nodes_info):\n",
    "        self.value = value\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.children = []\n",
    "\n",
    "        self.radius = radius\n",
    "        self.occupied_squares_set = occupied_squares_set  # Reference to the set of squares occupied by *this* tree's nodes\n",
    "        self.diffusion_nodes_info = diffusion_nodes_info  # Reference to the list of (x,y,radius) for *all* nodes in *this* tree\n",
    "\n",
    "        self.occupied_squares_set.add((x, y))  # Add current node's (x,y) square to the set\n",
    "        self.diffusion_nodes_info.append((x, y, radius))  # Add current node's (x,y,radius) to the list\n",
    "\n",
    "    def add_child(self, child_node):\n",
    "        if not isinstance(child_node, SpatialTreeNode_Evolution_Diffusion6):\n",
    "            raise TypeError(\"Child must be an instance of SpatialTreeNode_Evolution_Diffusion\")\n",
    "        self.children.append(child_node)\n",
    "\n",
    "    def get_neighboring_coordinates(self):\n",
    "        neighbors = []\n",
    "        for dx in [-1, 0, 1]:\n",
    "            for dy in [-1, 0, 1]:\n",
    "                if dx == 0 and dy == 0:\n",
    "                    continue  # Exclude the current square itself\n",
    "                neighbors.append((self.x + dx, self.y + dy))\n",
    "        return neighbors\n",
    "\n",
    "    def _is_diffusion_overlapping_local(self, potential_nx, potential_ny, potential_radius, overlap_factor):\n",
    "        \"\"\"\n",
    "        Checks if a potential new node's diffusion circle overlaps \"too much\" with EXISTING nodes IN THE SAME TREE.\n",
    "        \"Too much overlap\" is defined by the overlap_factor.\n",
    "        \"\"\"\n",
    "        potential_center_x, potential_center_y = potential_nx + 0.5, potential_ny + 0.5\n",
    "\n",
    "        for ex, ey, er in self.diffusion_nodes_info:\n",
    "            # Skip checking against self if self is already in diffusion_nodes_info\n",
    "            if (ex, ey) == (self.x, self.y):\n",
    "                continue\n",
    "\n",
    "            existing_center_x, existing_center_y = ex + 0.5, ey + 0.5\n",
    "\n",
    "            # Calculate distance between centers\n",
    "            distance = np.sqrt((potential_center_x - existing_center_x) ** 2 + (potential_ny - existing_center_y) ** 2)\n",
    "\n",
    "            # Check for significant overlap\n",
    "            # If distance is less than a fraction of the sum of radii, it's too much overlap.\n",
    "            if distance < overlap_factor * (potential_radius + er):\n",
    "                return True  # Significant overlap detected\n",
    "        return False\n",
    "\n",
    "    def add_child_in_random_neighbor(self, child_value_prefix, max_node_radius, overlap_factor):\n",
    "        coordinates_neighbors = self.get_neighboring_coordinates()\n",
    "\n",
    "        # First, filter for unoccupied grid squares *within this tree*\n",
    "        available_square_neighbors = [coord for coord in coordinates_neighbors if\n",
    "                                      coord not in self.occupied_squares_set]\n",
    "\n",
    "        valid_child_candidates = []  # Store (nx, ny, child_radius) for candidates that pass overlap check\n",
    "\n",
    "        for nx, ny in available_square_neighbors:\n",
    "            # Generate potential radius for this child, ensuring it's not too large or small\n",
    "            child_radius = random.uniform(0.5, max_node_radius)\n",
    "            if not self._is_diffusion_overlapping_local(nx, ny, child_radius, overlap_factor):\n",
    "                valid_child_candidates.append((nx, ny, child_radius))\n",
    "\n",
    "        if not valid_child_candidates:\n",
    "            return None  # No available neighbors that satisfy both square and diffusion overlap conditions\n",
    "\n",
    "        # Choose a random valid candidate\n",
    "        chosen_nx, chosen_ny, chosen_child_radius = random.choice(valid_child_candidates)\n",
    "\n",
    "        child_value = f\"{child_value_prefix}_{len(self.children) + 1}\"\n",
    "        # Create child node; its __init__ will update occupied_squares_set and diffusion_nodes_info\n",
    "        child_node = SpatialTreeNode_Evolution_Diffusion6(child_value, chosen_nx, chosen_ny, chosen_child_radius,\n",
    "                                                            self.occupied_squares_set, self.diffusion_nodes_info)\n",
    "        self.add_child(child_node)\n",
    "        return child_node\n",
    "\n",
    "    def get_all_nodes(self):\n",
    "        all_nodes = []\n",
    "        stack = [self]\n",
    "        while stack:\n",
    "            node = stack.pop()\n",
    "            all_nodes.append(node)\n",
    "            for child in node.children:\n",
    "                stack.append(child)\n",
    "        return all_nodes\n",
    "\n",
    "    def __repr__(self):\n",
    "        return f\"SpatialTreeNode_Evolution_Diffusion(value={self.value}, x={self.x}, y={self.y}, R={self.radius:.2f}, children={{[child.value for child in self.children]!r}})\"\n",
    "\n",
    "\n",
    "# --- TREE GENERATION --- #\n",
    "\n",
    "def generate_random_spatial_tree_diffusion6(\n",
    "        max_depth, max_children, max_node_radius, initial_x, initial_y, node_prefix=\"Node\",\n",
    "        current_depth=0, parent_node=None, occupied_squares_set=None, diffusion_nodes_info=None, overlap_factor=0.7\n",
    "):\n",
    "    if occupied_squares_set is None:\n",
    "        occupied_squares_set = set()  # Initialize a new set for this tree's square coordinates\n",
    "    if diffusion_nodes_info is None:\n",
    "        diffusion_nodes_info = []  # Initialize a new list for this tree's node (x,y,radius) information\n",
    "\n",
    "    # Recursive approach for random tree generation\n",
    "    if parent_node is None:\n",
    "        node_value = f\"{node_prefix}_Root_{random.randint(0, 99)}\"\n",
    "        initial_radius = random.uniform(0.5, max_node_radius)\n",
    "        current_node = SpatialTreeNode_Evolution_Diffusion6(node_value, initial_x, initial_y, initial_radius, occupied_squares_set, diffusion_nodes_info)\n",
    "    else:\n",
    "        current_node = parent_node.add_child_in_random_neighbor(f\"{node_prefix}_{current_depth}\", max_node_radius, overlap_factor)\n",
    "        if current_node is None:\n",
    "            return None # Branch terminated if no available neighbor\n",
    "\n",
    "    if current_depth < max_depth:\n",
    "        num_children = random.randint(0, max_children) # Random number of children for this node\n",
    "        for _ in range(num_children):\n",
    "            generate_random_spatial_tree_diffusion6(\n",
    "                max_depth, max_children, max_node_radius, initial_x, initial_y, node_prefix,\n",
    "                current_depth + 1, current_node, occupied_squares_set, diffusion_nodes_info, overlap_factor\n",
    "            )\n",
    "    return current_node\n",
    "\n",
    "\n",
    "def update_nodes_info_for_tree6(tree_root):\n",
    "    # This function rebuilds the occupied_squares_set and diffusion_nodes_info for a tree\n",
    "    # This is necessary after deepcopy, mutation, or crossover to ensure consistency\n",
    "    # for the mutated/crossed-over part.\n",
    "    if tree_root is None:\n",
    "        return None\n",
    "\n",
    "    new_occupied_squares_set = set()\n",
    "    new_diffusion_nodes_info = []\n",
    "\n",
    "    # Traverse the tree to collect all current node info\n",
    "    stack = [tree_root]\n",
    "    visited = set()\n",
    "    while stack:\n",
    "        node = stack.pop()\n",
    "        # Avoid processing same node multiple times if tree structure has cycles (unlikely here but good practice)\n",
    "        if node in visited: continue\n",
    "        visited.add(node)\n",
    "\n",
    "        new_occupied_squares_set.add((node.x, node.y))\n",
    "        new_diffusion_nodes_info.append((node.x, node.y, node.radius))\n",
    "        for child in node.children:\n",
    "            stack.append(child)\n",
    "\n",
    "    # Now, update all nodes in the tree with the new references\n",
    "    stack = [tree_root]\n",
    "    visited.clear()\n",
    "    while stack:\n",
    "        node = stack.pop()\n",
    "        if node in visited: continue\n",
    "        visited.add(node)\n",
    "\n",
    "        node.occupied_squares_set = new_occupied_squares_set\n",
    "        node.diffusion_nodes_info = new_diffusion_nodes_info\n",
    "        for child in node.children:\n",
    "            stack.append(child)\n",
    "    return tree_root\n",
    "\n",
    "\n",
    "# --- ILLUMINATION AND FITNESS FUNCTIONS --- #\n",
    "\n",
    "def get_illuminated_area6(tree):\n",
    "    \"\"\"\n",
    "    Calculates the set of (x,y) integer coordinates illuminated by the tree using the\n",
    "    algebraic approach described in the text, based on intersections with horizontal\n",
    "    and vertical grid lines.\n",
    "    \"\"\"\n",
    "    if tree is None:\n",
    "        return set()\n",
    "\n",
    "    illuminated_coords = set()\n",
    "    all_nodes_in_tree = tree.get_all_nodes()\n",
    "\n",
    "    if not all_nodes_in_tree:\n",
    "        return set()\n",
    "\n",
    "    for node_i in all_nodes_in_tree:\n",
    "        circle_center_x = node_i.x + 0.5\n",
    "        circle_center_y = node_i.y + 0.5\n",
    "        r_sq = node_i.radius ** 2\n",
    "\n",
    "        # 1. Add the cell containing the center of the circle\n",
    "        illuminated_coords.add((math.floor(circle_center_x), math.floor(circle_center_y)))\n",
    "\n",
    "        # 2. Horizontal Scan: Check intersections with horizontal grid lines\n",
    "        for y_line in range(math.floor(circle_center_y - node_i.radius),\n",
    "                            math.ceil(circle_center_y + node_i.radius) + 1):\n",
    "            dy = y_line - circle_center_y\n",
    "            discriminant = r_sq - dy * dy\n",
    "\n",
    "            if discriminant >= 0:\n",
    "                dx = math.sqrt(discriminant)\n",
    "                x_min_intersect = circle_center_x - dx\n",
    "                x_max_intersect = circle_center_x + dx\n",
    "\n",
    "                for ix in range(math.floor(x_min_intersect), math.floor(x_max_intersect) + 1):\n",
    "                    illuminated_coords.add((ix, y_line))\n",
    "                    illuminated_coords.add((ix, y_line - 1))\n",
    "\n",
    "        # 3. Vertical Scan: Check intersections with vertical grid lines\n",
    "        for x_line in range(math.floor(circle_center_x - node_i.radius),\n",
    "                            math.ceil(circle_center_x + node_i.radius) + 1):\n",
    "            dx = x_line - circle_center_x\n",
    "            discriminant = r_sq - dx * dx\n",
    "\n",
    "            if discriminant >= 0:\n",
    "                dy = math.sqrt(discriminant)\n",
    "                y_min_intersect = circle_center_y - dy\n",
    "                y_max_intersect = circle_center_y + dy\n",
    "\n",
    "                for iy in range(math.floor(y_min_intersect), math.floor(y_max_intersect) + 1):\n",
    "                    illuminated_coords.add((x_line, iy))\n",
    "                    illuminated_coords.add((x_line - 1, iy))\n",
    "\n",
    "    return illuminated_coords\n",
    "\n",
    "\n",
    "def calculate_fitness_illumination6(candidate_tree_root, target_illuminated_area):\n",
    "    \"\"\"\n",
    "    Calculates fitness based on the symmetric difference between illuminated areas.\n",
    "    Fitness is 1.0 for a perfect match, and decreases as symmetric difference increases.\n",
    "    \"\"\"\n",
    "    if candidate_tree_root is None:\n",
    "        # If the tree generation failed, assign a very low fitness\n",
    "        return 0.0001  # A small non-zero value to avoid division by zero issues later\n",
    "\n",
    "    candidate_illuminated_area = get_illuminated_area6(candidate_tree_root)\n",
    "\n",
    "    # Symmetric difference: (A U B) - (A intersect B)\n",
    "    # Or, the elements in A, but not B, plus elements in B but not A.\n",
    "    symmetric_difference = candidate_illuminated_area.symmetric_difference(target_illuminated_area)\n",
    "\n",
    "    # Union size: used for normalization\n",
    "    union_size = len(candidate_illuminated_area.union(target_illuminated_area))\n",
    "\n",
    "    if union_size == 0:\n",
    "        if not target_illuminated_area and not candidate_illuminated_area:\n",
    "            return 1.0  # Perfect match if both are empty\n",
    "        else:\n",
    "            return 0.0001  # Should not happen if target is non-empty, but handles cases where both are empty but expected non-empty\n",
    "\n",
    "    # Fitness is 1.0 - (len(symmetric_difference) / union_size)\n",
    "    # This gives 1.0 for a perfect match (symmetric_difference_area = 0)\n",
    "    # and approaches 0.0 for large differences.\n",
    "    fitness = 1.0 - (len(symmetric_difference) / union_size)\n",
    "    return max(0.0001, fitness)  # Ensure fitness is always positive\n",
    "\n",
    "\n",
    "# --- EVOLUTIONARY ALGORITHM COMPONENTS --- #\n",
    "\n",
    "def create_initial_population_diffusion6(pop_size, max_depth, max_children, max_node_radius, initial_x, initial_y,\n",
    "                                         overlap_factor, node_prefix=\"Individual\"):\n",
    "    population = []\n",
    "    for i in range(pop_size):\n",
    "        # Each tree needs its own occupied_squares_set and diffusion_nodes_info for independent generation\n",
    "        occupied_squares = set()\n",
    "        diffusion_info = []\n",
    "        tree = generate_random_spatial_tree_diffusion6(\n",
    "            max_depth=max_depth, max_children=max_children, max_node_radius=max_node_radius,\n",
    "            initial_x=initial_x, initial_y=initial_y, node_prefix=f\"{node_prefix}_{i}\",\n",
    "            occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info, overlap_factor=overlap_factor\n",
    "        )\n",
    "        if tree:\n",
    "            population.append(tree)\n",
    "    # If not enough trees generated due to space constraints, fill with more random ones (or handle error)\n",
    "    while len(population) < pop_size:\n",
    "        occupied_squares = set()\n",
    "        diffusion_info = []\n",
    "        new_tree = generate_random_spatial_tree_diffusion6(\n",
    "            max_depth=max_depth, max_children=max_children, max_node_radius=max_node_radius,\n",
    "            initial_x=initial_x, initial_y=initial_y, node_prefix=f\"RandomFill_{len(population)}\",\n",
    "            occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info,\n",
    "            overlap_factor=overlap_factor\n",
    "        )\n",
    "        if new_tree:\n",
    "            population.append(new_tree)\n",
    "        else:\n",
    "            # Handle case where a new tree could not be generated\n",
    "            # This might happen if parameters are too restrictive or space is exhausted\n",
    "            break  # Exit if we can't generate enough valid trees\n",
    "    return population\n",
    "\n",
    "\n",
    "def select_parents_diffusion6(population, fitness_scores, num_parents):\n",
    "    parents = []\n",
    "    # Use roulette wheel selection or tournament selection. Tournament is generally robust.\n",
    "    for _ in range(num_parents):\n",
    "        tournament_size = min(5, len(population))\n",
    "        if tournament_size == 0:\n",
    "            break\n",
    "        tournament_candidates = random.sample(list(zip(population, fitness_scores)), tournament_size)\n",
    "        winner = max(tournament_candidates, key=lambda x: x[1])[0]\n",
    "        parents.append(winner)\n",
    "    return parents\n",
    "\n",
    "\n",
    "def mutate_tree_diffusion6(tree_root, max_depth, max_children, max_node_radius, mutation_rate, overlap_factor):\n",
    "    mutated_tree = copy.deepcopy(tree_root)  # Work on a deep copy\n",
    "    mutated_tree = update_nodes_info_for_tree6(mutated_tree) # Ensure info sets are consistent after deepcopy\n",
    "\n",
    "    all_nodes = mutated_tree.get_all_nodes()\n",
    "\n",
    "    if not all_nodes:\n",
    "        return mutated_tree\n",
    "\n",
    "    node_to_mutate = random.choice(all_nodes)\n",
    "\n",
    "    # Mutation 1: Add a child\n",
    "    if random.random() < mutation_rate:\n",
    "        # Ensure node_to_mutate has correct references to the tree's global sets\n",
    "        # which should be updated by update_nodes_info_for_tree already.\n",
    "        node_to_mutate.add_child_in_random_neighbor(\"MutatedChild\", max_node_radius, overlap_factor)\n",
    "        mutated_tree = update_nodes_info_for_tree6(mutated_tree) # Re-update after potential addition\n",
    "\n",
    "    # Mutation 2: Change node radius\n",
    "    if random.random() < mutation_rate:\n",
    "        node_to_mutate.radius = random.uniform(0.5, max_node_radius)\n",
    "\n",
    "    # Mutation 3: Remove a child (if any)\n",
    "    if random.random() < mutation_rate and node_to_mutate.children:\n",
    "        child_to_remove = random.choice(node_to_mutate.children)\n",
    "        node_to_mutate.children.remove(child_to_remove)\n",
    "        mutated_tree = update_nodes_info_for_tree6(mutated_tree) # Re-update after potential removal\n",
    "\n",
    "    return mutated_tree\n",
    "\n",
    "\n",
    "def crossover_trees_diffusion6(parent1_root, parent2_root, crossover_rate, max_node_radius, overlap_factor):\n",
    "    if random.random() > crossover_rate:\n",
    "        return copy.deepcopy(parent1_root), copy.deepcopy(parent2_root)\n",
    "\n",
    "    child1_root = copy.deepcopy(parent1_root)\n",
    "    child2_root = copy.deepcopy(parent2_root)\n",
    "\n",
    "    # Ensure consistency after deepcopy for both children\n",
    "    child1_root = update_nodes_info_for_tree6(child1_root)\n",
    "    child2_root = update_nodes_info_for_tree6(child2_root)\n",
    "\n",
    "    all_nodes_child1 = child1_root.get_all_nodes()\n",
    "    all_nodes_child2 = child2_root.get_all_nodes()\n",
    "\n",
    "    # Ensure there are nodes to swap beyond just the root\n",
    "    if len(all_nodes_child1) < 2 or len(all_nodes_child2) < 2:\n",
    "        return child1_root, child2_root\n",
    "\n",
    "    # Choose random nodes (not roots) to be crossover points\n",
    "    cross_point1 = random.choice([n for n in all_nodes_child1 if n != child1_root])\n",
    "    cross_point2 = random.choice([n for n in all_nodes_child2 if n != child2_root])\n",
    "\n",
    "    # Find parent of cross_point1 in child1_root tree\n",
    "    parent_cross_point1 = None\n",
    "    for node in all_nodes_child1:\n",
    "        if cross_point1 in node.children:\n",
    "            parent_cross_point1 = node\n",
    "            break\n",
    "\n",
    "    # Find parent of cross_point2 in child2_root tree\n",
    "    parent_cross_point2 = None\n",
    "    for node in all_nodes_child2:\n",
    "        if cross_point2 in node.children:\n",
    "            parent_cross_point2 = node\n",
    "            break\n",
    "\n",
    "    if parent_cross_point1 and parent_cross_point2:  # Perform swap\n",
    "        # Remove subtrees from parents\n",
    "        parent_cross_point1.children.remove(cross_point1)\n",
    "        parent_cross_point2.children.remove(cross_point2)\n",
    "\n",
    "        # Attach swapped subtrees\n",
    "        parent_cross_point1.add_child(cross_point2)\n",
    "        parent_cross_point2.add_child(cross_point1)\n",
    "\n",
    "        # After crossover, the `occupied_squares_set` and `diffusion_nodes_info` of the affected trees\n",
    "        # need to be re-synced across all nodes within each child tree.\n",
    "        child1_root = update_nodes_info_for_tree6(child1_root)\n",
    "        child2_root = update_nodes_info_for_tree6(child2_root)\n",
    "\n",
    "    return child1_root, child2_root\n",
    "\n",
    "\n",
    "# --- PLOTTING FUNCTIONS --- #\n",
    "\n",
    "def plot_illuminated_area6(ax, illuminated_coords, title, color='blue', alpha=0.5):\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "    if not illuminated_coords:\n",
    "        ax.set_title(title)\n",
    "        ax.grid(True)\n",
    "        return\n",
    "\n",
    "    for x, y in illuminated_coords:\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=color, alpha=alpha, edgecolor='black', linewidth=0.5)\n",
    "        ax.add_patch(rect)\n",
    "\n",
    "    min_x = min(c[0] for c in illuminated_coords) - 1\n",
    "    max_x = max(c[0] for c in illuminated_coords) + 2\n",
    "    min_y = min(c[1] for c in illuminated_coords) - 1\n",
    "    max_y = max(c[1] for c in illuminated_coords) + 2\n",
    "\n",
    "    ax.set_xlim(min_x, max_x)\n",
    "    ax.set_ylim(min_y, max_y)\n",
    "    ax.set_xticks(range(int(min_x), int(max_x)))\n",
    "    ax.set_yticks(range(int(min_y), int(max_y)))\n",
    "    ax.grid(True)\n",
    "    ax.set_title(title)\n",
    "\n",
    "\n",
    "def plot_tree_with_illumination6(tree_root, illuminated_coords, ax, tree_color='lightblue', diff_color='red', title=\"\"):\n",
    "\n",
    "    # Plot illuminated area first (background)\n",
    "    for x, y in illuminated_coords:\n",
    "        rect = patches.Rectangle((x, y), 1, 1, facecolor=diff_color, alpha=0.5,\n",
    "                                 zorder=0)  # Changed alpha for more transparency\n",
    "        ax.add_patch(rect)\n",
    "\n",
    "    if tree_root is None:\n",
    "        return\n",
    "\n",
    "    # Plot tree nodes and their diffusion circles\n",
    "    all_nodes = tree_root.get_all_nodes()\n",
    "    for node in all_nodes:\n",
    "        # Plot the square representing the cell\n",
    "        rect = patches.Rectangle((node.x, node.y), 1, 1, facecolor=tree_color, edgecolor='black', linewidth=1, zorder=1)\n",
    "        ax.add_patch(rect)\n",
    "        ax.text(node.x + 0.5, node.y + 0.5, node.value.split('_')[-1], ha='center', va='center', color='darkblue',\n",
    "                fontsize=7, zorder=2)\n",
    "\n",
    "        # Plot the circle representing the radius of influence\n",
    "        circle = patches.Circle((node.x + 0.5, node.y + 0.5), node.radius, color='red', alpha=0.2, zorder=2)\n",
    "        ax.add_patch(circle)\n",
    "\n",
    "    # Draw lines connecting parent to children\n",
    "    for node in all_nodes:\n",
    "        for child in node.children:\n",
    "            ax.plot([node.x + 0.5, child.x + 0.5], [node.y + 0.5, child.y + 0.5], 'k--', linewidth=0.8, zorder=3)\n",
    "\n",
    "    ax.set_aspect('equal', adjustable='box')\n",
    "    ax.set_title(title)\n",
    "\n",
    "    # Set plot limits based on the illuminated coordinates\n",
    "    if illuminated_coords:\n",
    "        all_x = [c[0] for c in illuminated_coords]\n",
    "        all_y = [c[1] for c in illuminated_coords]\n",
    "\n",
    "        min_x_val = min(all_x) - 1\n",
    "        max_x_val = max(all_x) + 2\n",
    "        min_y_val = min(all_y) - 1\n",
    "        max_y_val = max(all_y) + 2\n",
    "\n",
    "        ax.set_xlim(min_x_val, max_x_val)\n",
    "        ax.set_ylim(min_y_val, max_y_val)\n",
    "        ax.set_xticks(range(int(min_x_val), int(max_x_val)))\n",
    "        ax.set_yticks(range(int(min_y_val), int(max_y_val)))\n",
    "    ax.grid(True)\n",
    "\n",
    "\n",
    "# --- MAIN EVOLUTIONARY SIMULATION LOOP (adapted) --- #\n",
    "\n",
    "def _run_single_evolution_experiment6(target_tree_params, ga_params, print_progress=True):\n",
    "    # 1. Generate Target Tree and its Illuminated Area\n",
    "    if print_progress: print(\"\\n--- Generating Target Tree ---\")\n",
    "    random.seed(ga_params['seed'] + 1)  # Use a different seed for target generation\n",
    "    target_occupied_squares = set()\n",
    "    target_diffusion_info = []\n",
    "    target_tree_root = generate_random_spatial_tree_diffusion6(\n",
    "        max_depth=target_tree_params['max_depth'], max_children=target_tree_params['max_children'],\n",
    "        max_node_radius=target_tree_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "        node_prefix=\"Target\", occupied_squares_set=target_occupied_squares,\n",
    "        diffusion_nodes_info=target_diffusion_info, overlap_factor=target_tree_params['overlap_factor']\n",
    "    )\n",
    "\n",
    "    if not target_tree_root:\n",
    "        if print_progress: print(\"Failed to generate target tree. Returning 0 generations.\")\n",
    "        return 0, 0, None, None, [] # Return 0 generations, 0 nodes, None for trees and history\n",
    "\n",
    "    target_illuminated_area = get_illuminated_area6(target_tree_root)\n",
    "    num_target_nodes = len(target_tree_root.get_all_nodes())\n",
    "    if print_progress: print(f\"Target Tree Generated with {num_target_nodes} nodes. Illuminated area size: {len(target_illuminated_area)}\")\n",
    "\n",
    "    # 2. Initialize Population\n",
    "    random.seed(ga_params['seed'])  # Reset seed for GA population generation\n",
    "    if print_progress: print(f\"\\n--- Initializing Population of {ga_params['pop_size']} Trees ---\")\n",
    "    population = create_initial_population_diffusion6(\n",
    "        pop_size=ga_params['pop_size'], max_depth=ga_params['max_depth'], max_children=ga_params['max_children'],\n",
    "        max_node_radius=ga_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "        overlap_factor=ga_params['overlap_factor']\n",
    "    )\n",
    "    if print_progress: print(f\"Population initialized with {len(population)} individuals.\")\n",
    "\n",
    "    best_tree_overall = None\n",
    "    best_fitness_overall = -1.0\n",
    "    history = []\n",
    "    generations_taken = ga_params['generations'] # Default to max generations if not converged\n",
    "\n",
    "    # 3. Evolutionary Loop\n",
    "    if print_progress: print(f\"\\n--- Starting Evolutionary Loop for {ga_params['generations']} Generations ---\")\n",
    "    for generation in range(ga_params['generations']):\n",
    "        fitness_scores = [calculate_fitness_illumination6(tree, target_illuminated_area) for tree in population]\n",
    "\n",
    "        current_best_fitness = max(fitness_scores)\n",
    "        current_best_tree = population[np.argmax(fitness_scores)]\n",
    "\n",
    "        if current_best_fitness > best_fitness_overall:\n",
    "            best_fitness_overall = current_best_fitness\n",
    "            best_tree_overall = copy.deepcopy(current_best_tree)  # Deepcopy to save the best tree\n",
    "            best_tree_overall = update_nodes_info_for_tree6(best_tree_overall) # Ensure consistency\n",
    "\n",
    "        history.append(current_best_fitness)\n",
    "\n",
    "        if print_progress: print(f\"Generation {generation + 1}/{ga_params['generations']}: Best Fitness = {current_best_fitness:.4f} (Overall Best: {best_fitness_overall:.4f})\")\n",
    "\n",
    "        if best_fitness_overall >= 0.999:  # Almost perfect match\n",
    "            if print_progress: print(\"Target illumination achieved (or very close)! Stopping evolution.\")\n",
    "            generations_taken = generation + 1\n",
    "            break\n",
    "\n",
    "        # Selection\n",
    "        parents = select_parents_diffusion6(population, fitness_scores, ga_params['pop_size'] // 2)\n",
    "\n",
    "        # Create next generation\n",
    "        next_population = []\n",
    "        # Elitism: Keep the best individual from the current generation\n",
    "        if best_tree_overall and current_best_fitness == best_fitness_overall:  # Only if it's the current best in this generation\n",
    "            next_population.append(copy.deepcopy(current_best_tree))\n",
    "\n",
    "        while len(next_population) < ga_params['pop_size']:\n",
    "            if len(parents) < 2:  # Not enough parents for crossover, fill with new random trees\n",
    "                occupied_squares = set()\n",
    "                diffusion_info = []\n",
    "                new_tree = generate_random_spatial_tree_diffusion6(\n",
    "                    max_depth=ga_params['max_depth'], max_children=ga_params['max_children'],\n",
    "                    max_node_radius=ga_params['max_node_radius'], initial_x=0, initial_y=0,\n",
    "                    node_prefix=f\"RandomFill_{len(next_population)}\",\n",
    "                    occupied_squares_set=occupied_squares, diffusion_nodes_info=diffusion_info,\n",
    "                    overlap_factor=ga_params['overlap_factor']\n",
    "                )\n",
    "                if new_tree:\n",
    "                    next_population.append(new_tree)\n",
    "                continue\n",
    "\n",
    "            # Randomly pick two parents (can be the same parent multiple times with replacement for simplicity)\n",
    "            p1 = random.choice(parents)\n",
    "            p2 = random.choice(parents)\n",
    "\n",
    "            # Crossover\n",
    "            child1, child2 = crossover_trees_diffusion6(p1, p2, ga_params['crossover_rate'],\n",
    "                                                        ga_params['max_node_radius'], ga_params['overlap_factor'])\n",
    "\n",
    "            # Mutation\n",
    "            mutated_child1 = mutate_tree_diffusion6(child1, ga_params['max_depth'], ga_params['max_children'],\n",
    "                                                    ga_params['max_node_radius'], ga_params['mutation_rate'],\n",
    "                                                    ga_params['overlap_factor'])\n",
    "            mutated_child2 = mutate_tree_diffusion6(child2, ga_params['max_depth'], ga_params['max_children'],\n",
    "                                                    ga_params['max_node_radius'], ga_params['mutation_rate'],\n",
    "                                                    ga_params['overlap_factor'])\n",
    "\n",
    "            next_population.append(mutated_child1)\n",
    "            if len(next_population) < ga_params['pop_size']:\n",
    "                next_population.append(mutated_child2)\n",
    "\n",
    "        population = next_population[:ga_params['pop_size']]\n",
    "\n",
    "    if print_progress: print(\"\\n--- Evolution Finished ---\")\n",
    "    if print_progress: print(f\"Final Best Fitness: {best_fitness_overall:.4f}\")\n",
    "\n",
    "    return generations_taken, num_target_nodes, target_tree_root, best_tree_overall, history\n",
    "\n",
    "\n",
    "def study_evolution_cost6(target_complexity_configs, ga_params, num_runs_per_complexity=3):\n",
    "    results = []  # Stores (num_nodes, avg_generations)\n",
    "\n",
    "    print(\"\\n=== Starting Evolution Cost Study ===\")\n",
    "    print(f\"GA Parameters used for study: {ga_params}\")\n",
    "\n",
    "    for i, config in enumerate(target_complexity_configs):\n",
    "        target_tree_params = {\n",
    "            'max_depth': config['max_depth'],\n",
    "            'max_children': config['max_children'],\n",
    "            'max_node_radius': 3.0,  # Keep constant for now\n",
    "            'overlap_factor': 0.7  # Keep constant for now\n",
    "        }\n",
    "\n",
    "        print(f\"\\n--- Studying Target Tree Complexity Config {i+1}/{len(target_complexity_configs)} ---\")\n",
    "        print(f\"  Target Tree Params: Max Depth={config['max_depth']}, Max Children={config['max_children']}\")\n",
    "\n",
    "        generations_list = []\n",
    "        num_nodes_for_this_config = []\n",
    "        for run in range(num_runs_per_complexity):\n",
    "            print(f\"  Run {run+1}/{num_runs_per_complexity} for this complexity...\")\n",
    "            # Vary seed for each run to get different initial populations and target trees\n",
    "            ga_params['seed'] = random.randint(0, 100000)\n",
    "\n",
    "            generations, num_nodes, _, _, _ = _run_single_evolution_experiment6(target_tree_params, ga_params, print_progress=False)\n",
    "\n",
    "            if generations > 0 and num_nodes > 0: # Only record valid runs\n",
    "                generations_list.append(generations)\n",
    "                num_nodes_for_this_config.append(num_nodes)\n",
    "\n",
    "        if generations_list:\n",
    "            avg_generations = np.mean(generations_list)\n",
    "            # Take the average or median number of nodes if they varied across runs,\n",
    "            # or just the first one if they are expected to be similar.\n",
    "            avg_num_nodes = np.mean(num_nodes_for_this_config)\n",
    "            results.append({'num_nodes': avg_num_nodes, 'avg_generations': avg_generations})\n",
    "            print(f\"  Average Generations: {avg_generations:.2f}, Average Nodes: {avg_num_nodes:.2f}\")\n",
    "        else:\n",
    "            print(\"  No successful runs for this complexity config.\")\n",
    "\n",
    "    # Sort results by number of nodes for better plotting\n",
    "    results.sort(key=lambda x: x['num_nodes'])\n",
    "\n",
    "    # Plotting\n",
    "    if results:\n",
    "        node_counts = [res['num_nodes'] for res in results]\n",
    "        avg_gens = [res['avg_generations'] for res in results]\n",
    "\n",
    "        plt.figure(figsize=(10, 6))\n",
    "        plt.plot(node_counts, avg_gens, marker='o', linestyle='-', color='blue')\n",
    "        plt.title('Evolutionary Cost (Generations) vs. Target Tree Complexity (Nodes)')\n",
    "        plt.xlabel('Average Number of Nodes in Target Tree (n)')\n",
    "        plt.ylabel('Average Generations to Achieve >= 0.999 Fitness')\n",
    "        plt.grid(True)\n",
    "        plt.show()\n",
    "    else:\n",
    "        print(\"No data to plot for evolution cost.\")\n",
    "\n",
    "    return results\n",
    "\n",
    "\n",
    "# --- MAIN EXECUTION --- #\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "\n",
    "      # Define a range of target tree complexities to study\n",
    "    # This will generate target trees of increasing node counts\n",
    "\n",
    "    target_complexity_configs = [\n",
    "        {'max_depth': 1, 'max_children': 1},\n",
    "        {'max_depth': 2, 'max_children': 1},\n",
    "        {'max_depth': 2, 'max_children': 2},\n",
    "        {'max_depth': 3, 'max_children': 1},\n",
    "        {'max_depth': 3, 'max_children': 2},\n",
    "        {'max_depth': 3, 'max_children': 3}\n",
    "    ]\n",
    "\n",
    "    '''\n",
    "    # Define a range of target tree complexities to study\n",
    "    # This will generate target trees of increasing node counts\n",
    "    # Add complexity with care because the program may not converge to a solution.\n",
    "\n",
    "    # Define a range of target tree complexities to study\n",
    "    # This will generate target trees of increasing node counts\n",
    "    target_complexity_configs = [\n",
    "        {'max_depth': 1, 'max_children': 1},\n",
    "        {'max_depth': 2, 'max_children': 1},\n",
    "        {'max_depth': 2, 'max_children': 2},\n",
    "        {'max_depth': 3, 'max_children': 1},\n",
    "        {'max_depth': 3, 'max_children': 2},\n",
    "        {'max_depth': 3, 'max_children': 3},\n",
    "        {'max_depth': 4, 'max_children': 1},\n",
    "        {'max_depth': 4, 'max_children': 2},\n",
    "        {'max_depth': 4, 'max_children': 3},\n",
    "        {'max_depth': 4, 'max_children': 4},\n",
    "        {'max_depth': 5, 'max_children': 1},\n",
    "        {'max_depth': 5, 'max_children': 2},\n",
    "        {'max_depth': 5, 'max_children': 3},\n",
    "        {'max_depth': 5, 'max_children': 4},\n",
    "        {'max_depth': 5, 'max_children': 5},\n",
    "        {'max_depth': 7, 'max_children': 3},\n",
    "        {'max_depth': 10, 'max_children': 4},\n",
    "        {'max_depth': 20, 'max_children': 5},\n",
    "        {'max_depth': 30, 'max_children': 6},\n",
    "        {'max_depth': 50, 'max_children': 5},\n",
    "        {'max_depth': 100, 'max_children': 5}\n",
    "    ]\n",
    "    '''\n",
    "\n",
    "    # Parameters for the Genetic Algorithm (kept constant across target complexities)\n",
    "    ga_params_for_study = {\n",
    "        'seed': 12345, # Initial seed, will be varied per run\n",
    "        'pop_size': 50,\n",
    "        'generations': 200, # Max generations to allow for convergence\n",
    "        'max_depth': 4, # Max depth for evolved trees\n",
    "        'max_children': 3, # Max children for evolved trees\n",
    "        'max_node_radius': 3.0,\n",
    "        'mutation_rate': 0.1,\n",
    "        'crossover_rate': 0.7,\n",
    "        'overlap_factor': 0.7\n",
    "    }\n",
    "\n",
    "    num_runs_per_complexity = 5 # Number of times to run GA for each target tree complexity\n",
    "\n",
    "    cost_study_results = study_evolution_cost6(\n",
    "        target_complexity_configs,\n",
    "        ga_params_for_study,\n",
    "        num_runs_per_complexity\n",
    "    )\n",
    "\n",
    "    print(\"\\nCost Study Results:\")\n",
    "    for res in cost_study_results:\n",
    "        print(f\"  Nodes: {res['num_nodes']:.2f}, Avg. Generations: {res['avg_generations']:.2f}\")\n",
    "\n",
    "    # Optional: You can still run the full plotting of a single evolution if needed for detailed visualization\n",
    "    # For example, for the last target complexity studied\n",
    "    # final_target_tree_params = target_complexity_configs[-1]\n",
    "    # generations_taken, num_target_nodes, target_tree, evolved_best_tree, history = _run_single_evolution_experiment(\n",
    "    #     {'max_depth': final_target_tree_params['max_depth'], 'max_children': final_target_tree_params['max_children'], 'max_node_radius': 3.0, 'overlap_factor': 0.7},\n",
    "    #     ga_params_for_study,\n",
    "    #     print_progress=True\n",
    "    # )\n",
    "\n",
    "    # if target_tree and evolved_best_tree:\n",
    "    #     fig, axes = plt.subplots(1, 3, figsize=(24, 8))\n",
    "\n",
    "    #     plot_tree_with_illumination(target_tree, get_illuminated_area(target_tree), axes[0], tree_color='skyblue', diff_color='green', title=\"Target Tree and Illuminated Area\")\n",
    "    #     evolved_best_area = get_illuminated_area(evolved_best_tree)\n",
    "    #     plot_tree_with_illumination(evolved_best_tree, evolved_best_area, axes[1], tree_color='lightcoral', diff_color='purple', title=f\"Best Evolved Tree (Fitness: {evolved_best_tree:.4f})\")\n",
    "    #     symmetric_diff_area = get_illuminated_area(target_tree).symmetric_difference(evolved_best_area)\n",
    "    #     plot_illuminated_area(axes[2], symmetric_diff_area, title=f\"Symmetric Difference (Error Area: {len(symmetric_diff_area)})\")\n",
    "\n",
    "    #     plt.tight_layout()\n",
    "    #     plt.show()\n",
    "\n",
    "    #     plt.figure(figsize=(10, 6))\n",
    "    #     plt.plot(history, marker='o', linestyle='-', color='blue')\n",
    "    #     plt.title('Best Fitness Progression Over Generations')\n",
    "    #     plt.xlabel('Generation')\n",
    "    #     plt.ylabel('Fitness')\n",
    "    #     plt.grid(True)\n",
    "    #     plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VyTuIPkoAo5e"
   },
   "source": [
    "**Observation.** The program runs perfectly.\n",
    "\n",
    "**Protest.** Previous programs run very slowly: tiny exercises last half an hour. They are not appropriate for a serious study of the Evolution of morphology. So, the evolutionary stability of morph-trees cannot be asserted. Something goes wrong with us. What shall we do?\n",
    "\n",
    "**A change is needed.** Some options are the following:\n",
    "- Modify or change the promising Lightning Network Model.\n",
    "- Substitute the very expensive Node class that we have used to encode trees.\n",
    "- Detect and fine tune or change the procedures that fiercely burn time or memory.\n",
    "- Clearly understand why crossover causes disruption of the shape.\n",
    "\n",
    "These options will be examined in the next contribution.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# CONCLUSION\n",
    "\n",
    "We have formulated concrete models of morphogenesis based on the following two premises:\n",
    "1. Like begets like. For this reason, some properties of morphogenesis must be encoded in the DNA, produce inheritance and be subject to Evolution.\n",
    "2. Morphology shall be a modulation of the cellular reproductive process, which is naturally depicted by a tree.\n",
    "\n",
    "To begin with, we proposed the Printing Model in which the position of each cell is fully determined by the genetic program. We rapidly discovered that this model burns too much time and memory, so, it is not suitable to explain the existence of the liver with millions of cells.\n",
    "\n",
    "Motivated by the literature, we examined the possibility to explain morphology with messengers that are expelled by specialized cells that are along a reproductive sub-tree, and whose action is felt by every cell around which the concentration of the messenger is above a certain threshold. This is the *Lighting Network Model*. It is called so because each center of production of messengers is like a lamp that is fed by a network in the form of a tree, and that illuminates a region wherever the light intensity is above a given threshold. We like this model. We predicted that this model is prey of pleiotropy. That is why, it must be reticent to evolve. Its simulation was spectacularly speeded with the help of some mathematical trickery, but, anyway, it continues to produce children that are far away from their father. We dislike this. Imagine that we had the heart divided in two parts, one inside the chest and the other down under the left foot. Disruption might be remedied by large population sizes of almost dying organisms. But this is not what we see around us. So, we are trapped amidst technical and scientific problems. Hence, the work continues. \n"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "authorship_tag": "ABX9TyMS1y9lLdC5fSBcHByj9d6P",
   "provenance": [],
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "Python 3",
   "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.14.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
