2016-11-19 5 views
1

Ich versuche, das folgende Optimierungsproblem mit R lpSolve Paket zu lösen:R lpSolve Paket finden keine optimale Lösung

1.007825*x1 +12.000000*x2 +15.99492*x3 +14.00307*x4 +31.97207*x5 +30.97376*x6 >= 10 
1.007825*x1 +12.000000*x2 +15.99492*x3 +14.00307*x4 +31.97207*x5 +30.97376*x6 <= 15 
     1*x1  - 2*x2  + 0*x3  -1*x4  +0*x5  -3*x6 <= 2 
     xi >= 0, where i = [1,2,3,4,5,6] 

Meine Zielfunktion:

1.007825*x1 +12.000000*x2 +15.99492*x3 +14.00307*x4 +31.97207*x5 +30.97376*x6 

Ich schaffe die Matrix Einschränkungen in der Standardform (A):

  [,1] [,2]  [,3]  [,4]  [,5]  [,6] 
[1,] -1.007825 -12 -15.99492 -14.00307 -31.97207 -30.97376 
[2,] 1.007825 12 15.99492 14.00307 31.97207 30.97376 
[3,] 1.000000 -2 0.00000 -1.00000 0.00000 -3.00000 
[4,] -1.000000 0 0.00000 0.00000 0.00000 0.00000 
[5,] 0.000000 -1 0.00000 0.00000 0.00000 0.00000 
[6,] 0.000000 0 -1.00000 0.00000 0.00000 0.00000 
[7,] 0.000000 0 0.00000 -1.00000 0.00000 0.00000 
[8,] 0.000000 0 0.00000 0.00000 -1.00000 0.00000 
[9,] 0.000000 0 0.00000 0.00000 0.00000 -1.00000 

I die Matrix der Grenzen schaffen (b):

 [,1] 
[1,] -10 
[2,] 15 
[3,] 2 
[4,] 0 
[5,] 0 
[6,] 0 
[7,] 0 
[8,] 0 
[9,] 0 

und die Zielfunktion (f):

f = c(1.007825, 12.000000, 15.99492, 14.00307, 31.97207, 30.97376) 

Wenn ich es in den Code setzen:

out = lp("min",f,A,rep("<=",9),b,all.int=TRUE), 

ich die Lösung c bekommen (0,0,0,1 , 0,0), obwohl ich weiß, dass die Lösung c (0,1,0,0,0,0) ist. Wenn ich die rechte Grenze ändere (statt 15 mache ich 13), funktioniert alles. Was könnte das Problem sein?

+1

Das ist beängstigend, würde ich geneigt sein, einen anderen Löser zu verwenden. –

Antwort

2

Mit lpSolveAPI, das Problem löst fein:

library(lpSolveAPI) 
lprec <- make.lp(0, ncol=6) 
set.type(lprec, columns=seq(1,6), type="integer") 
set.objfn(lprec, obj=c(1.007825, 12, 15.99492, 14.00307, 31.97207, 30.97376)) 

add.constraint(lprec, xt=c(1.007825, 12, 15.99492, 14.0030, 31.97207, 30.97376), type=">=", rhs=10) 
add.constraint(lprec, xt=c(1.007825, 12, 15.99492, 14.0030, 31.97207, 30.97376), type="<=", rhs=15) 
add.constraint(lprec, xt=c(1, -2, 0, -1, 0, -3), type="<=", rhs=2) 

solve(lprec) 
get.variables(lprec) 

kehrt

[1] 0 1 0 0 0 0 
+0

Danke. Ich werde es überprüfen und Sie wissen lassen. – Kirill

+0

Ja, es funktioniert. Noch eine Frage: Weißt du, ob alle MILP ungefähre Ganzzahlen ergeben? Ich meine, wenn eine Zahl nahe genug ist, dann wird es als eine ganze Zahl betrachtet. – Kirill

+0

Siehe [LP relaxation] (https://en.wikipedia.org/wiki/Linear_programming_relaxation#Branch_and_bound_for_exact_solutions) für eine Beschreibung eines Algorithmus, der exakte Lösungen berechnet. –

Verwandte Themen