Как получить отчет о решении из гема lp_select (lpsolve) - PullRequest
0 голосов
/ 17 мая 2018

Спасибо за ваше время.

Я не мог найти, как получить значения переменных после решения.

Make a three row five column equation
@lp = LPSolve::make_lp(3, 5) 

 Set some column names
LPSolve::set_col_name(@lp, 1, "fred")
LPSolve::set_col_name(@lp, 2, "bob")
 Add a constraint and a row name, the API expects a 1 indexed array
constraint_vars = [0, 0, 1]
FFI::MemoryPointer.new(:double, constraint_vars.size) do |p|
  p.write_array_of_double(constraint_vars)
  LPSolve::add_constraint(@lp, p, LPSelect::EQ, 1.0.to_f)
end
LPSolve::set_row_name(@lp, 1, "onlyBob")

 Set the objective function and minimize it
constraint_vars = [0, 1.0, 3.0]
FFI::MemoryPointer.new(:double, constraint_vars.size) do |p|
  p.write_array_of_double(constraint_vars)
  LPSolve::set_obj_fn(@lp, p)
end
LPSolve::set_minim(@lp)

 Solve it and retreive the result
LPSolve::solve(@lp) 
@objective = LPSolve::get_objective(@lp)

выход

Model name:  '' - run #1    
Objective:   Minimize(R0)


SUBMITTED
Model size:        4 constraints,       5 variables,            1 non-zeros.
Sets:                                   0 GUB,                  0 SOS.

Использование DUAL симплекс для phase 1 и PRIMAL симплекс для phase 2.

Стратегия ценообразования простого и двойного симплекса установлена ​​на «Devex».

Optimal solution                   3 after          1 iter.

Excellent numeric accuracy ||*|| = 0

ПАМЯТЬ: lp_solve версия 5.5.0.15 для 64-битной ОС, с 64-битной REAL переменные. В общем количестве итераций 1, 0 (0,0%) были связаны сальто. Было 0 рефакторизаций, 0 сработало по времени и 0 по плотности. ... в среднем 1,0 основных точек на рефакторизацию. Самый большой факт [LUSOL v2.2.1.0] (B) имел 5 записей NZ, что в 1,0 раза больше. Inf-норма матрицы ограничений равна 1, с динамическим диапазоном 1. Время загрузки данных составило 0,031 секунды, предварительное разрешение - 0,000 секунд, ... 0,000 секунд в симплексном решателе, всего 0,031 секунды. => 3,0

1 Ответ

0 голосов
/ 18 мая 2018
retvals = []
FFI::MemoryPointer.new(:double, 2) do |p|

    err = LPSolve::get_variables(@lp, p)

  retvals = p.get_array_of_double(0,2)
end

retvals[0]
retvals[1]

дает решение.

...