44 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 un límite periódico (como un toroide). 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.

31voto

Flow Puntos 14132

Como continuación de Respuesta de Barton para resultados de dureza, véase I. Bárány & Z. Füredi, Computing the volume is difficult, Discrete and Computational Geometry, 1987. Pero existen esquemas de aproximación en tiempo polinómico para el volumen de los cuerpos convexos independientes de la dimensión, basados en paseos aleatorios dentro del cuerpo: véase, por ejemplo, M. Dyer, A. Frieze y R. Kannan, A random polynomial-time algorithm for approximating the volume of convex bodies, J. ACM 1991 y R. Kannan, L. Lovász y M. Simonovits, Random walks and an O*(n^5) volume algorithm for convex bodies, Random structures and algorithms, 1997.

Pero antes de llegar a estas respuestas, es importante preguntarse: ¿cómo se representa la entrada? ¿Es un casco convexo de un conjunto de puntos, y todo lo que sabes son los puntos? ¿Es una intersección de semiespacios? ¿Se te da como un entramado de caras completo? Los límites superior e inferior anteriores son bastante generales, pero la dimensión y la representación de la entrada pueden influir en la respuesta.

24voto

MortenSickel Puntos 123

Creo que este problema es difícil: los algoritmos conocidos son lentos y no triviales de implementar. Véase Cálculo exacto del volumen de los politopos para una encuesta. Una característica interesante es que hay varios algoritmos que se adaptan bien a diferentes tipos de politopos.

Como respuesta práctica, Qhull puede calcular volúmenes y superficies.

16voto

Jonathan Fine Puntos 141

Matthias Beck y Dennis Pixton utilizaron casi 17 GigaHertz años para calcular el valor del politopo de Birkhoff de 10 dimensiones. Lee sobre ello y encuentra la respuesta, aquí .

Si puedes conseguir el mismo resultado más rápido, seguro que estarán encantados de saber cómo lo has hecho.

8voto

Jason Navarrete Puntos 3873

Existe un algoritmo aleatorio con un tiempo de ejecución O(n^4) basado en el recocido simulado utilizando el algoritmo de muestreo de cuerpos convexos hit-and-run junto con la aproximación de isotropía de Vempala y Lovasz: aquí . El tiempo de ejecución es el número de llamadas al oráculo para la pertenencia al cuerpo convexo y tiene un término polilogarítmico implícito.

6voto

Andrew Rimmer Puntos 1887

He aquí 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 la mitad de 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 párrafo 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