最小长度电路板排列问题

问题描述:

最小长度电路板排列问题是大规模电子系统设计中提出的实际问题。
该问题的提法是,将 n 块电路板以最佳排列方案插入带有n个插槽的机箱中。n块电路板的不同的排列方式对应于不同的电路板插入方案。
设 B={1,2,…, } 是 n 块电路板的集合。集合 L={ N1,N2 ,N3…, } 是 n 块电路板的 m 个连接块。其中每个连接块是B的一个子集,且 中的电路板用同一根导线连接在一起。
例如,设n=8,m=5。给定n块电路板及其m个连接块如下:
B={1,2,3,4,5,6,7,8};L={ N1,N2 ,…, };
N1={4,5,6};N2 ={2,3};N3 ={1,3}; N4={3,6};N5 ={7,8}。

在最小长度电路板排列问题中,连接块的长度是指该连接块中第1块电路板到最后1块电路板之间的距离。例如在图示的电路板排列中,连接块 的第1块电路板在插槽3中,它的最后1块电路板在插槽6中,因此 的长度为3。同理 的长度为2。图中连接块最大长度为3。试设计一个分支限界法找出所给n个电路板的最佳排列,使得m个连接块中最大长度达到最小。
本文参考了 https://blog.csdn.net/ioio_/article/details/81166158

他是用Java写的,我用C++改写,并加入了一些注释,如有理解不到位的地方,还请大佬指教.

