我试图找出比蛮力更好的算法来解决这种组合优化问题。
示例问题: 以最小/最大成本实现2a + b,结合可用的线性方程 1. 2a + b = 4 2. a = 1 3. a + b = 2 (RHS是成本)
答案:结合2和3得到2a + b = 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个香蕉的成本。
对于每个框,尝试将其添加到目前为止找到的所有配置,并查看结果是否比缓存的值便宜。它就是,更新缓存。
由于缓存将是稀疏的,我将使用一个集来跟踪已知配置(即非无限缓存值的位置),以便可以在不经过所有已知配置的情况下完成循环整个缓存。