The GA started with an initial random population of 32 molecules. During initial generation of molecules or child generation, the molecule can have a symmetrical or asymmetrical arrangement of units. Once each molecule is generated, it undergoes force field geometry optimization with RDKit and then further optimization with GFN2-xTB . This molecule also undergoes calculations with sTD-DFT-xTB for optical properties and xTB for solvation energies. The fitness of each molecule is scored using the OPEP2 model (ensemble RF + NN), and the PCE is predicted for each NFA paired with the 214 donors in the OPEP2 data set. The highest predicted PCE is used as the fitness score. For repopulating the next generation, elitism, parent crossover, and mutation is performed. Elitism is set to 50%, meaning the top 50% of NFAs are passed to the next generation unchanged. Parent selection is randomly selected from the elite NFAs. Crossover involves randomly selecting the terminal and core units from the parents to produce a "child" molecule. Each child has a 40% chance of mutation, with the mutation either changing the symmetry of the arrangement of units, or replacing a unit. The GA undergoes this cycle of parent selection, crossover, and mutation until 100 generations have occurred or the GA converged (approximately 30 generations).