【问题标题】:space (slots) optimization algorithm空间(槽)优化算法
【发布时间】:2012-08-17 11:02:09
【问题描述】:

我将直接从示例开始:

在游戏中,玩家将使用一个袋子来存放他们的物品(物品的尺寸可变),并且袋子的尺寸也是可变的。

在一个 8x15 插槽的袋子中,我需要插入一个占用 2x2 插槽的项目,我可以搜索空间以实际检查是否有足够的空间来存储该项目 - 这很容易,但是,如果我不这样做呢?没有足够的空间来存储请求的项目?这是真正的问题。

我正在尝试找到一种方法来实际重新排列当前包中的所有当前项目,以便为新项目释放空间。

有什么算法可以帮助我做到这一点吗?

编辑

规则:

  1. 我无法移除包中的任何现有物品,如果空间不足,只需重新排列它们以便存放新物品。

【问题讨论】:

  • @Jochen 这不是背包问题,因为我们不是试图获得最大的子集,而是试图确定一个特定的集合是否适合给定的容器。
  • 单个项目可以是什么形状和大小?如果他们受到约束,问题就会变得容易得多。
  • @bdares 实际上我有一些可变尺寸,1x1、1x2、1x4、2x2、2x4、3x3、4x3,但这可以改变。
  • 我没有手边的算法,但我会写一个从最大到最小的算法,然后从那里开始工作。您总是可以找到一个可以放置 1x1 物品的位置,但最后使用 5x2 物品可能更具挑战性。

标签: algorithm language-agnostic


【解决方案1】:

不幸的是,我认为这是一个 NP 难题,但您可以使用贪心逼近算法。近似算法可以如下工作:

  • 按项目数量降序对所有项目进行排序。
  • 遍历列表并尝试将当前项目放置在任何位置
  • 如果在任何时候无法将当前物品安装在任何地方,请确定无法拾取该物品。
  • 如果所有部件都安装好,则决定可以拾取该物品。

这是基于直观的想法,即较大的零件比较小的零件“更难”放置。如果大多数物品都是 1x1,您可以做的另一件事是暴力解决方案,这在如此小的库存中是非常可行的。这将按如下方式工作:

  • 尝试当前作品的每个位置,它仍然适合每个位置:
  • 对下一个未定位的部分执行此操作。

这总能解决您的问题,但速度较慢(虽然更准确)。可以通过省略每个 1x1 块,然后放置它们来改进该算法。

【讨论】:

  • 也可以使用诸如回溯之类的搜索技术来代替蛮力搜索。借助良好的启发式方法,此类方法通常可以比简单的枚举方法更快地找到解决方案(如果存在),尽管它们在证明不存在解决方案方面同样缓慢。
  • 我知道这已经很久了,但我已经设法通过使用遗传算法解决了这个问题 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
相关资源
最近更新 更多