@dataclass class PacketCreator: # В данном классе метод _run_until_zero() заменить на предложенный ниже. Если слишком много фонарей и не получается сгенерировать подходящий вариант, то увеличиваем счетчики исходов на 1, предоставляя немного дополнительного маневра. Обычно зацикливание происходит когда не хватает лишь 1 вараинта для пакета. def _run_until_zero(self): # функция основной логики формирования пакета history = self.incomming_variants.copy() loop_counter = 0 while len(history) < (len(self.incomming_variants) + self.packet_size): step_indices = self._generate_candidate() if not step_indices: break step_variant = ''.join(WAYS_LIST_1X2[i] for i in step_indices) loop_counter += 1 if loop_counter > self.packet_size * 3: self._ways_count_dec = [[(x + 1) for x in row] for row in self._ways_count_dec] if check_candidate(current_candidate=step_variant, checked_candidates=history, distance=self._distance): history.append(step_variant) # если вариант подходит, добавляем в финальный пакет decrement_weights(ways_counts=self._ways_count_dec, step_indices=step_indices) else: continue return history