- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法分析与设计实验报告
第 X 次实验
姓名刘悦学号201308080112班级物联1301班时间12.26上午地点工训楼C栋309
实验名称
分支限界法求装载问题实验目的通过上机实验,掌握分支限界算法的思想,利用分支限界算法求装载问题并实现。实验原理活结点x在最优队列中的优先级定义为从根结点到结点x的路径所相应的载重量再加上剩余集装箱的总量之和。优先队列中优先级最大的活结点成为下一个扩展结点。优先队列中活结点x的优先级为x.uweight。以结点x为根的子树中所有结点相应的路径的载重量不超过x.uweight。子集树中叶结点相应载重量与其优先级相同。因此,一旦一个叶结点成为当前扩展结点,则可以断言该叶结点所相应的解为即为最优解,终止算法。
这里选用在搜索进程中保存当前已构造出的部分解空间树,在算法确定课达到最优解的叶结点时,就可以在解空间树中从该叶结点开始向根结点回溯,构造出相应的最优解。实验步骤
算法开始创建一个最大堆,表示活结点优先队列。
算法第一个扩展结点是子集树中根结点。
开始子集树的根结点是扩展结点。循环产生当前扩展结点的左右儿子结点。
如果当前扩展结点的左儿子结点是可行结点,即它所相应的重量为超过轮船的载重量,则将它加入到子集树的第i+1层上,并插入最大堆。
扩展结点的右儿子结点总是可行的,故直接插入子集树的最大堆中。
接着从最大堆中取出最大元素作为下一个扩展结点。
如果此时不存在下一个扩展结点,则问题无可行解。
如果下一个扩展结点是叶结点,即子集树中第n+1层结点,则它相对应的可行解为最优解,算法结束。
关键代码//定义集装箱的个数
const int N = 4;
/*=================================================================
定义HeapNode类来存储最大堆中顶点的信息。
=================================================================*/
templateclass Type
class HeapNode
{
templateclass T
friend void AddLiveNode(MaxHeapHeapNodeT H,bbnode *E,T wt,bool ch,int lev);
templateclass Ty
friend Ty MaxLoading(Ty w[],Ty c,int n,int bestx[]);
public:
operator Type() const
{
return uweight;
}
private:
bbnode *ptr; //指向活节点在子集树中相应节点的指针
Type uweight; //活节点优先级(上界)
int level; //活节点在子集树中所处的层序号
};
/*=================================================================
定义bbnode类来定义子集空间树中的结点类型。
=================================================================*/
class bbnode
{
templateclass Type
friend void AddLiveNode(MaxHeapHeapNodeType H,bbnode *E,Type wt,bool ch,int lev);
templateclass Type
friend Type MaxLoading(Type w[],Type c,int n,int bestx[]);
friend class AdjacencyGraph;
private:
bbnode *parent; //指向父节点的指针
bool LChild; //左儿子节点标识
};
/*=================================================================
AddLiveNode函数将新产生的活节点加入到子集树中,
并将
文档评论(0)