36 votos

Algoritmo para encontrar el volumen de un politopo convexo

Es fácil encontrar el área de un polígono convexo mediante la división en triángulos, pero ¿cuál es la forma óptima de encontrar el volumen de los cuerpos convexos de mayor dimensión? Probé algunos métodos para dividirlos en símiles, pero desistí y opté por un esquema de estimación de Monte Carlo. Pregunta extra: ¿Cómo encontrar la superficie de esos mismos cuerpos convexos?

EDIT: Para responder a la pregunta de David: el conjunto de datos es una teselación de Voronoi de un volumen n-dimensional (n normalmente 4) con una frontera periódica (como un toro). Así que tengo las coordenadas de los vértices de los cuerpos convexos, así como la conectividad de todas las facetas, caras, etc. Para el Monte Carlo que mencioné, convertí todo a medios espacios, así que creo que no fue muy difícil.

29voto

Flow Puntos 14132

Como seguimiento a Barton respuesta: por la dureza de los resultados, véase I. Bárány & Z. Füredi, la Informática, el volumen es difícil, Discreto y Geometría Computacional, 1987. Pero hay polinomio de aproximación en tiempo de esquemas para el volumen de cuerpos convexos independiente de la dimensión, basada en el paseo aleatorio en el cuerpo: véase, por ejemplo, M. Dyer, A. Friso, & R. Kannan, Un azar polinomio de tiempo de algoritmo para aproximar el volumen de cuerpos convexos, J. ACM 1991 y R. Kannan, L. Lovász, & M. Simonovits, el paseo Aleatorio y un O*(n^5) volumen algoritmo para cuerpos convexos, al Azar de algoritmos y estructuras de 1997.

Antes de llegar a estas respuestas, sin embargo, es importante preguntar: ¿cómo es tu entrada representados? Es un casco convexo de un conjunto de puntos, y todo lo que sabemos es que los puntos? Es un cruce de halfspaces? Es como una cara entera de celosía? También, ¿qué rango de dimensiones de hacer que La atención acerca de los límites superior e inferior de arriba son muy general, pero la dimensión y la entrada de representación todavía puede hacer una diferencia en la respuesta.

20voto

csmba Puntos 2440

Creo que es un problema de disco duro--los algoritmos conocidos son lentos y no trivial de implementar. Véase el Volumen Exacto de Cálculo para Polytopes para una encuesta. Una característica interesante es que existen varios algoritmos que están bien adaptados para los diferentes tipos de polytopes.

Como una respuesta práctica, paquete qhull. puede calcular volúmenes y áreas de superficie.

12voto

Jonathan Fine Puntos 141

Matthias Beck y Dennis Pixton utilizado casi 17 Gigahercios años para calcular el valor de las 10 dimensiones de Birkhoff polytope. Leer acerca de ella, y encontrar la respuesta, aquí.

Si usted puede conseguir el mismo resultado más rápido, estoy seguro de que estaría encantado de saber cómo lo hizo.

7voto

Jason Navarrete Puntos 3873

Hay un algoritmo aleatorio con O(n^4) tiempo de ejecución basado en el recocido simulado utilizando el hit-and-run convexo cuerpo algoritmo de muestreo junto con la isotropía aproximación por Vempala y Lovasz: aquí. El tiempo de ejecución es el número de llamadas oráculo para la membresía en el cuerpo convexo y tiene implícito un polylogarithmic plazo.

6voto

Andrew Rimmer Puntos 1887

Aquí hay una solución bastante sencilla para poliedros (3 dimensiones), con un tiempo de ejecución O(v+ve), donde v es el número de vértices y e es el número de aristas. Supongo que podría extenderse a dimensiones mayores, pero probablemente tendría un tiempo de ejecución mucho peor (me temo que más o menos exponencial como en O(v n ), siendo n el número de dimensiones).

Dejemos que nuestro poliedro tenga n vértices, definidos por sus coordenadas x,y,z: v 1 , v 2 , ..., v n y que el punto más bajo sea v 1 y el origen (modificando los valores de los demás en consecuencia), y que tenga e aristas, definidas por los vértices que conectan. Entonces, como tenemos coordenadas para los vértices (ya que así los hemos definido), debe haber un plano "a ras de suelo" p 0 que pasa por los ejes x y z (el eje y es la altura, y el suelo nunca tiene una elevación). Entonces, dejemos que v 2 sea el punto más cercano al plano del suelo (línea más corta perpendicular al plano), y que v 3 sea el siguiente más cercano, etc., hasta v n .

A través de cada uno de los puntos v 2 a través de v n , dibujar un plano perpendicular al suelo, y dejar que se numeren p m donde m es el subíndice del vértice por el que se ha dibujado. Entonces, el volumen de nuestro poliedro es igual a la suma de los volúmenes de las figuras entre los planos. Deberíamos tener algo parecido a esto:
Polyhedron with 6 vertices and 12 edges

Sean las alturas entre los segmentos h 1 a través de h n-1 donde la altura h j es la altura entre los planos p j y p j+1 .

Ahora, a través de cada plano, tenemos un polígono (o más, si la figura es cóncava), cuyas coordenadas de los vértices se pueden calcular fácilmente como sigue:
Sea la arista que pasa por el plano p j tienen puntos finales v a y v b . Entonces, el vector de desplazamiento es v b - v a (suponiendo que las coordenadas de v están en forma de vector), y el porcentaje recorrido hacia arriba es $\frac{h_j-h_a}{h_{b-1}-h_a}$ . Multiplique esto por v b - v a y añadir a v a para calcular el nuevo punto de intersección de esa arista:
Punto de intersección = $(v_b-v_a)\frac{h_j-h_a}{h_{b-1}-h_a}+v_a$
El área de estos polígonos se puede determinar utilizando triángulos, o una simplificación de este mismo proceso en sólo 2 dimensiones.

PlanetMath dice que el volumen de un prismatoide (que es el tipo de figura contenida entre planos secuenciales) es $h\frac{B_1 + B_2 + 4M}{6}$ donde las Bs son las áreas de los polígonos paralelos y M es el área del polígono intermedio, que está exactamente a mitad de camino entre ellos (y paralelo a ellos). Como ya conocemos el área de cada uno de los polígonos extremos, y podemos calcular fácilmente los vértices del polígono intermedio (utilizando el método del apartado anterior), podemos calcular el volumen de los prismatoides resultantes. Al sumarlos se obtiene el volumen total del poliedro.

Supongo que el único problema real en este caso, entonces, es, a través del código, determinar qué aristas corren a través de cualquier plano en particular, pero si lo miráramos realmente, podríamos saberlo muy fácilmente.

Una versión más sencilla de esto se puede utilizar para calcular el área de cualquier polígono; basta con trazar líneas a través de los vértices paralelas al eje x y calcular el área de los trapecios resultantes como (b 1 +b 2 )/2

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X