线性组合优化

时间:2012-03-01 00:11:02

标签: ruby algorithm combinations combinatorics

我试图找出比蛮力更好的算法来解决这种组合优化问题。

示例问题: 以最小/最大成本实现2a + b,结合可用的线性方程 1. 2a + b = 4 2. a = 1 3. a + b = 2 (RHS是成本)

答案:结合2和3得到2a + b = 3

当目标方程较长且幂群变得巨大时,发现分量线性方程的幂集(所有组合)的强力方法显然不是最优的。

这个问题是背包问题的变种吗? 关于谁可以以最佳方式完成的任何指示?

3 个答案:

答案 0 :(得分:1)

绝对不是背包。这只是一个线性优化(linear programming)问题。对于Ruby,您可以使用RGLPK

答案 1 :(得分:1)

这个问题可以用线性规划来表达。您可以使用Gnu线性编程工具包(GLPK)及其Ruby包装器'rglpk'来解决它。

http://www.gnu.org/software/glpk/下载适用于您的操作系统的GLPK 4.44。解压缩包并使用以下命令安装应用程序。

./configure && sudo make clean && sudo make && sudo make install

打开命令行并使用以下命令安装'rglpk'。

gem install rglpk

运行此代码。

require 'rglpk'

#min/max 2a+b
#1. 2a+b=4 
#2. a=1 
#3. a+b=2

p = Rglpk::Problem.new
p.name = "sample"
p.obj.dir = Rglpk::GLP_MAX

rows = p.add_rows(3)
rows[0].name = "2a+b=4"
rows[0].set_bounds(Rglpk::GLP_UP, 0, 4)
rows[1].name = "a=1"
rows[1].set_bounds(Rglpk::GLP_UP, 0, 1)
rows[2].name = "a+b=2"
rows[2].set_bounds(Rglpk::GLP_UP, 0, 2)

cols = p.add_cols(2)
cols[0].name = "a"
cols[0].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
cols[1].name = "b"
cols[1].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)

p.obj.coefs = [2, 1]

p.set_matrix([
2, 1,
1, 0,
1, 1
])

p.simplex
z = p.obj.get
x1 = cols[0].get_prim
x2 = cols[1].get_prim

printf("z = %g; x1 = %g; x2 = %g\n", z, x1, x2)
#=> z = 3; x1 = 1; x2 = 1

答案 2 :(得分:0)

如果我正确理解了问题, 是背包问题的一种变体。每个盒子都有一些苹果和一些香蕉。它也有成本。您必须选择一些盒子才能获得一定数量的苹果和香蕉,从而最大限度地降低总成本。

我会将DP Knapsack算法与2D缓存而不是1D缓存一起使用:cache [5] [10]是获得5个苹果和10个香蕉的成本。

对于每个框,尝试将其添加到目前为止找到的所有配置,并查看结果是否比缓存的值便宜。它就是,更新缓存。

由于缓存将是稀疏的,我将使用一个集来跟踪已知配置(即非无限缓存值的位置),以便可以在不经过所有已知配置的情况下完成循环整个缓存。