Algorithm 优化产品配置,最大限度地延长重新进货前的时间

Algorithm 优化产品配置,最大限度地延长重新进货前的时间,algorithm,Algorithm,股票分配问题 我有一个问题,即具有不同销售率的一组已知产品中的每一个都需要分配到一个或多个固定数量的桶中。 每个产品必须至少在一个桶中,桶不能共享产品。 所有的桶都必须装满,产品通常装在多个桶中 我的问题是优化产品在所有桶中的分配,以便在任何一种产品售罄之前最大限度地延长时间 使事情复杂化的是,每种类型的桶可能容纳不同数量的每种产品。 这不一定与未知的产品尺寸有关,但可能是任意的。 例如 然而,铲斗A可容纳10个产品1,铲斗B可容纳20个产品2 铲斗A容纳5个产品2,铲斗B容纳8个产品1。 因此

股票分配问题

我有一个问题,即具有不同销售率的一组已知产品中的每一个都需要分配到一个或多个固定数量的桶中。 每个产品必须至少在一个桶中,桶不能共享产品。 所有的桶都必须装满,产品通常装在多个桶中 我的问题是优化产品在所有桶中的分配,以便在任何一种产品售罄之前最大限度地延长时间

使事情复杂化的是,每种类型的桶可能容纳不同数量的每种产品。 这不一定与未知的产品尺寸有关,但可能是任意的。 例如

然而,铲斗A可容纳10个产品1,铲斗B可容纳20个产品2 铲斗A容纳5个产品2,铲斗B容纳8个产品1。 因此,作为投入,我们有一套产品及其销售速度,例如

产品1每天销售6台 产品2每天销售5台 产品3每天销售4台 产品4每天销售7台 一套水桶

桶A 桶B 桶C 桶D 桶E 桶F 桶G 以及一个产品桶查找表,用于确定每个产品的每个桶容量,例如

产品1铲斗A=40; 生产1铲斗B=45: 产品1铲斗C=40; ... 产品2铲斗A=35; ... 产品2铲斗E=20; ... 等 到目前为止,我尝试的方法包括

将每个桶的产品数减少到一个公共因子,直到我意识到产品桶大小的关系是任意的

将产品随机放入存储桶中,迭代每个产品以替换存储桶中的现有产品,并测试它是否会缩短售罄所需的时间。 我对这种方法的担忧是,它可能会选择一条在决策时是最优的路径,但会模糊以后更为最优的选择。 或者,最优决策需要多次产品更改,而这些更改永远不会发生,因为单个选择不是最优的

一个彻底的搜索——结果是,这为一组不太大的产品和桶生成了一个非常大的可能性组合

我最初认为最佳的解决方案是按照与销售率相同的比例分配产品,但发现这不是真的,因为与持有更多库存的配置相比,持有极少量与其销售比率完全匹配的产品的配置不太理想,因此在首次售罄之前拥有更长的销售时间


任何c或伪代码都值得欣赏

我建议使用方法2的一种变体,它基于-伟大的优化方法,其中您的基本策略基于最速下降等。维基百科很好地解释了这个想法;关键的概念部分是:

SA算法的每一步都会替换 当前的解决方案由一个随机变量 附近的解决方案,使用 概率取决于 对应的 函数值和全局 参数T称为温度, 这是逐渐减少的过程中 过程


我认为这个问题可能是NP完全问题,你可能不得不求助于通常的方法GA/SA/广度/深度搜索和/或解决非最优解,这取决于你有多少桶/产品

假设你有足够的产品来装下你所有的桶,而你没有说,你可以用每个桶强制一个产品来决定哪个产品对每个桶来说是最好的。我怀疑这是真的,但如果是真的,这里是通用算法

非常伪代码的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

模拟退火听起来不错,不过要得到一个好的解决方案,必须仔细选择参数和变异函数


您还可以将问题指定为一系列方程,并调用整数规划IP包,例如找到最优或接近最优的解决方案。

这是NP难问题。但是如果你能提供更多的信息,也许可以找到一个好的算法。有多少桶和多少产品?桶的大小有多大差异?你认为有些产品需要很多桶,而大多数产品只需要1桶吗?等。作为输入,铲斗和产品会有所不同。通常在一到七种产品之间。通常在六到五十桶之间。是的,通常几个产品会装在几个桶里。所有桶必须装满,所有产品至少在一个桶中使用。我将对原文进行编辑,使之更清楚。感谢对于某些套装,水桶尺寸不会改变,至少水桶本身不会改变,但产品之间可能会有细微差别。例如,所有桶可容纳12个产品1、2、3和4,以及10个产品5和6。对于其他组,某些铲斗的大小可能是其他铲斗的两倍。我的问题是,我被迫接受每种产品的桶大小,我认为
可能有一些无意义的规则说Bucket A只能容纳产品1的2,因为这是查找表中的值。我有无限量的特定产品供应。产品的种类永远不会比桶多,但通常会比产品种类多,所以一个给定的产品类型通常会包含多个桶。再想一想,基本上我拥有的是桶*产品的矩阵。然后,我必须对每个桶进行一次选择,以使其符合我的目标。模拟退火看起来不错-它不能保证最佳解决方案。但它提出的任何解决方案都肯定比前一个好。我不完全确定的一件事是,为什么在早期避免陷入局部极小值的风险必然比在以后的迭代中避免陷入局部极小值要好。我们可能会从一条通往更好的最小值的道路上跳下来,这难道不是一种反风险吗?@flesk,这是可能的,你可以通过多次传球并记住最好的结果来预防它;如果你知道目标函数的N维形状,以及在一个点上计算它的成本,你通常可以立即估计出最佳折衷,因为你的不连续的允许点集,目标计算是一个便宜的和,我想你最好尝试迭代。