2017-02-01 4 views
0

Ich war Rsymphony und entschied, dass ich CPLEX verwenden möchte. Ich arbeite durch die cplexAPI in R und würde lieber meine vorhandene Struktur für den Aufbau einer Constraint-Matrix verwenden. Die Dokumentation besagt, dass die API die Constraint-Matrix im Format "Spalten-Hauptfolge" nur mit Elementen ungleich Null verwendet. Ich brauche also einen Weg, um (elegant, hoffe ich) eine Matrix in diese Form zu verwandeln.Konvertieren Matrix zu Spalte Großauftrag Format

Zum Beispiel:

3,2 Erstellen und eine gemischten Integer Programming (MIP) Problem Im folgenden Lösung wird ein Beispiel MIP wird angelegt und gelöst: ...

Subjekt zu:

constraints

Derzeit ist dies implementieren ed als Matrix

> mat = matrix(c(-1, 1, 1, 10, 
+     1, -3, 1, 0, 
+     0, 1, 0, -3.5),byrow = TRUE, nrow=3,ncol=4) 
> mat 
    [,1] [,2] [,3] [,4] 
[1,] -1 1 1 10.0 
[2,] 1 -3 1 0.0 
[3,] 0 1 0 -3.5 

Aus der Dokumentation brauche ich folgende Elemente.

Die Constraint-Matrix wird im Spalten-Major-Order-Format übergeben. Vorsicht: Alle Indizes beginnen mit 0! Beginnen Sie Indizes von Zeilen.

beg <- c(0, 2, 5, 7) 

Sie werden feststellen, dass von oben Arbeits links unten ist, wie dies funktioniert. In der ersten Position (0) beginnt die zweite Spalte mit dem dritten von Null verschiedenen Element, die dritte mit der fünften usw.

Anzahl der Elemente ungleich Null pro Zeile.

cnt <- c(2, 3, 2, 2) 

Wieder was würde ich gesagt haben, Spalten.

Spaltenindizes.

ind <- c(0, 1, 0, 1, 2, 0, 1, 0, 2) 

Dies ist der Spaltenindex jedes Nicht-Null-Elements.

Nicht-Null-Elemente.

val <- c(-1.0, 1.0, 1.0, -3.0, 1.0, 1.0, 1.0, 10.0, -3.5) 

ich auf der Suche nach einem Weg bin ratlos dies getan.

Ich weiß, ich val leicht erstellen:

cnt <- apply(mat,2,function(x) Matrix::nnzero(x, na.counted = NA)) 
cnt 
[1] 2 3 2 2 

Dank @ 42-

ind2 <- row(mat)[which(mat != 0)]-1 
ind <- c(0, 1, 0, 1, 2, 0, 1, 0, 2) 
ind2 == ind 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

für beg Jetzt:

c(mat) 
[1] -1.0 1.0 0.0 1.0 -3.0 1.0 1.0 1.0 0.0 10.0 0.0 -3.5 
val2 <- mat[mat !=0] 
val <- c(-1.0, 1.0, 1.0, -3.0, 1.0, 1.0, 1.0, 10.0, -3.5) 
val2 & val 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

ich cnt leicht erstellen können.

die Stücke Neuformulierung,

mat 
    [,1] [,2] [,3] [,4] 
[1,] -1 1 1 10.0 
[2,] 1 -3 1 0.0 
[3,] 0 1 0 -3.5 
beg <- c(0, 2, 5, 7) 
val <- c(-1.0, 1.0, 1.0, -3.0, 1.0, 1.0, 1.0, 10.0, -3.5) 

beg ist ein Index, der in val entlang der Position des Nicht-Null-Element zählt. Also in mat[1,1] ist das erste Nicht-Null-Element in mat und das erste (0) Element in val. In mat[,2] ist das erste Nicht-Null-Element das dritte Element (2) in val. In mat[,3] ist das erste Nicht-Null-Element das sechste (5) Element in val und in mat[,4] ist das erste Nicht-Null-Element das achte (7) Element von val.

Klar wie Schlamm? Ich auch.

Antwort

2

Es ist mir nicht ganz klar, worauf Sie hoffen, aber hier ist eine Methode zum Generieren der Zeilen- und Spaltennummern, die die Nicht-Null-Einträge in dieser Matrix mit Zero-based Indizierung (was nicht normal für R ist Matrix-Indizierung, obwohl Sie gesehen haben, dass diese Regel nicht für dünn besetzte Matrizen gilt, die mit Matrix-Paket-Funktionen erstellt wurden.):

row(mat)[which(mat != 0)]-1 
#[1] 0 1 0 1 2 0 1 0 2 
col(mat)[which(mat != 0)]-1 
#[1] 0 0 1 1 1 2 2 3 3 
+0

Vielen Dank! Dies wird sicherlich für "ind" funktionieren. Ich stimme zu, dass es nicht klar ist, ich versuche mit einer API zu arbeiten, die mich eine Weile in Anspruch nahm. – jjhold

+0

Ich sah kurz ein Häkchen. Gab es noch etwas, das gebraucht wurde? Brauchen Sie eine andere Zeilendefinition? –

+0

Ja, noch ein Stück, ich habe eine Erklärung hinzugefügt. Ich brauche das 'betteln'. Ich wusste nicht, ob ich den Haken für einen Teil der Antwort geben könnte oder was. – jjhold

Verwandte Themen