【问题标题】:Dynamic programming in Python - Resource AllocationPython 中的动态编程 - 资源分配
【发布时间】:2021-08-25 03:40:34
【问题描述】:

问题描述:

假设农场上有n 圣诞树。您希望最大限度地提高所有树木都准备好迎接圣诞节的机会。为了让树木长得更快,你可以用m袋肥喂它们。

你已经根据你施肥的袋子数计算了每棵树按时准备好的概率。您有一个列表p[i][j] 表示如果施用了j 袋肥料,植物i 将准备好的概率。你不能把袋子分开,一旦一袋肥料施到一棵树上,你就不能将它用于不同的树。

施肥越多,树木并不总是生长得越快,因此随着施肥数量的增加,概率可能会减少或增加。

找出所有树木在圣诞节前完全长成的最大概率

问题:
如何使用动态规划制表解决它?请编写一个带有 3 个参数的函数best_allocation(number_of_trees, number_of_bags, probability_list)。理想情况下,此函数通过优化分配肥料袋给植物,返回所有圣诞树为圣诞节做好准备的最高概率。

测试用例:

probs=  [[0.5, 0.5, 1],[0.25,0.1,0.75]]
best_allocation(2,2,probs)
#In this case, the best choice is to allocate 0 bags to tree0, and allocate 2 bags to tree1, 
#which gives us an overall probability of 0.75*0.5 = 0.375

probs = [[0.5, 0.75, 0.25],[0.75,0.25,0.8]]
best_allocation(2,2,probs)
#In this case, the best choice is to allocate 1 bags to plant0, and allocate 0 bags to plant1. 
#The overall probability is 0.75*0.75=0.5625

【问题讨论】:

  • 嗨@Ning!你能提供一个minimal reproducable example吗?你的目标描述得很好,但我们需要看看你的问题出现在哪里。
  • 请注意,在 python 中,cmets 以 # 开头,而不是 //

标签: python dynamic-programming


【解决方案1】:

您是否正在寻找类似的递归函数:

def best_allocation(number_of_trees, number_of_bags, probability_list):
    if number_of_trees == 1:
        return max(probability_list[0][:number_of_bags + 1])
    return max(
        best_allocation(
            number_of_trees - 1,
            number_of_bags - bags,
            probability_list[1:]
        ) * probability_list[0][bags]
        for bags in range(0, number_of_bags + 1)
    )

如果您只有一棵树,则取可用的最高概率(限制是可用袋子的数量)。如果您有n + 1 树,则查看所有可能分配给“新”树 (+ 1) 的袋子,并结合剩余袋子对n 树的最佳分配,然后得出最佳的总体结果 ( max)。

编辑: 一种添加记忆的简单方法是:

def memo(func):
    cache = {}
    def wrapper(n, m, list_of_lists):
        args = (n, m) + tuple(tuple(list_) for list_ in list_of_lists)
        if args not in cache:
            cache[args] = func(n, m, list_of_lists)
        return cache[args]
    
    return wrapper

@memo
def best_allocation(number_of_trees, number_of_bags, probability_list):
    ...

【讨论】:

  • 嗨@Timus 我正在寻找一种使用记忆化(动态编程)找到最大概率的解决方案。但是递归解决方案是一个非常好的开始。非常感谢!顺便问一下,关于如何构建备忘录表以及我们应该在每个单元格中存储哪些值?
  • @Ning 你是说记忆化的缓存吗?如果需要,我通常使用标准库中的 lru_cache 装饰器。但是你的函数参数的一部分 - 列表 - 是不可散列的,所以这不是一个选项。如果您构建自己的备忘录表(可能通过将列表列表转换为元组),您需要找到解决方法。
  • 嗨@Timus 是的,我的意思是建立我自己的备忘录表,就像这个问题的前两个解决方案中显示的备忘录表geeksforgeeks.org/coin-change-dp-7
猜你喜欢
  • 2021-10-13
  • 1970-01-01
  • 2011-06-06
  • 2012-03-25
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
相关资源
最近更新 更多