2014-11-07 18 views
5

Ho un insieme convesso in uno spazio euclideo (3D, ma vorrei risposte per nD) che è caratterizzato da un insieme finito di mezzi spazi (vettore normale + punto).Come convertire i semispazi che costituiscono uno scafo convesso in un insieme di punti estremi?

Esiste un algoritmo migliore per trovare i punti estremi del set convesso diversi dalla forza bruta calcolata tutti i punti che sono intersezioni di 3 (o, n) semispazi ed eliminare quelli che non sono punti estremi?

+0

Vuoi trovare * tutti * i punti estremi o solo alcuni sottoinsiemi? – templatetypedef

+0

Se ho capito bene la teoria, per definire il set convesso ho bisogno di tutti i punti estremi. Dipende dalla definizione esatta dei punti estremi. Sto pensando ad un punto estremo come un punto che non può essere ottenuto da p = p0 * t + p1 * (1-t) per 0 <= t <= 1 e p0! = P1, entrambi nella forma convessa. In altre parole, voglio il set minimo di punti che generano il set convesso. –

+0

Vedo, potrebbero esserci casi degenerati .... Modifica: pensando due volte, non vedo chiaramente, non immediatamente. –

risposta

3

Il termine chiave è enumerazione vertice di un politopo P. L'idea dell'algoritmo descritto di seguito è considerare il politopo P * dual. Quindi i vertici di P corrispondono alle facce di P *. Le sfaccettature di P * sono calcolate in modo efficiente con Qhull e quindi rimane da trovare i vertici risolvendo i corrispondenti sottosistemi di equazioni lineari.

L'algoritmo è implementato nel set di strumenti con licenza BSD Analyze N-dimensional Polyhedra in terms of Vertices or (In)Equalities per Matlab, creato da Matt J, in particolare, il suo componente lcon2vert. Tuttavia, al fine di leggere l'algoritmo e riutilizzarlo in un'altra lingua, è più facile lavorare con il più vecchio e semplice file con2vert di Michael Kleder, sul quale si basa il progetto di Matt J.

Spiegherò cosa fa passo dopo passo. I singoli comandi Matlab (ad es., convhulln) sono documentati sul sito di MathWorks, con riferimenti ad algoritmi sottostanti.


L'ingresso è costituito da un insieme di disuguaglianze lineari della forma Ax<=b, dove A è una matrice e b è un vettore colonna.

Passo 1. tenta di individuare un punto interno della polytope

primo tentativo è c = A\b, che è la soluzione dei minimi quadrati del sistema lineare sovradeterminato Ax=b. Se A*c<b tiene componentewise, questo è un punto interno. in caso contrario, viene eseguita una minimizzazione multivariata con la funzione obiettivo al massimo 0 e tutti i numeri A*c-b. Se questo non riesce a trovare un punto in cui detiene A*c-b<0, il programma si chiude con "Impossibile trovare un punto interno".

Fase 2. Tradurre il politopo in modo che l'origine è il suo punto interno

Questo viene fatto b = b - A*c in Matlab. Poiché 0 è ora un punto interno, tutte le voci di b sono positive.

Passo 3. Normalizza modo che il lato destro è 1

Questo è solo la divisione del esima riga di A da b (i), svolto da D = A ./ repmat(b,[1 size(A,2)]); in Matlab. D'ora in poi, viene utilizzata solo la matrice D. Si noti che le righe di D sono i vertici del doppio politopo P * menzionati all'inizio.

Passo 4. Verificare che il politopo P è delimitata

Il politopo P è illimitato se i vertici della sua duplice P * giacciono sullo stesso lato di alcuni iperpiano passante per l'origine. Questo viene rilevato utilizzando la funzione incorporata convhulln che calcola il volume dello scafo convesso di determinati punti.L'autore controlla se l'aggiunta della riga zero alla matrice D aumenta il volume dello scafo convesso; se lo fa, il programma si chiude con "Vincoli non rilegati rilevati".

Fase 5. Calcolo dei vertici

Questo è il ciclo

for ix = 1:size(k,1) 
    F = D(k(ix,:),:); 
    G(ix,:)=F\ones(size(F,1),1); 
end 

Qui, la matrice k codifica le sfaccettature della doppia politopo P *, con ogni riga elenca i vertici del sfaccettatura. La matrice F è la sottomatrice di D costituita dai vertici di un aspetto di P *. Backslash invoca la linear solver, e trova un vertice di P.

Fase 6: Pulizia

Poiché la polytope stato tradotto nella Fase 2, questa definizione viene annullata con V = G + repmat(c',[size(G,1),1]);. Le restanti due linee tentano di eliminare i vertici ripetuti (non sempre con successo).

1

Sono l'autore di polco, uno strumento che implementa il "metodo a doppia descrizione". È noto che il metodo di doppia descrizione funziona bene per molti problemi degenerati. È stato utilizzato per calcolare decine di milioni di generatori principalmente per problemi di biologia dei sistemi computazionali.

Lo strumento è scritto in Java, viene eseguito in parallelo su CPU multicore e supporta vari formati di input e output, inclusi file di testo e Matlab. Troverete ulteriori informazioni e pubblicazioni sul software e sulla doppia descrizione tramite un link a un dipartimento universitario dell'ETH di Zurigo.

Problemi correlati