Построение рейтинга с генетическим алгоритмом,

Вопрос после БОЛЬШОГО выпуска:

Мне нужно построить рейтинг с использованием генетического алгоритма, у меня есть такие данные:

P(a>b)=0.9
P(b>c)=0.7
P(c>d)=0.8
P(b>d)=0.3

теперь давайте интерпретируем a,b,c,d как названия футбольных команд, а P(x>y) — это вероятность того, что x выиграет с y. Мы хотим построить рейтинг команд, нам не хватает некоторых наблюдений P(a>d),P(a>c) отсутствуют из-за отсутствия совпадений между a vs d и a vs c. Цель состоит в том, чтобы найти порядок названий команд, который лучше всего описывает текущую ситуацию в этой четырехкомандной лиге.

Если у нас есть только 4 команды, то решение простое, сначала мы вычисляем вероятности для всех 4!=24 порядков четырех команд, игнорируя пропущенные значения, которые у нас есть:

P(abcd)=P(a>b)P(b>c)P(c>d)P(b>d)

P(abdc)=P(a>b)P(b>c)(1-P(c>d))P(b>d)

...

P(dcba)=(1-P(a>b))(1-P(b>c))(1-P(c>d))(1-P(b>d))

и мы выбираем рейтинг с наибольшей вероятностью. Я не хочу использовать другие фитнес-функции.

Мой вопрос:

Поскольку количество перестановок n элементов равно n!, вычисление вероятностей для всех порядков невозможно для больших n (у меня n около 40). Я хочу использовать генетический алгоритм для этой проблемы.

Оператор мутации представляет собой простое переключение местами двух (или более) элементов ранжирования.

Но как сделать пересечение двух порядков?

Можно ли P(abcd) интерпретировать как функцию стоимости пути 'abcd' в асимметричной задаче TSP, но стоимость путешествия из x в y отличается от стоимости путешествия из y в x, P(x>y)=1-P(y<x) ? Существует так много операторов кроссовера для задачи TSP, но я думаю, что должен разработать свой собственный оператор кроссовера, потому что моя задача немного отличается от TSP. Есть ли у вас какие-либо идеи для решения или основы для концептуального анализа?

Самый простой способ на концептуальном уровне и уровне реализации - использовать оператор кроссовера, который выполняет обмен подзаказами между двумя решениями:

CrossOver(ABcD,AcDB) = AcBD

для случайного подмножества элементов (в данном случае «a, b, d» заглавными буквами) мы копируем и вставляем первый подпорядок — последовательность элементов «a, b, d» во второй порядок.

Редакция: асимметричный TSP можно превратить в симметричный TSP, но с запрещенными подупорядочениями, которые делают подход GA непригодным.


comment
Генетические алгоритмы оптимизируют параметры, чтобы максимизировать или минимизировать значение пригодности. Можете ли вы написать фитнес-функцию, которая включает все данные? В TSP это будет расчет общего расстояния.   -  person Stephan    schedule 14.04.2012
comment
На мой взгляд, если вы возьмете, например, b,c,d,a, общая вероятность должна быть максимальной. Вы можете рассчитать приспособленность f(b,c,d,a) = p(b>c) * p(c>d) * p(d>a).. Но что такое p(d>a)? Если вы его посчитаете, остальное будет легко.   -  person Stephan    schedule 14.04.2012
comment
Я знаю, как вычислить фитнес-функцию, например, для заданных данных: a>b, 0.9, b>c, 0.7, f(abc)=p(a>b)*p(b>c), а для f(acb)=p(a>b)*(1-p(b>c)) она довольно прямая, а вероятность p(a>c) не нужна.   -  person Qbik    schedule 14.04.2012
comment
Ваш подход не правильный. Вы не рассчитываете рейтинг a и c. В формуле вы вычисляете p(a>b) и p(c>b), но это не подразумевает p(a>c). Если вы знаете, что a больше, чем b, а c больше, чем b, вы не знаете, больше, меньше или равно c a.   -  person Stephan    schedule 15.04.2012


Ответы (3)


Это определенно интересная проблема, и кажется, что большинство ответов и комментариев были сосредоточены на семантических аспектах проблемы (т. Е. Значение фитнес-функции и т. Д.).

