PCB 合拼遍历(全排序+旋转90度) 基本遍历方法

     分享一下PCB合拼的组合的遍历方法,在分享之前先纠正一下 PCB拼板之多款矩形排样算法实现--学习  时间复杂度计算错误

 一.PCB 合拼(全排序+旋转90度)的时间复杂度是多少?

二.合拼遍历(全排序+旋转90度)  基本遍历方法 

    1.调用方法

            //准备数据
            List<RectSizeDemo> RectSizeList = new List<RectSizeDemo>();
            RectSizeList.Add(new RectSizeDemo() { Name = "A板" });
            RectSizeList.Add(new RectSizeDemo() { Name = "B板" });
            RectSizeList.Add(new RectSizeDemo() { Name = "C板" });
            //3款板  全排序组合总类     1*2*3=6
            //3款板  旋转90度组合总类   2*2*2=8 
            //3款板  总排样组合         6*8=48种组合
            //计算 PCB旋转90度组合总类
            int PowCount = (int)Math.Pow(2, RectSizeList.Count()) - 1;
            //执行PCB 合拼遍历(全排序+旋转90度)
            RectSizeDemo.Loop(RectSizeList, PowCount, 0, RectSizeList.Count - 1); 

    2.合拼遍历方法类(全排序+旋转90度)

    /// <summary>
    /// 全排序+旋转90 示例
    /// </summary>
    public class RectSizeDemo
    {
        /// <summary>
        /// PCB板名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 成品尺寸
        /// </summary>
        public Size Size { get; set; }
        /// <summary>
        /// 递规全排序+旋转
        /// </summary>
        /// <param name="RectSizeList"></param>
        /// <param name="PowCount"></param>
        /// <param name="k"></param>
        /// <param name="m"></param>
        public static void Loop(List<RectSizeDemo> RectSizeList, int PowCount, int k, int m)
        {
            if (k == m)
            {
                for (int i = 0; i <= PowCount; i++)
                {
                    for (int j = 0; j <= m; j++)
                    {
                        string pnString = (((i >> j) & 1) == 1) ? "旋转0 " : "旋转90";
                        Console.Write($"【{RectSizeList[j].Name} {pnString}】");
                    }
                    Console.WriteLine("");
                }
                Console.WriteLine("===============================");
            }
            else
            {
                for (int i = k; i <= m; i++)
                {
                    Swap(RectSizeList, k, i);
                    Loop(RectSizeList, PowCount, k + 1, m);
                    Swap(RectSizeList, k, i);
                }
            }
        }
       /// <summary>
       /// 交换数据
       /// </summary>
       /// <param name="RectSizeList"></param>
       /// <param name="i"></param>
       /// <param name="j"></param>
        public static void Swap(List<RectSizeDemo> RectSizeList, int i, int j)
        {
            RectSizeDemo t = RectSizeList[i];
            RectSizeList[i] = RectSizeList[j];
            RectSizeList[j] = t;
        }
    }

 

 三. 上面代码,A,B,C三款板运行后效果

      1.A,B,C三款PCB板合拼,全排序组全共1*2*3=6种排样方式

      2.每一种全排序组合,对应每款板都可以旋转90度,那么旋转组合总数2*2*2=8种旋转方式

      3.总排样组合:6*8=48种组合

 

 四.小结

      当PCB板为10款板,排样组合总类数达到了惊人的37亿种组合,如此大计算量,普通计算机已消化不了这么大计算量了,那么我们可以想像一下,如果PCB合拼是20款板或30款板,再或者PCB合拼中嵌入了各种规则加入排样算法中,此时还想指望计算机能有限时间内计算全部排样方式来是不现实的。当我们遇到组合爆炸问题, 通常会在合拼算法上做一些技巧处理,虽然不能达到全局最优解,但在算法优化上以我们对PCB的合拼排样规则深入了解,可以近可能的的求出近似最优解的。

 

 附上PCB合拼排样方案

 

 

转载于:https://www.cnblogs.com/pcbren/p/11013784.html

一、约定术语:   大板(Sheet)(也叫板料):是制造印制电路板的基板材料,也叫覆铜板,有多种规格。如:1220X1016mm。   拼板(Panel)(也叫生产板):由系统根据拼板设定的的范围(拼板最大长、最小长和拼板最大宽、最小宽)自动生成;   套板(Unit):有时是客户定单的产品尺寸(Width*Height);有时是由多个客户定单的产品尺寸组成(当客户定单的尺寸很小时即常说的连片尺寸)。一个套板由一个或多个单元(Pcs)组成;   单元(Pcs): 客户定单的产品尺寸。   套板间距(DX、DY)尺寸 :套板在拼板中排列时,两个套板之间的间隔。套板长与长方向之间的间隔叫DX尺寸;套板宽与宽方向之间的间隔叫DY尺寸。   拼板工艺边(DX、DY)尺寸(也叫工作边或夹板边):套板与拼板边缘之间的尺寸。套板长方向与拼板边缘之间的尺寸叫DX工艺边;套板宽方向与拼板边缘之间的尺寸叫DY工艺边。   单元数/每套:每个套板包含有多少个单元   规定套板数:在开料时规定最大拼板包含多少个套板   套板混排:在一个拼板里面,允许一部份套板横排,一部份套板竖排。 开料模式:开料后,每一种板材都有几十种开料情况,甚至多达几百种开料情况。怎样从中选出最优的方案?根据大部份PCB厂的开料经验,我们总结出了5种开料模式:1为单一拼板不混排;2为单一拼板允许混排;3、4、5开料模式都是允许二至三种拼板,但其排列的方式和计算的方法可能不同(从左上角开始向右面和下面分、从左到右、从上到下、或两者结合)在后面的拼板合并 中有开料模式示意图。其中每一种开料模式都选出一种最优的方案,所以每一种板材就显示5种开料方案。(选择的原则是:在允许的拼板种类范围内,拼板数量最少、拼板最大、拼板的种类最少。)    二、 开料方式介绍(开料方式共有四个选项):   1、单一拼板:只开一种拼板。   2、最多两种拼板:开料时最多有两种拼板。   3、允许三种拼板:开料时最多可开出三种拼板。(也叫ABC板)   4、使用详细算法:该选项主要作用:当套板尺寸很小时(如:50X20),速会比较慢,可以采用去掉详细算法选项,速就会比较快且利用率一般都一样。建议:如产品尺寸小于50mm时,采用套板设定(即连片开料)进行开料,或去掉使用详细算法选项进行开料。    三、 开料方法的选择   1、常规开料:主要用于产品的尺寸就是套板尺寸,或人为确定了套板尺寸   直接输入套板尺寸,确定套板间距(DX、DY)尺寸,确定拼板工艺边(DX、DY)尺寸,选择生产板材(板料)尺寸,用鼠标点击开料(cut)按钮即可开料。   2、套板设定开料(连片开料):主要用于产品尺寸较小,由系统自动选择最佳套板尺寸。   套板设定开料 可以根据套板的参数选择不同套板来开料,从而确定那一种套板最好,利用率最高。从而提高板料利用率,又方便生产。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值