Алгоритмы точного вычисления гиперобъема — различия между версиями
Joshik (обсуждение | вклад) |
|||
Строка 12: | Строка 12: | ||
В частности, если <tex>X = \{x\}</tex>, то <tex>S(X) = \prod \limits_{i=1}^{d} x_i</tex>. | В частности, если <tex>X = \{x\}</tex>, то <tex>S(X) = \prod \limits_{i=1}^{d} x_i</tex>. | ||
− | Задача: найти точное значение гиперобъема <tex>S(X)</tex> множества из <tex>n</tex> точек <tex>d</tex>-мерного | + | Задача: найти точное значение гиперобъема <tex>S(X)</tex> множества из <tex>n</tex> точек <tex>d</tex>-мерного пространства. |
== Алгоритм включения-исключения (Inclusion-Exclusion Algorithm, IEA) == | == Алгоритм включения-исключения (Inclusion-Exclusion Algorithm, IEA) == | ||
Строка 28: | Строка 28: | ||
== Алгоритм LebMeasure == | == Алгоритм LebMeasure == | ||
− | Алгоритм LebMeasure<ref>K. Bringmann, T. Friedrich.: An Efficient Algorithm for Computing Hypervolume Contributions. Evolutionary Computation, Vol. 18, No. 3, pp 383-402, MIT Press. (2010)</ref> обрабатывает точки множества <tex>X</tex> по очереди. Для каждой очередной точки <tex>x</tex> находится объем некоторого максимального по включению гиперкуба, доминируемого эксклюзивно только этой точкой <tex>x</tex> и она заменяется на некоторое множество ''порожденных'' точек, которые доминируют оставшуюся область, | + | Алгоритм LebMeasure<ref>K. Bringmann, T. Friedrich.: An Efficient Algorithm for Computing Hypervolume Contributions. Evolutionary Computation, Vol. 18, No. 3, pp 383-402, MIT Press. (2010)</ref> обрабатывает точки множества <tex>X</tex> по очереди. Для каждой очередной точки <tex>x</tex> находится объем некоторого максимального по включению гиперкуба, доминируемого эксклюзивно только этой точкой <tex>x</tex> и она заменяется на некоторое множество ''порожденных'' точек, которые доминируют оставшуюся область, доминировавшуюся до этого точкой <tex>x</tex>. |
Например, если изначально было четыре точки в трехмерном пространстве <tex>(6, 7, 4), (9, 5, 5), (1, 9, 3), (4, 1, 9)</tex>, то точка <tex>(6, 7, 4)</tex> эксклюзивно доминирует куб с одним концов в <tex>(6, 7, 4)</tex>, а другим - в <tex>(4, 5, 3)</tex>. После добавления объема этого куба к ответу, точка <tex>(6, 7, 4)</tex> порождает три точки: <tex>(4, 7, 4), (6, 5, 3), (6, 7, 3)</tex>. При этом точка <tex>(6, 5, 4)</tex> доминируется точкой <tex>(9, 5, 5)</tex> и сразу удаляется из множества <tex>X</tex>. | Например, если изначально было четыре точки в трехмерном пространстве <tex>(6, 7, 4), (9, 5, 5), (1, 9, 3), (4, 1, 9)</tex>, то точка <tex>(6, 7, 4)</tex> эксклюзивно доминирует куб с одним концов в <tex>(6, 7, 4)</tex>, а другим - в <tex>(4, 5, 3)</tex>. После добавления объема этого куба к ответу, точка <tex>(6, 7, 4)</tex> порождает три точки: <tex>(4, 7, 4), (6, 5, 3), (6, 7, 3)</tex>. При этом точка <tex>(6, 5, 4)</tex> доминируется точкой <tex>(9, 5, 5)</tex> и сразу удаляется из множества <tex>X</tex>. | ||
Строка 93: | Строка 93: | ||
Теперь изложим идею алгоритма на примере трехмерного пространства. | Теперь изложим идею алгоритма на примере трехмерного пространства. | ||
− | В трехмерном пространстве сканирующая гиперплоскость превращается в обычную плоскость. Будем считать, что она всегда располагается | + | В трехмерном пространстве сканирующая гиперплоскость превращается в обычную плоскость. Будем считать, что она всегда располагается перпендикулярно оси <tex>OZ</tex> и двигается от минимальных значений по этой оси до максимальных. В каждый момент проекция всех параллелепипедов на эту плоскость представляет собой множество прямоугольников и необходимо уметь обрабатывать следующие три запроса: |
# добавить прямоугольник | # добавить прямоугольник | ||
# удалить прямоугольник | # удалить прямоугольник | ||
Строка 135: | Строка 135: | ||
Рассмотрим теперь как именно будет устроено разделение пространства на области КД-деревом для эффективного его использования. | Рассмотрим теперь как именно будет устроено разделение пространства на области КД-деревом для эффективного его использования. | ||
− | Возьмем проекции всех параллелепипедов на плоскость, | + | Возьмем проекции всех параллелепипедов на плоскость, перпендикулярную оси <tex>OZ</tex> - множество прямоугольников <tex>V</tex>. Рассмотрим все <tex>x</tex>-координаты границ прямоугольников и разобьем ось <tex>OX</tex> на <tex>2\sqrt{n}</tex> промежутков так, чтобы в каждом из них было не более <tex>\sqrt{n}</tex> границ. Получившиеся <tex>2\sqrt{n}</tex> полос разобьем горизонтальными линиями на итоговые области по отдельности следующим образом. Для каждой полосы у всех прямоугольников, имеющих вертикальную границу в этой полосе, возьмем все горизонтальные границы (их будет не более <tex>2\sqrt{n}</tex>), а среди всех горизонтальных границ, пересекающих область, возьмем каждую <tex>\sqrt{n}</tex>-ую. Таким образом, в итоге получим не более <tex>4\sqrt{n}</tex> областей в каждой вертикальной полосе. |
Полученные области обладают следующими свойствами: | Полученные области обладают следующими свойствами: | ||
Строка 156: | Строка 156: | ||
Все эти свойства следуют из свойств разбиения на области и логарифмической высоты дерева. | Все эти свойства следуют из свойств разбиения на области и логарифмической высоты дерева. | ||
− | Наконец, получаем итоговый алгоритм. Идем сканирующей плоскостью, | + | Наконец, получаем итоговый алгоритм. Идем сканирующей плоскостью, перпендикулярной оси <tex>OZ</tex>, добавляя или удаляя прямоугольники из КД-дерева. При этом каждый раз пересчитываем площадь объединения всех текущих прямоугольников и, складывая эти величины, умноженные на соответствующую разницу <tex>z</tex>-координат, получаем общий объем. |
Каждая операция добавления или удаления прямоугольников требует изменения <tex>O(\sqrt{n} \log n)</tex> полей <tex>Cover</tex>, а также операций добавления или удаления прямоугольника в <tex>O(\sqrt{n})</tex> листьев, каждая из которых требует <tex>O(\log n)</tex> времени. Итого, на одну операцию добавления или удаления требуется <tex>O(\sqrt{n} \log n)</tex> времени, суммарно таких операций <tex>O(n)</tex>, и получается, что весь алгоритм работает за <tex>O(n \sqrt{n} \log n)</tex>. При этом на хранение всей информации требуется <tex>O(n\sqrt{n}) </tex> памяти - каждый лист может хранить <tex>O(\sqrt{n})</tex> прямоугольников. | Каждая операция добавления или удаления прямоугольников требует изменения <tex>O(\sqrt{n} \log n)</tex> полей <tex>Cover</tex>, а также операций добавления или удаления прямоугольника в <tex>O(\sqrt{n})</tex> листьев, каждая из которых требует <tex>O(\log n)</tex> времени. Итого, на одну операцию добавления или удаления требуется <tex>O(\sqrt{n} \log n)</tex> времени, суммарно таких операций <tex>O(n)</tex>, и получается, что весь алгоритм работает за <tex>O(n \sqrt{n} \log n)</tex>. При этом на хранение всей информации требуется <tex>O(n\sqrt{n}) </tex> памяти - каждый лист может хранить <tex>O(\sqrt{n})</tex> прямоугольников. |
Версия 14:53, 20 июня 2012
Содержание
Постановка задачи
- точка в -мерном пространстве.
Точка
доминирует точку ( ), если .- множество из точек в -мерном пространстве таких, что - никакая точка не доминируется другой точкой из этого множества.
- гиперобъем множества , где - мера Лебега.
В частности, если
, то .Задача: найти точное значение гиперобъема
множества из точек -мерного пространства.Алгоритм включения-исключения (Inclusion-Exclusion Algorithm, IEA)
Самый простой алгоритм нахождения гиперобъема базируется на идее комбинаторной формулы включения-искючения. Все множество представляется в виде объединения гиперкубов ( ), соответствующих отдельным точкам .
После этого объем всего множества вычисляется по формуле:Объем пересечения гиперкубов легко считается как произведение по каждой координате минимального значения этой координаты среди всех точек, которым соответствуют гиперкубы.
Таким образом, в этом алгоритме перебираются все подмножества точек множества
, для каждого множества находится гиперобъем пересечения соответствующих гиперкубов, и он прибавляется с соответствующим знаком к ответу. Время работы этого алгоритма составляет .Алгоритм LebMeasure
Алгоритм LebMeasure[1] обрабатывает точки множества по очереди. Для каждой очередной точки находится объем некоторого максимального по включению гиперкуба, доминируемого эксклюзивно только этой точкой и она заменяется на некоторое множество порожденных точек, которые доминируют оставшуюся область, доминировавшуюся до этого точкой .
Например, если изначально было четыре точки в трехмерном пространстве
, то точка эксклюзивно доминирует куб с одним концов в , а другим - в . После добавления объема этого куба к ответу, точка порождает три точки: . При этом точка доминируется точкой и сразу удаляется из множества .Обработка точек продолжается, пока все точки не будут обработаны. Таким образом, время работы алгоритма напрямую зависит от количества порожденных точек. Легко заметить, что таких точек не более, чем
, поскольку каждая координата каждой порожденной точки равна соответствующей координате некоторой точки исходного множества .К сожалению, эта верхняя оценка является достижимой. Например, если исходное множество [2].
имеет вид: , и точки обрабатываются именно в этом порядке, то всего будет обработано точка, что показано в [1]. Правда, если в этом примере точки обрабатываются в обратном порядке, то суммарное количество обработанных точек линейно зависит от и . Тем не менее, существуют примеры, для которых любой порядок обработки приводит к экспоненциальной зависимости числа порожденных точек от размерности пространства и эта зависимость близка кАлгоритм Hypervolume by Slicing Objectives (HSO)
Под Objectives в названии данного алгоритма имеются в виду координаты пространства
.Если алгоритм LebMeasure по очереди рассматривает все точки, то алгоритм HSO[3] рассматривает по очереди все координаты, сводя задачу к меньшей на единицу размерности.
Изначально все точки сортируются по первой координате. Значения этой координаты используются для расслоения (разрезания) всего множества на
частей, внутри каждой из которых при движении вдоль первой координаты форма разреза (гиперплоскости), проходящего перпендикулярно оси первой координаты, не меняется. Таким образом, для подсчета объема каждой части необходимо найти объем разреза, и умножить на длину части вдоль первой координаты. При этом получившийся разрез имеет на единицу меньшую размерность. Заметим, что после сортировки и расслоения первая часть содержит все исходные точек множества , вторая - все, помимо точки с минимальной первой координатой, вдоль которой происходит расслоение, и т.д., а последняя часть содержит только одну точку с максимальной этой координатой.После этого все полученные части расслаиваются уже по второй координате, далее все полученные - по третьей и т.д. В итоге исходное множество разбивается на несколько непересекающихся гиперкубов и остается их найти суммарный гиперобъем. Заметим, что расслаивание части можно прекратить в тот момент, когда в нее входит только одна точка и посчитать объем гиперкуба, образованного проекцией этой точки на оставшиеся координаты.
Описанный процесс можно реализовать как в виде рекурсивной процедуры, расслаивающей множество вдоль очередной координаты и вызывающей себя рекурсивно для каждой части и следующей координаты, так и нерекурсивно, если поддерживать множество всех текущих частей и на очередной итерации разбивать их все вдоль очередной координаты.
Время работы алгоритма напрямую зависит от суммарного количества частей, на которые будет разбито исходное множество. По аналогичным предыдущему алгоритму рассуждениям легко показывается, что частей не более
. Тем не менее, существует более точная оценка.Теорема: | ||||||||||||
Суммарное количество частей, полученных алгоритмом HSO, не превышает | ||||||||||||
Доказательство: | ||||||||||||
База: Докажем полезные леммы:
продолжаем доказательство теоремы по индукции: | ||||||||||||
Таким образом, на этот алгоритм получена более низкая оценка времени работы, чем на предыдущий, и это подтверждается на практике [2].
Сведение к задаче KMP (Klee's Measure Problem)
Задача KMP состоит в нахождении объема объединения прямоугольных гиперпараллелепипедов в
-мерном пространстве. Как показано в описании алгоритма IEA, исходная задача легко сводится к этой, если каждой точке поставить в соответствие гиперкуб с одной вершиной в центре координат, а противоположной - в этой точке.Существует несколько алгоритмов решения задачи KMP[4][5][6], самый оптимальный из которых использует идеи сканирующей гиперплоскости, корневой эвристики и КД-дерево, и позволяет решать задачу за время . Рассмотрим его.
Для начала изложим идею сканирующей гиперплоскости. Рассмотрим всевозможные значения
-ой координаты у точек множества . Возьмем гиперплоскость, перпендикулярную оси -ой координаты, будем ее двигать по этим значениям от минимального до максимального и рассматривать проекцию всех гиперкубов на эту гиперплоскость. Заметим, что между точками проекция меняться не будет, а в каждой точке будут появляться или исчезать проекции некоторых гиперкубов. Поэтому, если уметь эффективно пересчитывать объем проекции при каждом появлении/исчезновении и прибавлять это значение, умноженное на расстояние между последовательными значениями -ой координаты, то можно легко посчитать суммарный гиперобъем. Как раз для эффективного пересчета используется такая структура, как КД-дерево.Теперь изложим идею алгоритма на примере трехмерного пространства. В трехмерном пространстве сканирующая гиперплоскость превращается в обычную плоскость. Будем считать, что она всегда располагается перпендикулярно оси
и двигается от минимальных значений по этой оси до максимальных. В каждый момент проекция всех параллелепипедов на эту плоскость представляет собой множество прямоугольников и необходимо уметь обрабатывать следующие три запроса:- добавить прямоугольник
- удалить прямоугольник
- посчитать площадь объединения всех прямоугольников
Определение: |
КД-деревом называется сбалансированное двоичное дерево, где каждой вершине соответствует некоторая область -мерного пространства, удовлетворяющая следующим свойствам:
|
Будем хранить прямоугольники в КД-дереве следующим образом:
- Для каждого листа будем хранить все прямоугольники, которые пересекают внутреннюю часть области .
- Для каждой внутренней вершины будем считать число - количество прямоугольников, которые полностью покрывают область , но не полностью покрывают область родителя этой вершины .
Также для каждой вершины будем хранить значение площади пересечения области этой вершины со всеми прямоугольниками
, которое определяется следующим образом:- Для каждого листа равно площади пересечения всех прямоугольников с областью этого листа.
- Для каждой внутренней вершины если , тогда равно площади всей области , иначе равно сумме этих значений для двух сыновей этой вершины.
Таким образом, значение для корневой вершины
и является искомой площадью объединения всех прямоугольников.Рассмотрим операцию добавления прямоугольника (box) в КД-дерево.
procedure Insert(box,) if - лист then добавить box в эту вершину пересчитать elseif box покрывает область then объем области elseif box пересекает область then Insert(box, leftson( )) Insert(box, rightson( )) if then объем области else
Аналогично устроена операция удаления прямоугольника - она выполняет обратные действия.
Рассмотрим теперь как именно будет устроено разделение пространства на области КД-деревом для эффективного его использования. Возьмем проекции всех параллелепипедов на плоскость, перпендикулярную оси
- множество прямоугольников . Рассмотрим все -координаты границ прямоугольников и разобьем ось на промежутков так, чтобы в каждом из них было не более границ. Получившиеся полос разобьем горизонтальными линиями на итоговые области по отдельности следующим образом. Для каждой полосы у всех прямоугольников, имеющих вертикальную границу в этой полосе, возьмем все горизонтальные границы (их будет не более ), а среди всех горизонтальных границ, пересекающих область, возьмем каждую -ую. Таким образом, в итоге получим не более областей в каждой вертикальной полосе.Полученные области обладают следующими свойствами:
- Всего областей.
- Каждый прямоугольник частично покрывает не более областей.
- Никакая вершина прямоугольника не лежит внутри какой-нибудь области.
- Для каждой области есть не более частично покрывающих ее прямоугольников.
Все эти утверждения несложно следуют из алгоритма разбиения на области.
Каждая из этих областей будет одним из листов КД-дерева. Для построения всего дерева сначала объединим все области для одной вертикальной полосы, сливая соседние области в одну вершину дерева. После этого аналогично будем сливать соседние вертикальные области и в итоге получим корневую вершину, представляющую всю плоскость.
Построенное КД-дерево обладает следующими свойствами:
- В нем вершин.
- Каждый прямоугольник хранится в листьях.
- Каждый прямоугольник влияет на значений .
- Никакая вершина прямоугольника не лежит внутри области какого-нибудь листа.
- Для области каждого листа есть не более частично покрывающих ее прямоугольников.
Все эти свойства следуют из свойств разбиения на области и логарифмической высоты дерева.
Наконец, получаем итоговый алгоритм. Идем сканирующей плоскостью, перпендикулярной оси
, добавляя или удаляя прямоугольники из КД-дерева. При этом каждый раз пересчитываем площадь объединения всех текущих прямоугольников и, складывая эти величины, умноженные на соответствующую разницу -координат, получаем общий объем.Каждая операция добавления или удаления прямоугольников требует изменения
полей , а также операций добавления или удаления прямоугольника в листьев, каждая из которых требует времени. Итого, на одну операцию добавления или удаления требуется времени, суммарно таких операций , и получается, что весь алгоритм работает за . При этом на хранение всей информации требуется памяти - каждый лист может хранить прямоугольников.Все идеи этого алгоритма обобщаются с трехмерного пространства на
-мерное следующим образом.Построение разбиения на области в
-мерном пространстве вместо двухмерного ведется сначала аналогичным образом, только после того, как в двухмерном пространстве получаются итоговые прямоугольные области, здесь продолжаются аналогичные разбиения вдоль третьей координаты - берутся все границы третьей координаты гиперпараллелепипедов, имеющие границу по первой или второй координате строго внутри области (их получается не более ), а также каждую -ую границу по третьей координате гиперепараллелепипедов, пересекающих эту область, и так далее.Это разбиение на области имеет следующие аналогичные свойства:
- Всего областей.
- Каждый гиперпараллелепипед частично покрывает не более областей.
- Никакая вершина гиперпараллелепипеда не лежит внутри какой-нибудь области.
- Для каждой области есть не более частично покрывающих ее гиперпараллелепипедов.
Общее дерево строится аналогичным образом и оно в итоге состоит из
уровней, каждый из которых имеет высоту в дереве - самый верхний уровень содержит разбиение по первой координате, следующий - по второй и так далее.Построенное КД-дерево обладает следующими свойствами:
- В нем вершин.
- Каждый гиперпараллелепипед хранится в листьях.
- Каждый гиперпараллелепипед влияет на значений .
- Никакая вершина гиперпараллелепипеда не лежит внутри области какого-нибудь листа.
- Для области каждого листа есть не более частично покрывающих ее гиперпараллелепипедов.
Операции в этом дереве выполняются аналогично трехмерному случаю и каждая операция добавления или удаления в КД-дерево размерности
занимает времени. Выполняя сканирование гиперплоскостью вдоль одной из координат получаем КД-дерево размерности , в котором необходимо провести операций, то есть суммарное время работы алгоритма равно: . При этом хранение КД-дерева требует памяти.Источники
- ↑ K. Bringmann, T. Friedrich.: An Efficient Algorithm for Computing Hypervolume Contributions. Evolutionary Computation, Vol. 18, No. 3, pp 383-402, MIT Press. (2010)
- ↑ 2,0 2,1 While, L., Hingston, P., Barone, L., Huband, S.: A Faster Algorithm for Calculating Hypervolume. IEEE Transaction on Evolutionary Computation, Vol.10, No. 1, pp 29–38 (2006)
- ↑ Zhou X., Sun C., Mao N., Li W.: Generalization of HSO algortihms for computing hypervolume for mutiobjective optimization problems, IEEE Congress on Evolutionary Computation (2007)
- ↑ Overmars, M.H., Yap, C.K.: New upper bounds in Klee’s measure problem. SIAM Journal on Computing 20(6), pp 1034–1045. (1991)
- ↑ N. Beume.: S-Metric calculation by considering dominated hypervolume as Klee’s measure problem. Evolutionary Computation, 17(4), pp 477–492. (2009)
- ↑ N. Beume, G. Rudolph.: Faster S-metric calculation by considering dominated hypervolume as Klee’s measure problem. In Proc. Second International Conference on Computational Intelligence (IASTED ’06), pp 233–238. (2006)