def get_simulation(self,genome: Genome): unpacked_gene_list = list(genome.pattern) holder_list = [] container_list = [self.container] while len(unpacked_gene_list) >0: selected_gene = unpacked_gene_list[0] candidate_holder = [] for each_container in container_list: result = each_container.fit_orientation(selected_gene.box, selected_gene.orientation) if not result is None: candidate_holder.append(result) if len(candidate_holder) <=0: return [], [] else: candidate_holder.sort(key=functools.cmp_to_key(Coordinate.cmp_coordinate), reverse = True) # print(len(holder_list),candidate_holder) the_holder = candidate_holder.pop(0) remain_space = [] for each_container in container_list: if each_container.is_empty(): container_list.remove(each_container) for each_container in container_list: if Coordinate.cmp_coordinate(each_container, the_holder) == 0: remain_space.extend(each_container.get_free_space(the_holder)) container_list.remove(each_container) for each_container in container_list: if each_container.is_empty(): container_list.remove(each_container) # merge space to increase the space utility for each_container in container_list: for candidate_space in remain_space: if Container.merge(each_container,candidate_space): remain_space.remove(candidate_space) container_list.extend(remain_space) holder_list.append(the_holder) unpacked_gene_list.pop(0) return holder_list, container_list