You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过lp_select gem(lpsolve)获取解报告及求解后变量值

我来帮你搞定这个问题!在使用lp_select(基于lpsolve)求解线性规划后,获取变量值和完整解报告其实有现成的API方法,我结合你的代码给你一步步演示:

一、获取变量取值

lpsolve提供了get_variables方法来获取所有决策变量的最优值,因为是基于FFI调用,需要先创建一个内存指针来存储结果,再转换成Ruby数组。你可以把这段代码加在求解成功之后:

# 获取变量总数
var_count = LPSolve::get_Ncolumns(@lp)
# 创建内存指针存储变量值
variables_ptr = FFI::MemoryPointer.new(:double, var_count)
# 调用API获取变量值
LPSolve::get_variables(@lp, variables_ptr)
# 转换成Ruby数组
var_values = variables_ptr.read_array_of_double(var_count)

# 可选:和你设置的列名对应起来,更直观
var_names = (1..var_count).map { |idx| LPSolve::get_col_name(@lp, idx) }
var_results = var_names.zip(var_values).to_h

# 打印结果
puts "各变量最优值:"
var_results.each { |name, val| puts "#{name}: #{val}" }

二、获取完整解报告

如果你想要像控制台输出那样的完整解信息,可以用print_solution方法直接输出到控制台,或者用write_solution把报告保存到文件:

1. 直接输出到控制台

# 第二个参数控制详细程度:2表示输出完整报告(包括约束松弛、对偶值、求解统计等)
puts "\n完整解报告:"
LPSolve::print_solution(@lp, 2)

参数说明:

  • 0:仅打印目标函数值
  • 1:打印目标值+变量取值
  • 2:打印完整的解信息(和你之前看到的求解输出格式一致)

2. 保存到文件

如果需要留存报告,可以写入文件:

LPSolve::write_solution(@lp, "lp_solution_report.txt")

整合后的完整代码

把这些逻辑加到你的代码里,最终版本是这样的:

# 构建模型
@lp = LPSolve::make_lp(3, 5)

# 设置列名
LPSolve::set_col_name(@lp, 1, "fred")
LPSolve::set_col_name(@lp, 2, "bob")

# 添加约束
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")

# 设置目标函数并最小化
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_status = LPSolve::solve(@lp)
if solve_status == 0 # 0代表求解成功,得到最优解
  @objective = LPSolve::get_objective(@lp)
  puts "目标函数最优值:#{@objective}"

  # 获取变量值
  var_count = LPSolve::get_Ncolumns(@lp)
  variables_ptr = FFI::MemoryPointer.new(:double, var_count)
  LPSolve::get_variables(@lp, variables_ptr)
  var_values = variables_ptr.read_array_of_double(var_count)

  var_names = (1..var_count).map { |idx| LPSolve::get_col_name(@lp, idx) }
  var_results = var_names.zip(var_values).to_h

  puts "\n各变量最优取值:"
  var_results.each { |name, val| puts "#{name}: #{val}" }

  # 输出完整解报告
  puts "\n=== 完整解报告 ==="
  LPSolve::print_solution(@lp, 2)

  # 可选:保存报告到文件
  LPSolve::write_solution(@lp, "lp_solution.txt")
else
  puts "求解失败,错误码:#{solve_status}"
end

# 记得释放模型内存,避免泄漏
LPSolve::delete_lp(@lp)

额外提示

  • 求解状态码0表示找到最优解,其他码对应不同的错误(比如无解、无界等),你可以查lp_solve的文档了解具体含义。
  • 用完模型后一定要调用delete_lp释放内存,尤其是在循环创建模型的场景下。

内容的提问来源于stack exchange,提问作者Mehmet Celik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:21:27