电路板排列问题
来源:互联网 发布:程序员心得体会 编辑:程序博客网 时间:2024/04/29 02:18
#include "stdio.h"#include "string.h"#define MAX 10 int x[MAX]; //当前电路板排列int bestx[MAX]; //最优电路板排列int n; //电路板个数int bestd = 10000; //最优密度,电路板密度为跨越相邻电路板最多连线数int m; //连接块数int total[MAX]; //total[j]表示连接块j中电路板的个数int now[MAX]; //now[j]表示当前解下,连接块j中电路板的个数int b[9][6]; //连接块数组void swap(int &a, int &b){ int temp = a; a = b; b =temp;}//搜索排列树//第i个电路板,当前排列密度为cdvoid backtrack(int i, int cd){ if(i==n) //当到达叶结点 { bestd = cd; //算法仅完成比当前解更优的解,所以cd肯定优于bestd memcpy(bestx, x, sizeof(x)); //拷贝最优解向量 } else { int j; int ld; for(j=i; j<=n; j++) //下一步选哪个电路板 { //计算增加了电路板x[j]后的连线密度 ld = 0; int k; for(k=1; k<=m; k++) { now[k] += b[x[j]][k]; //计算当前包含在连接块k中的电路板个数 if(now[k]>0 && now[k]!=total[k]) //满足此条件 ld++; //连线密度增加 } if(cd>ld) //更新ld ld = cd; if(ld<bestd) //如果当前连线密度小于最优值,才可能产生最优值,搜索子树 { swap(x[i], x[j]); backtrack(i+1, ld); //搜索下一个结点 swap(x[i], x[j]); } //恢复状态,为返回上一层做准备 for(k=1; k<=m; k++) { now[k] -= b[x[j]][k]; } } }}void arrangement(int b1[9][6], int n1, int m1){ n = n1; m = m1; int i, j; for(i=0; i<=n; i++) for(j=0; j<=m; j++) b[i][j] = b1[i][j]; memset(now, 0, sizeof(now)); memset(total, 0, sizeof(total)); //初始化x为单位排列并计算total for(i=1; i<=n; i++) { x[i] = i; for(j=1; j<=m; j++) total[j] += b[i][j]; } backtrack(1, 0);}int main(){ int n1 = 8; int m1 = 5; int b1[9][6] = { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0}, {0, 0, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 0}, {0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0, 1} }; arrangement(b1, n1, m1); printf("电路板个数:%d\n", n); printf("连接块个数:%d\n", m); printf("连接块情况:\n"); printf("N1={4,5,6},N2={2,3},N3={1,3},N4={3,6},N5={7,8}\n"); int i, j; for(i=1; i<=n; i++) { for(j=1; j<=m; j++) printf("%d ", b[i][j]); printf("\n"); } printf("最优密度为:%d\n", bestd); printf("最优排列为:\n"); for(i=1; i<=n; i++) printf("%d ", bestx[i]); printf("\n"); return 0;}
0 0
- 电路板排列问题
- 电路板排列问题
- 电路板排列问题
- 最小长度电路板排列问题
- 最小长度电路板排列问题
- 最小长度电路板排列问题
- 最小长度电路板排列问题一
- 最小长度电路板排列问题二
- 最小长度电路板排列问题(回溯)
- 最小长度电路板排列问题 5_2 6_1
- 算法java实现--回溯法--电路板排线问题--排列树
- 电路板排列问题分支限界解法(python)
- 电路板问题
- 0032算法笔记——【回溯法】电路板排列问题和连续邮资问题
- 0032算法笔记——【回溯法】电路板排列问题和连续邮资问题
- 0039算法笔记——【分支限界法】电路板排列问题
- 0039算法笔记——【分支限界法】电路板排列问题
- 画电路板中遇到的问题
- 数据结构导论——自考
- Spring定义和装配Bean
- c#抽象类与接口的理解
- 求和为0的最长序列
- A20_can_BUS 使用
- 电路板排列问题
- 【IOS 开发学习总结-OC-55】故事板中 segue 的 push、modal、popover、replace、custom 学习笔记
- 什么情况下需要做大气校正之探讨
- Oracle数据库使用FAQ记录
- BZOJ3888 usaco2015 stampede
- Digit Counting uva1225
- 浏览器 回车、F5、Ctrl+F5
- egit的安装与使用之一:安装egit并提交项目至GitHub【转】
- JSP的内置对象