Python 蛮力算法在奶牛运输中的问题

Python 蛮力算法在奶牛运输中的问题,python,python-3.x,Python,Python 3.x,我在研究优化问题,我被一个家庭作业问题困住了。我必须写一个蛮力算法来减少宇宙飞船旅行的次数。问题是:外星人创造了一种新型的奶牛,现在他们想用最少的行程把它运回来。每次行程的最大值为10吨 这个练习提供了一些东西,比如这个算法来获取列表中所有可能的分区: 来自codereview.stackexchange.com def分区设置: 如果未设置: 收益率[] 回来 对于范围2**lenset//2中的i: 零件=[设置,设置] 对于集合中的项目: 零件[i&1]。附加项 i>>=1 对于分区Spa

我在研究优化问题,我被一个家庭作业问题困住了。我必须写一个蛮力算法来减少宇宙飞船旅行的次数。问题是:外星人创造了一种新型的奶牛,现在他们想用最少的行程把它运回来。每次行程的最大值为10吨

这个练习提供了一些东西,比如这个算法来获取列表中所有可能的分区:

来自codereview.stackexchange.com def分区设置: 如果未设置: 收益率[] 回来 对于范围2**lenset//2中的i: 零件=[设置,设置] 对于集合中的项目: 零件[i&1]。附加项 i>>=1 对于分区Sparts[1]中的b: 产量[零件[0]]+b def获取分区设置: 对于分区集合中的分区: 收益率[为分区中的elt列出] 输入是一个奶牛的dict,如下所示:cows={'Jesse':6,'Maybel':3,'Callie':2,'Maggie':5},键是奶牛的名称,值是奶牛的重量(吨)

输出必须是一个列表列表,其中每个内部列表表示一次行程,如下所示: 杰西、凯莉、梅贝尔、玛姬

我的问题是:如何使用get\u分区实现这个算法?DFS是解决这个问题的好方法吗

我已经尝试了很多方法,但在stackoverflow找到的其中两种方法似乎更接近于答案:

使用get_partitions函数获取所有可能的组合,并在列表中选择所有符合limit=10的组合。正如我在这里看到的:但它没有工作,因为它返回了一个空列表

然后我尝试了深度优先搜索,就像我在这里看到的那样,做了一些修改:列表还没有返回正确的答案

这是我从正确答案中得到的最接近的答案。首先,我使用get_分区来生成所有可能的分区,然后我将分区过滤到一个名为“可能”的列表中,其中只包含带限制的trips
这是我从正确答案中得到的最接近的答案。首先,我使用get_分区生成所有可能的分区,然后使用极限背包算法将分区过滤到名为“仅限trips的可能”的列表中?@depperm是的,这是一个具有暴力的背包问题赋值
AssertionError: Lists differ: [['Callie', 'Maggie']] != [['Jesse', 'Callie'], ['Maybel', 'Maggie']]

First differing element 0:
['Callie', 'Maggie']
['Jesse', 'Callie']


Second list contains 1 additional elements.
First extra element 1:
['Maybel', 'Maggie']

- [['Callie', 'Maggie']]
+ [['Jesse', 'Callie'], ['Maybel', 'Maggie']]

----------------------------------------------------------------------
Ran 5 tests in 0.009s

FAILED (failures=1)
def brute_force_cow_transport(cows, limit):
    ## Generate set of partitions
    possible_combinations = []
    for partition in get_partitions(cows.keys()):
        possible_combinations.append(partition)
    possible_combinations.sort(key=len)

    valid_combinations = possible_combinations[:] ## or list.copy() if using python 3.3+

    ## Remove invalid partitions
    for partition in possible_combinations:
        for trip in partition:
            total = sum([cows.get(cow) for cow in trip])
            if total > limit:
                valid_combinations.remove(partition)
                break

    ## Return valid partition of minimum length
    return min(valid_combinations, key=len)