2016-06-02 16 views
0

Ich bin neugierig, ob es möglich ist, eine Zielfunktion zu definieren, die auf einen bestimmten Wert anstatt nur 'min' oder 'max' optimiert werden soll. Z. B. habe ich eine Funktion, die ich mit einigen Einschränkungen optimieren möchte (hier weggelassen). Zielfunktion (bis zu 100 optimiert werden):lpSolve - Zielfunktion auf einen bestimmten Wert optimieren

f(x) 3.62*x1+5.19*x2 

Was wäre der richtige Weg sein, um mein Ziel zu erreichen? Im Moment kann ich die Optimierung nur auf 'min' oder 'max' setzen, was mein Ziel nicht löst.

Der vollständige Code:

fn.obj <- c(3.62, 5.19, 7.29, 7.76, 3.82, 4.86, 4.03, 8.81, 9.14) 
    require(lpSolveAPI) 

    model <- make.lp(0,9) 
    lp.control(model, sense="max", verbose="full") 
    set.objfn(model, fn.obj)#-8333550.82) 

    add.constraint(model, c(70,70,-30,70,-30,-30,-30,-30,70), ">=", 0) 
    add.constraint(model, c(-60,-60,40,-60,40,40,40,40,-60), ">=", 0) 
    add.constraint(model, c(-20,-20,80,-20,-20,80,80,-20,-20), ">=", 0) 
    add.constraint(model, c(30,30,-70,30,30,-70,-70,30,30), ">=", 0) 
    add.constraint(model, c(-30,-30,-30,-30,70,-30,-30,70,-30), ">=", 0) 
    add.constraint(model, c(40,40,40,40,-60,40,40,-60,40), ">=", 0) 
    set.bounds(model, lower=c(39232,72989,90872,63238,49579,9626,158297,300931,160556), upper=c(49041,91237,113591,79048,61974,12033,197872,376164,200696)) 
    set.type(model, 1:9,type = "integer") 

    res<-solve(model) 

    get.variables(model) 
    get.objective(model) 

Ergebnis:

> get.variables(model) 
    [1] 49041 91237 113591 79048 61974 12033 197872 376164 200696 
    > get.objective(model) 
    [1] 8333551 

Der Code funktioniert gut, wenn Bedürfnisse der Zielfunktion zu maximieren. Aber was, wenn ich nicht maximieren möchte, sondern meine Zielfunktion z. 7000. Also mit den gleichen Einschränkungen Ich möchte mögliche x1, .. finden, x9 für meine fn.obj -> 1000.

+0

meine Frage mit Originalcode aktualisiert. – Alex

Antwort

1

Vorausgesetzt, der Wert, den Sie für den Zielwert angeben, entspricht einer realisierbaren Lösung, die Sie tun können, indem füge es einfach als Einschränkung hinzu. 1000 und 7000 scheinen keinen realisierbaren Lösungen zu entsprechen, sondern nehmen an, dass das Ziel 8000000 anstelle von 8333551 entspricht. Fügen Sie dann diese Einschränkung hinzu und führen Sie das Modell erneut aus.

add.constraint(model, fn.obj, "=", 8000000) 
+0

Danke, funktioniert wie ausgeführt! – Alex

Verwandte Themen