Вы здесь

Алгоритм формирования отряда

  1. Подготовка начальных условий
    1. 1. Вычисляем текущую доступную армию.
    2. 2. Выбираем из шаблона минимальную и максимальную грузоподъемность. Если какой-либо из этих параметров = 0, то контроль по этой границе не производится. Если на входе алгоритма задана желаемая грузоподъемность (в случае формирования отряда для грабежа — это сумма ресурсов, которые предполагается вынести с цели), то в качестве максимальной грузоподъемности берется минимум из желаемой и максимальной грузоподъемности.
  2. Основной цикл алгоритма
    1. 1. Выбираем очередной слот.
    2. 2. Цикл по строкам слота
      1. 2. 1. Выбираем очередной юнит. Если такого юнита нет в доступной армии, то переходим к следующей итерации (поз. 2.2.1)
      2. 2. 2. Определяем количество доступных юнитов. Если в строке задано минимальное количество > 0, то сравниваем текущее количество с минимальным. Если текущее количество меньше минимального, то переходим к следующей итерации. Если в строке задано максимальное количество юнитов > 0 и текущее количество больше максимального, то за текущее количество принимаем максимальное количество из строки.
      3. 2. 3. Если у слота задано максимальное количество юнитов, то сравниваем сумму достигнутого количества юнитов и текущего количества с максимальным количеством слота. Если превышаем границу – уменьшаем текущее количество. Если при этом получили количество меньше минимального для слота, то слот игнорируем и переходим к следующей итерации.
      4. 2. 4. Учет грузоподъемности. Если суммарная набранная грузоподъемность отряда текущего слота превысила текущую максимальную грузоподъемность, то количество юнитов уменьшается для достижения границы грузоподъемности. Если после уменьшения количество юнитов стало меньше минимального для текущей строки количества, то текущее количество юнитов делается равным минимальной границе.
      5. 2. 5. Если полученное на предыдущих шагах количество текущих юнитов больше нуля, то юниты удаляются из текущей армии и добавляются в результирующий отряд. Если тип слота «Один из», то производится выход из цикла.
      6. 2. 6. Если достигли границы грузоподъемности, то выход из цикла.
    3. 3. Если суммарный размер сформированного отряда для данного слота меньше минимального количества юнитов слота, то полученный отряд и текущий слот игнорируем. Переходим к следующему слоту (поз. 2.1)
    4. 4. Если ведем контроль грузоподъемности, то уменьшаем текущую границу грузоподъемности на грузоподъемность текущего отряда. Если достигли нуля, завершаем итерации цикла по слотам.
    5. 5. Если текущая армия не пуста, переходим к следующему слоту.
  3. Постобработка.
    1. 1. Если у шаблона отряда задана положительная минимальная грузоподъемность и грузоподъемность сформированного отряда меньше этой минимальной величины, то отряд очищаем и выдаем сообщение о нехватке грузоподъемности.