#include <iostream>
#include<fstream>
#include <vector>
using namespace std;int n, m;
int bestx[10];// 这是最终的最优解排列顺序
int B[10][10];//电路板在连接块中的排列,是一个二维数组
int x[10], low[10], high[10];// 分别是当前的排列、最左边电路板、最右边电路板
int bestd=0;// 最优解int len(int ii) {// 计算当前ii排列最小长度for (int i = 1; i <= m; i++) {high[i] = 0;low[i] = n + 1;// 先初始化最左边和最右边的值,}for (int i = 1; i <= ii; i++)// 对于第i行for (int k = 1; k <= m; k++)// k列if (B[x[i]][k] > 0) {// 如果第i个电路板在第k个连接块中,if (i < low[k])//low[k]代表第K个连接块的最左边的值,如果i比它小,则更新左值low[k] = i;if (i > high[k])high[k] = i;//如果比初始的右值大,则更新右值}int tmp = 0;for (int k = 1; k <= m; k++)if (low[k] <= n && high[k] > 0 && tmp < high[k] - low[k])tmp = high[k] - low[k];//计算每个连接块的举例return tmp;
}
void swap(int* x, int i, int j) {// 交换i和j位置的值int tmp;tmp = x[i];x[i] = x[j];x[j] = tmp;
}
void backtrack(int i) {if (i == n) {// 如果到达末尾int tmp = len(i);// 计算当前排列最小长度if (tmp < bestd) {bestd = tmp;for (int j = 1; j <= n; j++)bestx[j] = x[j];} // 如果比最优解还要好,则更新bestx[]排列;} else {// 若不是末尾;for (int j = i; j <= n; j++) {swap(x, i, j);int ld = len(i);if (ld < bestd)backtrack(i + 1);// 则继续进入下一个数,swap(x, i, j);}}
}int arrangeBoards() {bestd = n + 1;// 先假设一个很大的值for (int i = 1; i <= n; i++)x[i] = i;// 这里是最开始的排序;backtrack(1);return bestd;
}int main(void) {ifstream ifs("input.txt");//文件输入流ifs>>n;ifs>>m;vector<int> temp(m);for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {ifs>>B[i][j] ;// 输入的电路板的二维数组排列}}int minLen = arrangeBoards();cout<<minLen<<endl;for (int i = 1; i <= n; i++)cout<<bestx[i]<<" ";ifs.close();return 0;
}

输入文件 input.txt:
8 5
1 1 1 1 1
0 1 0 1 0
0 1 1 1 0
1 0 1 1 0
1 0 1 0 0
1 1 0 1 0
0 0 0 0 1
0 1 0 0 1

//输出结果
4
5 4 3 1 6 2 8 7
觉得有用的话,请给个赞哦

最小长度电路板排列问题(C++实现)相关推荐

  1. 最小长度电路板排列问题_射频电路板设计,这篇文章五大总结不可忽视!

    射频电路板设计由于在理论上还有很多不确定性,因此常被形容为一种"黑色艺术",但这个观点只有部分正确,RF电路板设计也有许多可以遵循的准则和不应该被忽视的法则. 不过,在实际设计时, ...

  2. 最小长度路线板排列问题

    问题描述 最小长度电路板排列问题是大规模电子系统设计中提出的实际问题.该问题的提法是,将 n 块电路板以最佳排列方案插入带有 n 个插槽的机箱中.n 块电路板的不同的排列方式对应于不同的电路板插入方案 ...

  3. 以太网帧的最小长度_802.3?以太网?看完你就懂了

    关注.星标公众号,不错过精彩内容 上一篇文章<以太网数据包结构>讲解了以太网数据包结构,其中牵扯到了802.3,以太网数据包等名词,本文将详解讲解一下这方面的内容. 在TCP/IP世界中, ...

  4. 求电缆最小长度——最小生成树

    问题描述: You are assigned to design network connections between certain points in a wide area. You are ...

  5. c语言计算存储大小,在C语言中5种基本数据类型的存储空间长度的排列顺序

    在C语言中5种基本数据类型的存储空间长度的排列顺序 來源:互聯網  2010-04-22 19:19:59  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題 ...

  6. [计算机网络] CSMA/CD 协议限定数据帧最小长度为 64B 不变,根据给定的数据传输速率计算得到争用期长度

    如下图所示, 在Hub再生比特流的过程中会产生1.535us延时, 信号传播速率为200m/us,Hub速率是100Mb/s,不考虑以太网帧的前导码,则H3和H4之间理论上可以相距的最远距离是( ). ...

  7. 【算法题】2696. 删除子串后的字符串最小长度

    题目: 给你一个仅由 大写 英文字符组成的字符串 s . 你可以对此字符串执行一些操作,在每一步操作中,你可以从 s 中删除 任一个 "AB" 或 "CD" 子 ...

  8. html文本最小长度,CSS中处理不同长度文本的几种小技巧

    CSS中处理不同长度文本的几种小技巧 [推荐教程:CSS视频教程 ] 当我们使用 CSS 构建布局时,考虑长短文本内容很重要,如果能清楚地知道当文本长度变化时需要怎么处理,可以避免很多不必要的问题. ...

  9. 以太网帧的最小长度_揭秘以太网帧长中隐藏的两个内容:前导码、帧间隙

    ​概述 我们在工作中,经常听到小伙伴说报文的长度是64.128.256字节等,我们都知道它们是什么意思,不过在计算网络带宽时,总是会比预想的要小,并且报文越小,差距越大. 这个问题几乎是所有网络新手都 ...

最新文章

  1. 微信小程序 循迹功能制作
  2. 视学算法第五轮送书活动获奖名单
  3. 《Adobe Acrobat DC经典教程》—第1章1.11节在阅读模式下查看PDF文件
  4. 2015: [Usaco2010 Feb]Chocolate Giving
  5. 【 C 】结构体 与 typedef
  6. 公安网安装mysql 5.7_安装Mysql 5.7.1
  7. python库整理:networkx 包
  8. PMCAFF高端俱乐部首次集结,最顶级产品人的私密俱乐部!
  9. 读书笔记_C#入门经典(第5版)第四章_流程控制
  10. './mysql-bin.index' not found (Errcode: 13) 的解决方法
  11. Java游戏用户登录注册_Java实现多用户注册登录的幸运抽奖
  12. Kubernetes 常见问题总结
  13. 博文视点云原生书单丨释放云原生技术红利
  14. excel规划求解功能总结
  15. 读书笔记之《得未曾有》
  16. js迷宫生成与迷宫求解算法
  17. Shiro 第十七章 OAuth2集成
  18. 交换机工作原理/模式
  19. 使用tesseract识别图片中的文字
  20. 华清远见-创客学院-专业:嵌入式人工智能开发 C++ 课程(包含天猫精灵)

热门文章

  1. java转换docx为html_Java使用Jacob转换Word为HTML
  2. ChatGPT中文电脑端软件
  3. 23通信保研经历 | 211上岸北航
  4. opencv提取图像中的颜色直方图(RGB、HSV)
  5. docker应用无法访问宿主机postgresql解决方案
  6. .xsd转Java Bean及生成的.java文件编码格式调整
  7. RabbitMQ消息队列(六):SpringBoot整合之通配符模式
  8. 如何画出干净流畅的手绘线稿,把握好这些技巧对你很有帮助!
  9. Green 公式和外微分形式
  10. 你是缓慢悠闲的“小辣鸡”,还是超尘逐电的“闪电侠”?