Я копался в поисках того, было ли что-то подобное сделано ранее, но не видел ничего с зеркальными условиями. Чтобы облегчить понимание проблемы, я собираюсь применить ее в контексте заполнения списка бейсбольной команды.
Данная структура реестра организована следующим образом: C, 1B, 2B, 3B, SS, 2B / SS (либо или), 1B / 3B, OF, OF, OF, OF, UT (может быть в любом положении)
Каждый игрок имеет по крайней мере одну из не резервных позиций (позиции, которые допускают более одной позиции), где он имеет право, а во многих случаях более одной (то есть игрок, который может играть 1B и OF и т. Д.) , Скажем, что вы менеджер команды, в которой уже есть несколько игроков, и вы хотите увидеть, есть ли у вас место для конкретного игрока в каком-либо из ваших слотов, или вы можете перемещать одного или нескольких игроков вокруг, чтобы открыть слот, в котором он имеет право.
Первоначально я пытался использовать условную перестановку и собирать в список все возможные уникальные «расстановки» для каждого игрока, обновляя открытые слоты перед переходом к следующему игроку. Это также требовало (поскольку порядок перемещения игрока будет влиять на то, какие позиции были доступны для следующего игрока), чтобы перебираемый список был переупорядочен, а затем повторен. Я все еще думаю, что это путь, но есть ряд подводных камней, которые зацепили функцию.
Предполагается, что данные для запуска цикла:
1. Список позиций, которые может оценить игрок, которого он оценивает (тот, который проверяется, может ли он соответствовать)
2. Список игроков, которые в настоящее время включены в список, и позиции, на которые имеет право каждая из них (в настоящее время я храню список списков и использую индекс списка в качестве уникального идентификатора игрока).
3. Список позиций, открытых на данный момент в списке
Это оказалось более сильной головной болью, чем я ожидал. Мой коллега даже предложил мне, чтобы ситуация, в которой я оказался (которая в гораздо большем масштабе включает условные задания для каждого объекта), была NP-полной. Я уверен, что это не так, так как после того, как игрок был перемещен в определенном тестируемом ряду, нет необходимости повторять весь список после того, как другой игрок переместился. Вот и все, и я наконец решил открыть его для форумов.
Спасибо за любую помощь, которую может оказать любой. Из-за ограничений я не могу публиковать части кода (некоторые из них унаследованы). Однако он переводится в .NET (на данный момент C #). Если потребуется дополнительная информация, я постараюсь переписать некоторые короткие фрагменты функции для публикации.
Джозеф Г.
РЕД. 07/24/2010
Большое спасибо за ответы. Я действительно изучал использование генетического алгоритма, но в конечном итоге отказался от него, потому что объем работы, который потребовался для определения порядковых результатов, был излишним. Конечная цель теста - определить, существует ли на самом деле сценарий, который дает положительный результат. Нет необходимости определять относительную выгоду каждого рабочего решения.
Я ценю отзывы о вероятном отсутствии знакомства с контекстом, в котором я представил проблему. Фактическая модель заключается в распределении команд сборки по нескольким серверам сборки для конкретной платформы. Он доступен, но я бы предпочел не понимать, почему определенные задачи сборки могут выполняться только на определенных системах и почему определенные системы могут выполнять только определенные типы команд сборки.
Похоже, вы поняли суть того, что я представлял, но вот другая модель, которая немного менее конкретна. В упорядоченном массиве списков есть набор отдельных позиций (я буду называть их «позициями»):
((2), (2), (3), (4), (5), (6), (4, 6), (3, 5), (7), (7), (7) ), (7), (7), (2, 3, 4, 5, 6, 7))
Кроме того, существует неупорядоченный массив списков (я буду называть «работниками»), который может занимать только один из слотов, если его массив имеет общий элемент с упорядоченным списком, которому он будет назначен. , После того, как начальные назначения сделаны, если появляется дополнительный сотрудник, мне нужно определить, может ли он заполнить одну из открытых вакансий, и если нет, могут ли текущие сотрудники быть реорганизованы, чтобы разрешить одну из должностей, которую сотрудник МОЖЕТ заполнить быть доступным.
Грубая сила - это то, чего я хотел бы избежать, потому что при этом порядка 40-50 объектов (и скоро будет расти), отдельные определения будут очень дорогими для расчета во время выполнения.