|
业余的业余
Posted 2021-9-11 08:47
不知道理解是否正确:
比如 $m$ 个业务代表处 ( $m\le 30$), $n$ 个外包公司 ($n\le 20$),这样可以构造一个二维数组 $a_{mn}$, 其中 $a_{ij}$ 是业务代表处 $i$ 中来自外包公司 $j$ 的人员的个数。
要求一个算法,把这不超过 $600$ ($m\times n$)个整数分成 $10$ 个组,使各组中数的总和构成的数组满足特定的统计特性,比如方差最小。
业务比较生疏了,可能是胡说八道。确定性的算法(比如分枝限界,回溯法之类的状态空间搜索算法)对这个规模的问题可能不现实。当然我实际上大大夸张了这个问题的规模,现实中不大可能所有的业务代表处都有所有外包公司的人员,也就是说会存在大量的 $a_{ij}=0$. 这些为 $0$ 的元素当然可以直接忽略。当然这样处理后的一维整数数组可能还是不适合确定性的算法(状态空间是颗10叉树,回溯加适当的剪枝应该就优化到顶了).
一个比较现实的做法可以用某个策略构造一个较优的解,再用随机算法在给定的时间界限类改进这个解。具体可行性如何要试试才知道。
比如可以试着把这些数按从大到小排序,
1. 取第一个桶(标签),从大取起,到此桶当前总和快超未超平均值时停止
2. 用同样的办法取剩下的9个桶.
剩下未归入特定桶的数的个数如果已经较少,可用确定性算法处理。否则往当前总和最小的桶中装剩下的最大的数,一直到剩下的数小到适合用确定性算法(标准的子集树回溯法)处理。这样会得到一个较好的解。这个解可以再在给定的时间限制内用随机算法改进,比如一个随机的策略可以这样: 随机的从每个桶中取一个,再用确定性算法找出最有分配这些数的解,如果比当前最优解更好,那就得到了一个更优解。或许应该从随机的桶中取出随机个数的数,使取出的总个数适合于用确定性算法处理,然后用确定性算法处理之。重复这个过程直到总运行时间达到设定的上限,这样就得到了一个合理成本下的较优解。 |
|