<p>这里有一些似乎工作正常的东西。由于组合中的书架顺序无关紧要,所以它只是使用蛮力方法来检查书架的每个可能组合。因为要处理的代码可能非常多,所以编写效率相当高的代码非常重要。在本质上是一个搜索或路径发现问题的情况下,可能有更多的优化算法可以更快地实现这一点。你知道吗</p>
<p>考虑到这一点,并且为了使访问每个shelf dictionary中的字段更容易,它首先将它们全部转换为代码从此开始使用的<code>namedtuple</code>实例的等效列表。(如果您真的需要词典形式的文档,可以很简单地保留一份副本,或者在必要时重新创建。)</p>
<p>转换完成后,它将检查从1到所有货架项目的所有组合。它将找到的这些存储在名为<code>groups</code>的列表中。<code>group[N]</code>将包含满足条件的<code>N</code>项组合的子列表。(当然,子列表的长度是找到的书架数量的组合数)。你知道吗</p>
<p>例如,在下面的输出中,它显示有4组2个项目符合标准。(不过,它不会打印它们的每个组合。)</p>
<pre><code>from collections import namedtuple
from itertools import combinations
from operator import itemgetter
shelves_to_pack = [
{'ShelfLength': 2278.0, 'ShelfWidth': 356.0, 'ShelfArea': 759152.0, 'ItemNames': 1},
{'ShelfLength': 1220.0, 'ShelfWidth': 610.0, 'ShelfArea': 372100.0, 'ItemNames': 2},
{'ShelfLength': 2310.0, 'ShelfWidth': 762.0, 'ShelfArea': 1760220.0, 'ItemNames': 3},
{'ShelfLength': 610.0, 'ShelfWidth': 610.0, 'ShelfArea': 1450435.0, 'ItemNames': 4}]
# convert dict list into a namedtuple list to simplify field access
Shelf = namedtuple('Shelf',
'length width area item_names')
shelves = [Shelf(length=shelf['ShelfLength'], width=shelf['ShelfWidth'],
area=shelf['ShelfArea'], item_names=shelf['ItemNames'])
for shelf in shelves_to_pack]
MAX_WIDTH, MAX_LENGTH = 1219.2, 2438.5
MAX_AREA = 2972897.28
def meets_criteria(shelf_combo):
""" Determine if shelf combination meets criteria. """
return (sum(shelf.area for shelf in shelf_combo) <= MAX_AREA
and (sum(shelf.length for shelf in shelf_combo) <= MAX_LENGTH
or sum(shelf.width for shelf in shelf_combo) <= MAX_WIDTH))
groups = [[]] # first group representing zero shelf items is always empty
for num_shelves in range(1, len(shelves)+1):
groups.append([combo for combo in combinations(shelves, num_shelves)
if meets_criteria(combo)])
for i, group in enumerate(groups):
print('groups of {} items: size {}'.format(i, len(group)))
</code></pre>
<p>这是由上述代码和输入数据生成的输出:</p>
<pre class="lang-none prettyprint-override"><code>groups of 0 items: size 0
groups of 1 items: size 4
groups of 2 items: size 4
groups of 3 items: size 0
groups of 4 items: size 0
</code></pre>