Я добавлю некоторую информацию о синтаксических элементах - как вы делаете кроссовер и/или мутацию таким образом, чтобы это имело смысл. Очевидно, как вы заметили с параллелью с TSP, у вас есть проблема с перестановкой. Поэтому, если вы хотите использовать ГА, естественное представление возможных решений — это просто упорядоченный список ваших точек, избегающий повторения, то есть перестановки.

Одной из таких задач перестановки является TSP, и существует ряд операторов кроссовера (например, Кроссовер Edge Assembly), который можно взять из алгоритмов TSP и использовать напрямую. Однако, я думаю, у вас будут проблемы с этим подходом. По сути, проблема вот в чем: в TSP важным качеством решений является смежность. То есть abcd имеет ту же пригодность, что и cdab, потому что это тот же тур, только начинающийся и заканчивающийся в другом городе. В вашем примере абсолютная позиция гораздо важнее, чем понятие относительной позиции. abcd в некотором смысле означает, что a — лучшая точка — важно, чтобы она была первой в списке.

Главное, что вам нужно сделать, чтобы получить эффективный оператор кроссовера, — это учесть, какие свойства есть у родителей, которые делают их хорошими, и попытаться извлечь и скомбинировать именно эти свойства. Ник Рэдклифф назвал это "уважительной рекомбинацией" (обратите внимание, что статья довольно старая, и теория теперь понимается немного по-другому, но принцип здравый). Взяв оператора, разработанного TSP, и применив его к своей проблеме, вы в конечном итоге получите потомство, которое попытается сохранить нерелевантную информацию от родителей.

В идеале вам нужен оператор, который пытается сохранить абсолютную позицию в строке. Лучший из известных мне навскидку известен как Cycle Crossover (CX). Мне не хватает хорошей ссылки, но я могу указать вам на некоторый код, в котором я реализовал это как часть своей дипломной работы. Основную идею CX довольно сложно описать, и ее гораздо легче увидеть в действии. Возьмите следующие два пункта:

abcdefgh
cfhgedba
  1. Выберите начальную точку в родительском элементе 1 случайным образом. Для простоты я просто начну с позиции 0 с «а».

  2. Теперь перейдите прямо к родителю 2 и посмотрите на значение там (в данном случае «c»).

  3. Теперь ищем «c» в родительском элементе 1. Мы находим его в позиции 2.

  4. Теперь снова опуститесь прямо вниз и обратите внимание на букву «h» в родительском элементе 2, позиция 2.

  5. Снова найдите этот «h» в родительском элементе 1, найденном в позиции 7.

  6. Опуститесь прямо вниз и обратите внимание на букву «а» в родительском элементе 2.

  7. В этот момент обратите внимание, что если мы ищем «а» в родительском, мы достигаем позиции, в которой мы уже были. Продолжая прошлое, это будет просто цикл. На самом деле, мы называем последовательность позиций, которые мы посетили (0, 2, 7), «циклом». Обратите внимание, что мы можем просто поменять местами значения в этих позициях между родителями как группой, и оба родителя сохранят свойство перестановки, потому что у нас есть одни и те же три значения в каждой позиции цикла для обоих родителей, только в разном порядке.

  8. Произвести перестановку позиций, входящих в цикл.

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

cbhdefga
afcgedbh
X X    X

Просто продолжайте находить и менять циклы, пока не закончите.

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

Обратите внимание, что вы можете получить довольно много, если сделаете что-то более индивидуальное для вашего конкретного домена. Я думаю, что что-то вроде CX станет лучшим алгоритмом черного ящика, чем что-то, основанное на операторе TSP, но черные ящики обычно используются в крайнем случае. Предложения других людей могут привести вас к лучшему общему алгоритму.

person deong    schedule 16.04.2012
comment
Cycle Crossover можно было бы интуитивно понять, если бы мы наблюдали только за одним родителем. Это просто стало брать элементы от других родителей с тех же позиций, пока мы не совпадем с ограничением наложенных решений. Например, если мы наблюдаем за вторым родителем, мы берем «a» на позицию «c», тогда у нас есть два «a», которые нарушают ограничение, поэтому мы берем «h» вместо второго, чем два «h». , и возьмите 'c' вместо второго. Порядок изменений не тот, но результат тот же. Спасибо за интересный ответ. - person Qbik; 16.04.2012

