# EvoDevo: Bioinspired Generative Design via Evolutionary Graph-Based Development
## 3 Proposed Method
### Normalising Inputs
Figure 5: Influence of initial mutation rate \(\varepsilon_{0}=0\) and taper coefficient \(\varepsilon_{\text{tap}}=0.4\) on overall mutation rate over evolutionary generations. Figure 6: Seedling in single-load (17.0 kN) case environment with 9 nodes and 15 edges. sums: (i) the _Edge-neigh sum_ (\(A_{NE}E\)), which adds the strain energy and volume of all edges connected to the vertex, and (ii) the _Node-neigh sum_\(A_{N}N\), which adds the \(x,y\) coordinates of the neighbouring vertices. Then, these two vectors are concatenated. The vertex and the neighbour features are linearly projected by \(W_{0}\in\mathbb{R}^{2\times 2}\) and \(W_{1}\in\mathbb{R}^{4\times 2}\), respectively. Then, these two results are added with bias \(b_{0}\). \[\mathbf{h}_{i}\ =\ \text{LReLU}\big{(}W_{0}\,\mathbf{n}_{i}\ +\ W_{1}\big{[}\,A_{NE}E \parallel A_{N}N\big{]}_{i}\ +\ b_{0}\big{)} \tag{8}\]

The matrices \(W_{0}\), \(W_{1}\) and \(W_{2}\) with the biases \(b_{0}\) and \(b_{1}\) are considered the learnable parameters, evolved by the GA during the optimisation process. The output with weights \(W_{2}\in\mathbb{R}^{2\times 2}\) and bias \(b_{1}\), followed by a tanh function, produces the vertex movements \((\Delta x_{i},\Delta y_{i})\). \[(\Delta x_{i},\Delta y_{i})=\text{tanh}\big{(}W_{2}\,\mathbf{h}_{i}+b_{1} \big{)} \tag{9}\]

The _edge-only_ GNN (Figure 8) calculates the cross-sectional update \((\Delta A_{j})\) for each edge of the truss. Each member starts with the feature vector \(\mathbf{e}_{j}=[\text{SE}_{j},V_{j}]^{\top}\), including the strain energy and volume. The raw edge features are mapped by \(W_{0}\in\mathbb{R}^{2\times 2}\), and the summed features of adjacent members, \((A_{E}E)_{j}\), are transformed by \(W_{1}\in\mathbb{R}^{2\times 2}\). These two results are added together; a bias \(b_{0}\) is also included, and the whole output goes through a leaky ReLU function:

\[\mathbf{h}_{j}\ =\ \text{LReLU}\big{(}W_{0}\,\mathbf{e}_{j}\ +\ W_{1}\,(A_{E}E)_{j}\ +\ b_{0}\big{)}. \tag{10}\]

The final linear layer with weights \(W_{2}\in\mathbb{R}^{2\times 1}\) and bias \(b_{1}\in\mathbb{R}\), followed by a tanh activation function, calculates the cross-sectional area for each edge member (\(j\)):

\[\Delta A_{j}=\text{tanh}\big{(}W_{2}\,\mathbf{h}_{j}+b_{1}\big{)}. \tag{11}\]

Figure 8: The edge-only GNN: This combines strain energy, volume and neighbour features and then uses linear projections, a leaky ReLU and a final tanh  function to output the cross-sectional area update \((\Delta A_{i})\). The weight matrices form the evolvable genome. Figure 7: The node-only GNN: This combines coordinates and aggregated neighbour/edge features and then uses linear projections, a leaky ReLU and a final linear tanh  function to output \((\Delta x_{i},\Delta y_{i})\). The weight matrices form the evolvable genome. Finally, Figure 9 shows two parallel GNN controllers for the node-edge method. It consists of two node-only and edge-only methods that update the edge cross-sectional area \(\Delta A_{j}\) and joints \((\Delta x_{i},\Delta y_{i})\) in parallel. \[ \begin{split}\mathbf{h}_{j}^{E}&=\text{LReLU}\big{(} W_{0}\,\mathbf{e}_{j}+W_{1}(A_{E}E)_{j}+b_{0}\big{)},\\ \Delta A_{j}&=10\,\tanh\!\big{(}W_{4}\,\mathbf{h}_{ j}^{E}+b_{4}\big{)}\\ \mathbf{h}_{i}^{N}&=\text{LReLU}\big{(}W_{2}\, \mathbf{n}_{i}+W_{3}\big{[}A_{NE}E\,\|\,A_{N}N\big{]}_{i}+b_{2}\big{)},\\ (\Delta x_{i},\Delta y_{i})&=10\,\tanh\!\big{(}W_{5} \,\mathbf{h}_{i}^{N}+b_{5}\big{)}\end{split}  \tag{12}\]

where \(\mathbf{e}_{j}=[\text{SE}_{j},V_{j}]^{\top}\) and \(\mathbf{n}_{i}=[x_{i},y_{i}]^{\top}\). In addition, the dashed grey arrow in Figure 9 defines the one-way path (\(A_{NE}E\)) from edges to nodes; concluding the edge branch itself does not depend on node data during the process. All six weight matrices and four biases are learnable parameters that the GA tunes during the optimisation process. In the CGP implementation, three methods are employed: node, edge, and node-edge methods.