我真的很感激对这个实际问题的一些评论。
简要说明。 我有可变数量的链接,可用于组成给定的皮带宽度。问题是,每个链接有多少。 选择标准:最好使用更长的物品。
示例 假设我们想要创建一个带宽, W = 1024.0 其中一个模型具有以下链接长度: L = [34.0,65.0,96.0,126.0]
问题是,每个链接的宽度是多少。
以下是我尝试过的一些方法。
1。贪婪(选择最长的第一个以满足标准) c = [0,0,0,8] 其中c是每个项目的计数。 这留下了16.0的差距,我甚至不能适应最小的一个项目。 贪婪很容易但不好。
2。选择循环 不太容易,我认为这是一个难题。 我尝试了很多策略:填充小物品然后按顺序移除它们以适应下一个尺寸。
第3。背包方法 不太合适,因为这是基于给定数量的项目。
4。子集和问题 这是背包的一个子类,但我无法让它工作。
5。装箱问题 这听起来很相似,但我无法将其应用于我的问题。
6。蛮力(随机选择) 奇怪的是,这个找到了许多完全匹配。 我使用计数的简单多项式作为评级。 rating = n [0] + n [1] * 2 + n [2] * 3 + n [4] ** 4 + ... 蛮力的解决方案之一是 [4,0,4,4]正好给出1024。 问题是,这种方法经常会出现不同的选择,因此不太理想。
7。穷举搜索 不实用,因为选择太多了。
8。模拟退火 从蛮力的成功,这看起来是一个很好的选择。 有人能指出一个简单的例子(请不要另外一位旅行推销员)。
9。遗传和粒子群 不确定这些。
现在,我感到困惑和沮丧。 是否有可用于此问题的直接算法?
答案 0 :(得分:0)
好吧,如果我正确理解了问题,你需要选择长度为34的x1对象,长度为65的x2对象等,这样所有这些对象的总和等于W,但是对较长物体的偏见(在这种情况下,126.0将是最受青睐的物体)。
我想你可以制作一个像这样的客观函数:
f(x1,x2,..,xn)= b1 * x1 * L1 + b2 * x2 * L2 + ... + bn * xn * Ln - p *(W - x1 * L1 + x2 * L2 + ...... + xn * Ln)^ 2
其中b1到bn是这些物体上的偏差(正数是有利的,负数表示物体是不受欢迎的),L1到Ln是那些物体的长度,p是不完全为W的惩罚(如果它必须正好是W,p是inf。)
(我们也可以把它以矩阵形式表示为f(X)= b ^ T * X * L - p *(W - I ^ T * X * L)^ 2,其中b和L是向量,X是x1,x2,...,xn的方形对角稀疏矩阵,I是1的向量,T是换位。)
所以目标然后通过搜索n元组的整数x1,x2,...,xn来最大化f。
whew 好的,现在我想我明白了这个问题。 :)
这是某种整数编程问题,但我不认为它完全符合二次整数规划问题。也许其他人都知道它是什么。
在我的研究中,我一直在研究和试验模拟退火。它通常可以轻松解决这些类型的离散优化问题。您可以使用线性或对数温度计划来解决此问题。
如果你只有几个物体,没有意图进行大规模扩展,那么蛮力可能会没问题。但是如果你要在数百或数千个物体上做这个,那么遗传算法,粒子群或模拟退火可能是聪明的想法。据我所知,实际上不可能知道哪种优化启发式算法效果最好(例如,在令人满意的时间范围内找到所需精度的结果)。
我对其他提供评论的解决方法知之甚少。