Packing(石板切割问题)回溯算法

本文探讨了石板切割问题,旨在最大化利用目标石块切割出所需样板石块。采用一刀切的方式,通过回溯算法进行递归切割,并以伪代码形式展示算法设计。Python代码实现中,使用remaining_stonelist跟踪切割过程。实验结果显示,随着数据量增加,算法优化空间增大,如调整切割顺序和改进剪支函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

    给定一个最大的总切割目标石块,再给定一系列我们需要的样板石块。寻找切割方法使得我们从目标石块上切割出的所需样板石块的面积和最大,即对目标石块的利用率最高。限制切割为一刀切,即一次切割必须把一块石板一分为二,不能只切一段。

       

左边为目标石块W=8,L=4,右边为样板石块,一共四块。现在我们讨论每种样板石块只切割一块(后续通过输入可以切割k块)。所谓一刀切的意思就是,比如我先从8X4中切割4X3这个石块。第一刀我按照W=4来切,于是分成了两块4X4的石板,第二刀从其中一块石板中按L=3来切,于是分成了一块4X3和一块4X1的石块,如图。

二、算法设计

    将所需的样板模块按照面积从大到小进行排序,每次取最大的那块进行切割,在数据量非常大的情况下,单步的最优利用率可能导致全局的最优利用率。进行递归切割,在递归切割的前提下进行回溯,利用限界函数来缩小时间复杂度。

    回溯算法的伪代码为,

 

Backtrck(i)
    if i > n then #到达叶节点
        if cs > bests then bests = cs
    else
        if C(i) <= S then #走1分支
            cs = cs + s[i]
            Backtrck(i+1)
            cs = cs - s[i]
        if B(i) > bests then #不满足剪支条件可以走0分支
            Backtrak(i+1)

其中C(i) = 当前要切割的样板石块的面积S = 当前剩余可以切割的石块中最大的石块面积,如果当前要切割的面积小于剩余可以切割石块中的最大面积,说明当前石块可以被切割(走1分支)。B(i)= 当前要切割的样板石块的后面i+1,...n块样板石块的面积和,意思为,如果把剩下所有样板石块都切割完成,得到的切割总面积还小于当前已经得到的一个最好解(bests),这时就不用再走0分支,往下递归,因为再走0分支往下递归,也无法得到更好的解,这就叫满足剪支函数。反之,不满足剪支函数,也就是在当前走0分支可能得到

评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值