2015-12-28 5 views
1

Создание программного обеспечения для планирования лиг и математический вопрос, что мне нужно немного помочь оборачивать голову.Перестановки в расписании лиги

Скажите, что у вас есть 4 команды (для простоты), и вы проверяете каждую возможную перестановку 1,2,3,4. Эта перестановка называется только первой неделей, которая дает вам 24 возможных перестановки.

1,2,3,4 - это перестановка и говорят, что неделя 1 1X4 - игра 2X3 - это игра. Неделя Две комбинации игры устанавливаются с помощью круглой магии, поэтому 4,1,2,3 вверх; 4X3 1X2 - игра.

Мой вопрос в том, что если комбинация игр в две недели не работает (из-за ограничений), но вместо этого будет выполняться порядок 3,4,1,2, если это будет проверено, выполнив перестановку на 1-й неделе? то есть неделя 1 была 1,2,3,4 неделя 2 была 3,4,1,2

Или мне нужно переставить неделю 1, а затем переставить неделю 2 и так далее и так далее, чтобы фактически получить все возможные расписания. Моя кишка говорит мне, что мне действительно нужно переставлять каждую неделю, чтобы фактически получить все возможные перестановки в расписании.

EDIT: Я спрашиваю, если четыре недели будет мой перестановками калькулятор будет 24 * 24 * 24 * 24 не только 24.

+0

Есть ли причина, по которой вы не будете вычислять все перестановки, но их в массиве, и удалить те, которые не передают ваши дополнительные ограничения? В остальном я не совсем понимаю ваш вопрос. – trincot

+0

Да, в 11 командах вы смотрите около 39 миллионов перестановок, которые просто невозможно. – Stevenfowler16

+0

Сколько недель вам нужно запланировать? – trincot

ответ

1

Чтобы ответить на ваш вопрос напрямую, просто проверка всех перестановок на неделю 1 не обязательно приведет к проверке всех возможных перестановок. Протестируйте несколько простых образцов, и вы увидите это довольно быстро.

Мне кажется, что вам нужен стандартный алгоритм Backtracking. Они предназначены именно для этих типов проблем с ограничениями.

Общий вид будет что-то вроде

function permutation 
    if all current matches satisfy constraints 
     if any weeks remaining to be allocated 
      for each possible match for next week 
       call permutation with that match added 
     else 
      accept this solution 

Предположения о том, что имеется достаточное количество ограничений, что несколько перестановок будут законными. Однако, если много перестановок являются законными, тогда процесс принятия решений должен будет учитывать это в том, как они обрабатываются.

+0

Вот как я думал о том, что нужно каждую неделю переписывать перестановку, чтобы найти все возможные решения. – Stevenfowler16

+0

Что делать, если ограничений недостаточно?Для многих перестановок для памяти? – Stevenfowler16

+0

Да, я не думаю, что у вас есть альтернатива. Однако до тех пор, пока вы используете алгоритм обратного отслеживания, он сократит ветки, которые как можно раньше нарушают ваши ограничения. Это также имеет преимущество вывода решений по мере их поступления. – sprinter

1

Насколько я обеспокоен это решение может помочь вам.
Сначала вы берете ввод, который является неделей от пользователя. После этого вы вычисляете перестановку недели.
И, наконец, умножьте силу недели.

public class Schedule { 

    public static void main(String[] args) { 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Enter week"); 
     int x = scan.nextInt(); 
     int y = (int) Math.pow(permutation(x), x); 
     System.out.println(y); 
    } 

    public static int permutation(int week) { 
     int y; 
     if (week == 1) { 
      return 1; 
     } else { 
      y = week * permutation(week - 1); 
     } 
     return y; 
    } 
} 
+0

OP ссылается на ограничения. Другими словами, это не просто простая комбинаторная проблема: каждая комбинация должна быть проверена, чтобы определить, нарушено ли ограничение. – sprinter

Смежные вопросы