回溯法 | 求解装载问题

问题描述:

有 n 个集装箱要装上一艘载重量为 W 的轮船,其中集装箱 i (1<=i<=n) 的重量,为wi。子啊装在体积不受限制的情况下,将尽可能重的集装箱装上轮船,当重量相同时要求选取的集装箱个数尽可能少,编写一个实验程序采用回溯法求解。要求采用适当的剪枝条件提高效率,左孩子结点剪枝的条件是只装载满足重量要求的集装箱,右孩子结点剪枝的条件是至多要选中 3 个集装箱。

例如,n=5,W=10,w[] = {5,2,6,4,3}时,其最佳装载方案是(0,0,1,1,0),既装载第3、4个集装箱。

问题分析:

看完题目感觉可以用穷举法把所有可能性全列举出来,然后从所有结果中选取一个最优解,然后输出。

but,题目需要回溯法,那么就要考虑用回溯法的思想去解决这个问题。

回溯法:在包含问题的所有解的解空间树中,按照深度搜索优先的策略,从根节点出发搜索解空间树。

下图展示的是程序的大致执行过程。

简单的说就是一直在深度优先搜索结果,查找完当前层的时候需要恢复以前修改数据,保证

  • 8
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
最优装载问题是指在给定一些货物和一些集装箱的容量限制下,如何选择并装载货物使得装载的总重量最大。这是一个经典的组合优化问题,可以使用回溯法进行求解回溯法的基本思想是将问题的解空间表示成一个树形结构,从根节点开始递归搜索所有可能的解,当搜索到叶子节点时,判断该叶子节点是否满足问题的约束条件,如果满足则记录该解,并回溯到上一层继续搜索,如果不满足则直接回溯到上一层。 具体来说,对于最优装载问题,可以将每个货物看作一个节点,每个节点有两种状态,即选中和不选中。从根节点开始,依次选择每个节点的状态,计算当前装载的总重量,如果超出了集装箱的容量限制则回溯到上一层,否则继续递归搜索下一层节点。当搜索到叶子节点时,记录当前的最优解,并回溯到上一层继续搜索。最终,所有可能的解都会被搜索到,从中选取最优解即可。 需要注意的是,使用回溯法求解最优装载问题的时间复杂度很高,因为需要搜索所有可能的解。为了提高效率,可以使用剪枝策略,即在搜索过程中根据当前装载的总重量集装箱的容量限制,预测当前节点的子树中可能出现的最大总重量,如果该值小于当前的最优解,则可以剪枝,直接回溯到上一层。这样可以避免搜索无用的子树,减少搜索时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值