我正在编写第一个较大的Haskell程序。生成的应用程序必须在一组约束下分配资源。该算法方法是蛮力的,因为为每个任务分配资源取决于先前的分配。这基本上是在每次分配后通过约束检查进行回溯。我现在正在考虑应该使用哪种数据结构来使其尽可能高效。
程序的输出(值)是资源分配的列表。使用StateT
monad转换器将可用资源集作为状态进行处理。该状态是一个包含多个容器的容器:一个人的容器,每个人都有一个天的容器,每个人都有一个已分配时间的容器(在程序启动之前预先分配,或者由程序分配)。
在寻找可行解决方案的过程中,当在特定日期的特定日期,特定时间将任务分配给特定人员时,将修改最低级别(分配时间)的容器。鉴于搜索可能会大量回溯,这将导致大量不可变数据的“副本”。更具体地讲,在每次状态更改期间,恰好一个项目将被添加到最低级别的恰好一个容器中:特定日期的一次将分配给特定的人。我的问题是:
鉴于大量不可变数据的副本,我应该使用哪种数据结构?