收藏 分享(赏)

计算机算法分析与设计(第四版)习题算法分析部分详解(实验六).doc

上传人:dreamzhangning 文档编号:2770614 上传时间:2018-09-27 格式:DOC 页数:17 大小:102.50KB
下载 相关 举报
计算机算法分析与设计(第四版)习题算法分析部分详解(实验六).doc_第1页
第1页 / 共17页
计算机算法分析与设计(第四版)习题算法分析部分详解(实验六).doc_第2页
第2页 / 共17页
计算机算法分析与设计(第四版)习题算法分析部分详解(实验六).doc_第3页
第3页 / 共17页
计算机算法分析与设计(第四版)习题算法分析部分详解(实验六).doc_第4页
第4页 / 共17页
计算机算法分析与设计(第四版)习题算法分析部分详解(实验六).doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、参考代码实验六 分支限界法/6-1、6-6 项目 VC+6.0 测试通过/6-15 项目 VC2005 测试通过/6-1 最小长度电路板排列问题/头文件 stdafx.h/ stdafx.h : include file for standard system include files,/ or project specific include files that are used frequently, but/ are changed infrequently/#pragma once#define WIN32_LEAN_AND_MEAN / Exclude rarely-used s

2、tuff from Windows headers#include #include / TODO: reference additional headers your program requires here/ sy61.cpp : Defines the entry point for the console application./ /Description: /分支限界法 6_1 最小长度电路板排列问题 /#include “my.h“#include “stdafx.h“#include #include using namespace std; int n,m;/#includ

3、e “OutOfBounds.h“/定义节点类class BoardNode参考代码friend int FIFOBoards(int *,int ,int,int */非类成员,可以访问私有成员的函数,最优序列查找public:operator int() constreturn cd;/返回常数 cdint len();public:int *x,s,cd,*low,*high;/x 表示当前节点的电路板排列,s 表示当前节点排列好的电路板的数/表示当前节点的最大长度,low,high 分别表当前节点表示每一个连接块的第一个,和最后一个电路板/的位置;/编写类的 len()函数,求出当前节

4、点的连接块长度的最大值int BoardNode:len()int tmp=0;for(int k=1;k0 /声明 BoardNode 类的节点队列 qBoardNode E;E.x=new intn+1;/为数组指针 x 分配 n+1 个动态空间,存储当前的排列E.s=0;/最初时,排列好的电路板的数目为 0E.cd=0;E.low=new intm+1;/存储每个连接块的第一个电路板的位置E.high=new intm+1;/存储每个连接块的最后一个电路板的位置for(int i=1;iE.highj)E.highj=n;int ld=E.len();/存储当前节点的各连接块长度中的最大

5、长度/如果当前的最大长度小于了 n+1if(ldN.highj)N.highj=curr;N.cd=N.len();/如果,当前节点的最大长度小于了最优长度则:if(N.cdnm;int *B=new int*n+1;for (int t=0; tBij;参考代码/scanf(“%d“,int *bestx=new intn+1;int bestd=0;bestd=FIFIOBoards(B,n,m,bestx);printf(“%dn“,bestd);for(i=1;i #include #include #include #include using namespace std; /本例子

6、直接输入棋盘大小,不用文件/ifstream in(“input.txt“); /请在项目文件夹下新建一个 input.txt/ofstream out(“output.txt“); class Node public: Node(int n) t = 0; this-n = n; loc = new intn + 1; for (int i = 0; it = other.t; this-n = other.n; this-loc = new int n + 1; for (int i = 0; i loci = other.loci; int t;/已放置 t 个皇后 参考代码int *l

7、oc;/loc1:t int n;/共放置 n 个皇后 bool checkNext(int next); void printQ(); ; bool Node:checkNext(int next) int i; for (i = 1; i n = n; ansNum = 0; void ArrangQueen(); ; void Queen:ArrangQueen() queue Q; Node ini(n); /初始化参考代码Q.push(ini); while(!Q.empty() Node father = Q.front(); /取队列下一个节点Q.pop(); if (fathe

8、r.t = n) father.printQ(); +ansNum; for (int i = 1; i n; /从文件中读入一个整数/for(int Case = 1; Case n; Queen Q(n); Q.ArrangQueen(); /out#include / TODO: reference additional headers your program requires here/头文件 MinHeap2.h;最小堆实现#include template class Graph; template class MinHeap template friend class Grap

9、h; public: MinHeap(int maxheapsize = 10); MinHeap()delete heap; int Size() constreturn currentsize; T Max()if(currentsize) return heap1; MinHeap MinHeap void Initialize(T x, int size, int ArraySize); void Deactivate(); void output(T a,int n); private: int currentsize, maxsize; T *heap; ; 参考代码templat

10、e void MinHeap:output(T a,int n) for(int i = 1; i MinHeap:MinHeap(int maxheapsize) maxsize = maxheapsize; heap = new Tmaxsize + 1; currentsize = 0; template MinHeap int i = +currentsize; while(i != 1 if(y void MinHeap:Initialize(T x, int size, int ArraySize) delete heap; heap = x; currentsize = size

11、; maxsize = ArraySize; for(int i = currentsize / 2; i = 1; i-) T y = heapi; int c = 2 * i; while(c heapc + 1) c+; if(y void MinHeap:Deactivate() heap = 0; /批作业调度问题 优先队列分支限界法求解 /算法编码与教材一致#include “stdafx.h“ #include “MinHeap2.h“ #include using namespace std; class Flowshop; class MinHeapNode friend F

12、lowshop; public: operator int() const return bb; private: void Init(int); void NewNode(MinHeapNode,int,int,int,int); int s, /已安排作业数 f1, /机器1上最后完成时间 f2, /机器2上最后完成时间 sf2, /当前机器2上完成时间和 bb, /当前完成时间和下界 *x; /当前作业调度 ; class Flowshop friend int main(void); public: int BBFlow(void); private: 参考代码int Bound(Mi

13、nHeapNode E,int void Sort(void); int n, /作业数 * M, /各作业所需的处理时间数组 *b, /各作业所需的处理时间排序数组 *a, /数组M和b的对应关系数组 *bestx, /最优解 bestc; /最小完成时间和 bool *y; /工作数组 ; template inline void Swap(Type int main() int n=3,bf; int M132=2,1,3,1,2,3; int *M = new int*n; int *b = new int*n; int *a = new int*n; bool *y = new bo

14、ol*n; int *bestx = new intn; for(int i=0;ii; k-) if(bkjE.f2)?f1:E.f2)+ME.xE.s1; int sf2 = E.sf2 + f2; int s1 = 0,s2 = 0,k1 = n-E.s,k2 = n-E.s,f3 = f2; /计算s1的值 for(int j=0; jf1+bj0)?f2:f1+bj0; s1 += f1+k1*bj0; /计算s2的值 for(int j=0; js2)?s1:s2); /解批处理作业调度问题的优先队列式分支限界法 int Flowshop:BBFlow(void) Sort();/对各作业在机器1和2上所需时间排序 MinHeap H(1000); MinHeapNode E; /初始化 E.Init(n); /搜索排列空间树 while(E.s inline void Swap(Type a=b; b=temp;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报