分享一下PCB合拼的組合的遍歷方法,在分享以前先糾正一下 PCB拼板之多款矩形排樣算法實現--學習 時間複雜度計算錯誤html
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度)oop
/// <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; } }
1.A,B,C三款PCB板合拼,全排序組全共1*2*3=6種排樣方式post
2.每一種全排序組合,對應每款板均可以旋轉90度,那麼旋轉組合總數2*2*2=8種旋轉方式學習
3.總排樣組合:6*8=48種組合優化
當PCB板爲10款板,排樣組合總類數達到了驚人的37億種組合,如此大計算量,普通計算機已消化不了這麼大計算量了,那麼咱們能夠想像一下,若是PCB合拼是20款板或30款板,再或者PCB合拼中嵌入了各類規則加入排樣算法中,此時還想期望計算機能有限時間內計算所有排樣方式來是不現實的。當咱們遇到組合爆炸問題, 一般會在合拼算法上作一些技巧處理,雖然不能達到全局最優解,但在算法優化上以咱們對PCB的合拼排樣規則深刻了解,能夠近可能的的求出近似最優解的。url
附上PCB合拼排樣方案spa