2016-06-02 2 views
0

Мне любопытно, можно ли определить целевую функцию для оптимизации до определенного значения, а не только «min» или «max». Например, у меня есть функция, которую я хочу оптимизировать до 100 с некоторыми ограничениями (опущен здесь). Целевая функция (должна быть оптимизирована для):lpSolve - оптимизировать целевую функцию до определенного значения

f(x) 3.62*x1+5.19*x2 

Что бы правильный путь для достижения своей цели? Прямо сейчас я могу определить оптимизацию только для «мин» или «макс», которая не решает мою цель.

Полный код:

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) 

Результат:

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

код хорошо работает, когда требуется максимизировать целевую функцию. Но что, если я хочу не максимизировать, а оптимизировать свою целевую функцию, например, 7000. Таким образом, имея те же ограничения, я хочу найти возможные x1, .., x9 для моего fn.obj -> 1000.

+0

обновленный мой вопрос с оригинальным кодом. – Alex

ответ

1

При условии, что значение, которое вы указываете для объективного значения, соответствует допустимому решению, вы можете это сделать просто добавив его в качестве ограничения. 1000 и 7000, похоже, не соответствуют любым возможным решениям, но предположим, что мы хотим, чтобы цель равнялась 8000000 вместо 8333551. Затем добавьте это ограничение и повторно запустите модель.

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

Спасибо, работает как выведенный! – Alex

Смежные вопросы