2017-01-22 2 views
0

Я заранее извиняюсь за длинный вопрос, я попытался обобщить его как можно больше.Алгоритм для поиска наиболее оптимального соответствия нескольких групп объектов

Я разрабатываю приложение для лиги единоборств.
первый модуль приложения. Требуется разработать сложный алгоритм для организации турнира, то есть организовать n участников в скобки размером x (например, 4 участника в каждой скобке).
Кронштейны должны быть расположены наиболее оптимальным образом против нескольких условий.

Каждый участник имеет несколько параметров:

  • пояс (степень масштаба в боевое искусство, которое может быть переведено в числа)
  • Весовая категория (например, 60-70 кг, 80-90 кг ...)
  • Возрастная категория (например, 16-18, 18-25, 26-36 ...)
  • название академии (цель этого параметра, чтобы максимальное отклонение внутри скобок)
  • допускается к участию в отношении другого участника, который имеет один ранг ремня над ним (истина, ложь)
  • допускается к участию в отношении участника, который один вес категория над ним (истина, ложь)
  • Is к участию допускаются против участника, который один век категория над ним (правда, ложь)

условия:

Каждая «оптимальная» скобка имеет x участников, которые имеют один и тот же пояс, весовую категорию, возрастную категорию, и все они должны иметь максимальную дисперсию параметра имени академии.

Если есть участники, которые не могут вписаться в условия выше, и они остались без скобки или они могут поместиться только в кронштейн размером x-y, тогда алгоритм должен сделать наилучший («лучший») описанные ниже) и заменяет участников в «идеальных» скобках в соответствии с последними 3 булевыми параметрами.
Также после всех замен необходимо иметь место различие между именами академии.

Мой вопрос в том, что является лучшим подходом к решению этой проблемы? Буду благодарен за некоторые этапы или ссылку на какую-то математическую литературу, которая обсуждает такие проблемы (я не ожидаю, что кто-нибудь решит это для меня, просто руководствуясь).

моя общая точка зрения, как ее решить:

ранга всего кронштейн с сортом, а затем относятся к общей степени всех скобок.

, например, «совершенный» скобка 4 участников будет причислить Z и вес отсутствия имени академии дисперсии будет причислить (см желтый заметный пункт для более подробного объяснения)
–(17X<Z) так что если 2 участника поделиться то же название академии будет Z-(17X<Z), и если у 3 участников будет одинаковое имя академии и т. д.

Если кронштейн будет или/не совпадает с отсутствием соответствия между их поясами, весовой категории или возрастной категорией, уменьшить с другим –(17X<Z).

важное правило о том, что дом с самым «плохим» класса предпочтительнее против не кронштейну на всех

(его 17X, поскольку максимальная разница с условием академии в кронштейне 4 является 4X и максимальная разница в возрастной категории - еще 4X и , остальные «плохие соединения» между участниками - 16, и я добавляю 1 , чтобы произвести оценку, превышающую 0 или меньше Z).

Это легкая часть, но я пришел к выводу, что если я хочу, «лучший» или оптимальный сорт мне нужно будет рекурсивно повторять огромное и невозможное количество раз для того, чтобы достигнуть большего общего класса всех скобок и, наконец, достичь оптимального общего класса.

Я совсем не уверен в этом, возможно, требуется другое мышление.
его не так важно, но для общих знаний язык разработки C#.
Большое спасибо за ваше время и внимание.

+0

Вы почти наверняка более усложняет эту проблему. Я бы посоветовал вам сделать инъекцию в разных алгоритмах и начать с простого. – duffymo

+0

Насколько велика вероятность 'N'? Я прошу, потому что, как только вы применяете ограничения выбора (связанные с поясом, весом, возрастом), проблема может быть поддающейся грубой силе. Если это так, вам просто нужна функция подсчета очков, чтобы присвоить номер любому заданному набору скобок. Затем просто перебирайте каждый законный набор и выбирайте лучший. – FMc

+0

@ FMc tnx для вашего комментария, N ~ 400 в среднем, я понимаю, что вы имеете в виду, но задача состоит в том, чтобы найти наилучшую общую комбинацию. – jonathana

ответ

0

ОК, после некоторого исследования я получил ответ.
ответ, что ответа нет, его P versus NP problem. одна из нерешенных проблем в информатике. , чтобы найти самый оптимальный матч, - это найти самый совершенный абсолютный правый ход в шахматной игре - это невозможно.

из Википедии:

Неформальный термин быстро, используемый выше, означает существование алгоритма решения задачи, которая работает за полиномиальное время, такую, что времени для выполнения задачи изменяется полиномиальная функция по размеру ввода в алгоритм (в отличие от, скажем, экспоненциального времени). Общий класс вопросов, для которых некоторый алгоритм может дать ответ в полиномиальное время, называется «класс P» или просто «P». Для некоторых вопросов нет известного способа быстро найти ответ, но если один снабжен информацией, показывающей, что является ответом, то можно быстро найти ответ на вопрос . Класс вопросов для , ответ которого можно проверить в полиномиальное время, называется NP, который означает «недетерминированное полиномиальное время».

вот хорошее видео по этой теме: P vs. NP and the Computational Complexity Zoo

1

Простой несовершенный подход: попытайтесь присвоить значение каждому человеку, чтобы представить, насколько сложно найти совпадение. Самым трудным будет самый низкий вес, пояс и возраст, которые не могут быть сопоставлены, что означало бы, что они должны быть сопоставлены с людьми того же самого пояса/возраста/веса. Нормализовать каждое значение до шкалы 0-n (поэтому возрастная группа 5-9 = 0, 10-14 = 1 и т. Д.). Присвоить значение лиц, которые должны быть сумма этих, так:

Age 15  +2 
Belt Yellow +1 
Weight 110 +3 
Yes   +.5 
Yes   +.5 
No   +0 
Score=7.0 

Следующая определить функцию, чтобы определить разницу между 2 игроками, которые не будет простым вычитанием выше - вы не хотите кого-то 10-летний ярус 4-го уровня соответствует 28-м ярусу. Ваша разница функция будет что-то вроде:

int diff(Person p1, Person p2) 
{ 
    var diff = 0.0f; 
    bool ageDiffAcceptable = p1.Age - p2.Age == 1 && p2.CanPlayerOlder || p2.Age - p1.Age == 1 && p2.CanPlayerOlder; 
    var ageDiff = (p1.Age - p2.Age) * (ageDiffAcceptable ? 1 : 1.5); 
    diff += pow(agDiff, 2) // Someone that is 2 age groups away will increase at a higher rate; adjust this 2 based on the importance of this particular field 

    // Same for weight and belt 

    // Account for player score - we want to prefer similarly scored players as a tiebreaker 
    diff += abs(p1.Score - p2.Score)/Constants.MaxScore; 
    return diff; 
} 

С этим, начните с Person с наименьшим счетом, найти x-1Person экземпляры с самой низкой разницей, и это ваш первый кронштейн. Повторяйте, пока все Person не находятся в скобках.

+0

Большое спасибо за ваше время для написания этого! Я буду использовать эту логику для первой части алгоритма. но основной вопрос заключается в том, как объединить самые оптимальные комбинации всех скобок вместе - я имею в виду, что все скобки будут иметь наиболее оптимальные связи между соперниками, но пока я думаю об этом, я не уверен, что это возможно. – jonathana

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