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合拼排樣方案

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM