股票分配问题。
我遇到一个问题,即每个具有各种销售率的已知产品需要分配到一个或多个固定数量的存储桶中。 每个产品必须至少有一个桶,桶不能共享产品。 必须填充所有桶,并且产品通常在多个桶中 我的问题是优化产品在所有产品系列中的分配,以便在任何产品销售之前最大化时间。
使问题复杂化的是,每种类型的桶可以容纳不同数量的每种类型的产品。 这不一定与产品的尺寸(未知)有关,但可以是任意的。 例如,
因此,作为输入,我们有一组产品及其销售速度,例如
一组Buckets
产品 - 桶搜索表,用于确定每个产品的每个桶容量,例如
到目前为止,我尝试过的方法包括
将每桶产品减少到一个共同因素 - 直到我意识到产品 - 桶大小关系是任意的。
随机将产品放入桶中,并迭代每个产品交换存储桶中的现有产品,并测试是否可以缩短销售时间。 我对这种方法的担忧是它可能需要一条在决策时间最佳的路径,但会模糊后来更优化的选择。 或者最佳决策需要多次产品变更,这些变更永远不会发生,因为个别选择并非最优。
详尽的搜索结果证明,这对于不那么大的产品和存储桶产生了非常大的可能性。
我最初认为最佳解决方案是按照与销售费率相同的比例分配产品,但发现这不是真的,因为完全匹配销售比率的产品配置非常少。配置持有更多库存,因此在首次售完之前有更长的销售时间。
任何c#或伪代码赞赏
答案 0 :(得分:0)
我建议基于simulated annealing的方法2的变体 - 优化的优化方法,其中您的基础策略基于最陡下降等。维基百科很好地解释了这个想法;关键的概念部分是:
SA算法的每一步都取代了 当前的解决方案是随机的 “附近”的解决方案,选择了一个 概率取决于 相应的区别 功能值和全局 参数T(称为温度), 在这期间逐渐减少 过程
答案 1 :(得分:0)
我认为这个问题可能是NP完全的,您可能不得不采用常规方法GA / SA /广度/深度搜索和/或解决非最佳解决方案,具体取决于您拥有多少桶/产品。< / p>
假设您有足够的产品适合您的所有水桶(您没有说过),您可以在每个水桶中强制使用单个产品,以确定哪个产品最适合每个水桶。我不知何故怀疑是这种情况,但如果是这样的话,这就是通用算法。
(非常伪代码python。这不会运行未修改!!)
index = {} # a hash table containing hash tables of buckets
for bucket in buckets:
for product in products:
capacity = find_capacity(bucket,product)
sell_rate = 1/sales_velocity[product] #assuming sales_velocity are not fractions
longevity = capacity * sell_rate
index[bucket][product] = longevity
for bucket in buckets:
product = find_maximum_longevity(index, bucket)
print bucket, product
答案 2 :(得分:0)
模拟退火听起来不错,但您必须小心选择参数和变异函数才能获得良好的解决方案。
您还可以将问题指定为一系列方程式,并调用整数编程(IP)包(例如http://www.coin-or.org/)以找到最佳或接近最优的解决方案。