Я работал над несколько похожей проблемой ранжирования и следовал методике, подобной той, что я описываю ниже. Это работает для вас:

Предположим, что неизвестное value объекта отличается от вашей оценки посредством некоторого распределения, скажем, нормального распределения. Интерпретируйте ваши утверждения о ранжировании, такие как a > b, 0.9, как утверждение «Значение a лежит в 90%-м процентиле распределения с центром в b».

Для каждого утверждения:

def realArrival = calculate a's location on a distribution centered on b
def arrivalGap = | realArrival - expectedArrival | 
def fitness = Σ arrivalGap

Фитнес-функция MIN(fitness)

FWIW, моя проблема на самом деле была проблемой упаковки в корзину, где эквивалентом ваших утверждений о «ранге» были рейтинги, предоставленные пользователями (1, 2, 3 и т. д.). Так что не совсем TSP, а NP-Hard. OTOH, bin-packing имеет псевдополиномиальное решение, пропорциональное допустимой ошибке, что я в конечном итоге и использовал. Я не совсем уверен, что это сработает с вашими заявлениями о вероятностном ранжировании.

person Larry OBrien    schedule 14.04.2012
comment
Да, ваша проблема очень похожа на мою. Но я не знаю, имеют ли отсутствующие наблюдения в ваших и в моих данных одинаковую интерпретацию. Каково было решение вашей проблемы, не могли бы вы дать какие-либо подсказки? - person Qbik; 16.04.2012
comment
Я использовал псевдополиномиальный алгоритм рюкзака, о котором я упоминал, как описано в Алгоритмах приближения Вазирани noreferrer">amazon.com/Approximation-Algorithms-Vijay-V-Vazirani/dp/ Однако, если честно, эксперты в предметной области возражали против использования ранга в качестве прокси для скрытой ценности, поскольку они намеренно манипулировали рангом в попытке обыграть существующий алгоритм. Так что я так и не смог запустить его в производство :-( (О, и у нас не было недостающих данных...) - person Larry OBrien; 16.04.2012

Какая интересная проблема! Насколько я понимаю, вы действительно спрашиваете:

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

Таким образом, если ваш граф имеет N ребер, существует 2 ^ N графов с различной вероятностью, причем некоторые порядки появляются более чем в одном графе.

Я не знаю, поможет ли это (очень краткие поиски в Google не просветили меня, но, возможно, вы добьетесь большего успеха с большей настойчивостью), но я думаю, что поиск «топологической сортировки» в сочетании с любым из «вероятностных» , "случайный", "шум" или "ошибка" (поскольку веса ребер можно рассматривать как фактор надежности).

Однако я сильно сомневаюсь в вашем утверждении в вашем примере, что P (a> c) не нужен. Вы лучше знаете свое прикладное пространство, но мне кажется, что указание P(a>c) = 0,99 даст другую пригодность для f(abc), чем указание P(a>c) = 0,01.

Возможно, вы также захотите добавить «Байесовский», поскольку вы можете начать выводить значения для (в вашем примере) P (a> c) с учетом ваших условий и гипотетических решений. Проблема в том, что «топологическая сортировка» и «байесовский подход» дадут вам целую кучу хитов, связанных с цепями Маркова и задачами решения Маркова, которые могут быть полезными, а могут и не быть.

person Novak    schedule 14.04.2012
comment
tkanks для ответа, но топологическое упорядочение ограничено случаями, когда графы не имеют направленных циклов - person Qbik; 16.04.2012
comment
Это правда, и меня интересовала интерпретация набора данных, где, скажем, P(a›b) = P(b›c) = P(c›a) = 0,5. Ясно, что в той форме, которую я представил, граф имеет цикл и не имеет топологической сортировки, потому что все эти условия не могут быть истинными. Но P(a›b) = P(b›c) = P(a›c) = 0,5 — это точно такая же проблема, верно? И этот граф имеет высшую сортировку. Итак, как я уже сказал, может быть бесполезным, но это первое, что пришло в голову. - person Novak; 16.04.2012