【问题标题】:Rglpk_solve_lp and glpsol(internally used by pulp glpk solver) return different values for same LPRglpk_solve_lp 和 glpsol(由纸浆 glpk 求解器内部使用)为相同的 LP 返回不同的值
【发布时间】:2013-12-05 10:30:57
【问题描述】:

lp 问题可以在Portfolio Optimization Problem 找到。该问题基于 Guy yollins 演示文稿 R Tools for Portfolio Optimization 中的 cvar 优化。

当我在 R 中读取 lp 文件并执行它时,找到了最佳解决方案。而当我通过 glpsol 执行相同操作时,它会显示“LP 没有原始可行的解决方案”。我使用 glpsol 作为pulp 在内部使用 glpsol 来求解 lp,当求解器参数作为纸浆.GLPK() 给出时。

在 R 中运行 lp 的步骤:

library("Rglpk")
problem <- Rglpk_read_file("path/to/problem.lp", "CPLEX_LP")
solution <- Rglpk_solve_LP(problem$objective, problem$constraints[[1]], problem$constraints[[2]], problem$constraints[[3]], problem$bounds, problem$types, problem$maximum, control=list("verbose" = TRUE))
print(solution$status)
print(solution$solution)

在 glpsol 中运行 lp 的步骤:

glpsol --cpxlp "path/to/problem.lp" -o output.sol

知道为什么吗?我尝试在 R 中查看 Rglpk_solve_lp 函数的代码。它似乎正在调用 glpk c 库的 glp_simplex 函数。我猜 glpsol 内部也会调用 glp_simplex 。

环境详情:
操作系统:Ubuntu 12.04
R 版本:3.02
Rglpk 版本:0.5-1(GLPK 4.52 版本随源码包一起提供)
glpsol 版本:4.52

【问题讨论】:

  • 我将仅将其作为评论留下,因为我不能 100% 确定如何准确诊断数值不稳定的问题,但这是我的猜测。在你的 glpsol 调用中添加 --dual 为我解决了这个问题。
  • 结果似乎主要由于传递的选项而有所不同。我将尝试不同的选项并尝试查看是否有任何特定选项与 R 结果匹配并将其添加为答案。你救了我的混蛋。谢谢
  • @flodel:看了Rglpk和glpsol的源码,发现Rglpk只是调用了glp_simplex(problem, NULL)。而 glpsol 为第二个参数传入有效的非空值。当我在 glpsol 中将第二个参数的值设为 NULL,重新构建代码并使用 glpsol 重新运行相同的问题时,它返回与 Rglpk_solve_lp 相同的输出。我将尝试找出是否可以复制相同内容而无需修改 glpsol 的源代码并将其添加为答案。

标签: r mathematical-optimization glpk pulp


【解决方案1】:

将选项 --nopresol、--noscale、--std 添加到 glpsol 命令给了我与 Rglpk_solve_lp 相同的结果。

glpsol --cpxlp ~/Downloads/PortfolioOptimization_minReturns_0.190000.lp -o output.sol --nopresol --noscale --std

我必须查看 glpsol 的代码并将其与 Rglpk 包的代码进行比较才能弄清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    相关资源
    最近更新 更多