分支界限法实现_第1页
分支界限法实现_第2页
分支界限法实现_第3页
分支界限法实现_第4页
分支界限法实现_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实 验 报 告课程名称 算法设计与分析 课题名称 分支限界法实现_ 1.算法(分支限界法实现)2.实验目的:   掌握分支限界法求解问题的一般特征和步骤。  使用分支限界法编程,求解旅行售货员问题。3.过程设计在当前节点(扩展节点)处,先生成其所有的儿子节点(分支),然后再从当前的活节点(当前节点的子节点)表中选择下一个扩展节点。为了有效地选择下一个扩展节点,加速搜索的进程,在每一个活节点处,计算一个函数值(限界),并根据函数值,从当前活节点表中选择一个最有利的节点作为扩展节点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。分支限界法解决了大量离

2、散最优化的问题。1.队列式(FIFO)分支限界法队列式分支限界法将活节点表组织成一个队列,并将队列的先进先出原则选取下一个节点为当前扩展节点。2.优先队列式分支限界法优先队列式分支限界法将活节点表组织成一个优先队列,并将优先队列中规定的节点优先级选取优先级最高的下一个节点成为当前扩展节点。如果选择这种选择方式,往往将数据排成最大堆或者最小堆来实现。一、.源代码:具体算法的实现如下:#include <stdio.h> #include "stdafx.h"#include <istream> using namespace std; #define

3、MAX_CITY_NUMBER 10 #define MAX_COST 10000000 int City_GraphMAX_CITY_NUMBERMAX_CITY_NUMBER; int City_Size; int Best_Cost; int Best_Cost_PathMAX_CITY_NUMBER; typedef struct Node int lcost; int cc; int rcost; int s; int xMAX_CITY_NUMBER; struct Node* pNext; Node; typedef struct MiniHeap Node* pHead; Mi

4、niHeap; void InitMiniHeap(MiniHeap* pMiniHeap) pMiniHeap->pHead = new Node; pMiniHeap->pHead->pNext = NULL; void put(MiniHeap* pMiniHeap,Node node) Node* next; Node* pre; Node* pinnode = new Node; pinnode->cc = node.cc; pinnode->lcost = node.lcost; pinnode->pNext = node.pNext; pinn

5、ode->rcost = node.rcost; pinnode->s = node.s; pinnode->pNext = NULL; for(int k=0;k<City_Size;k+) pinnode->xk = node.xk; pre = pMiniHeap->pHead; next = pMiniHeap->pHead->pNext; if(next = NULL) pMiniHeap->pHead->pNext = pinnode; else while(next != NULL) if(next->lcost)

6、 > (pinnode->lcost) pinnode->pNext = pre->pNext; pre->pNext = pinnode; break; pre = next; next = next->pNext; pre->pNext = pinnode; Node* RemoveMiniHeap(MiniHeap* pMiniHeap) Node* pnode = NULL; if(pMiniHeap->pHead->pNext != NULL) pnode = pMiniHeap->pHead->pNext; pMin

7、iHeap->pHead->pNext = pMiniHeap->pHead->pNext->pNext; return pnode; void Traveler() int i,j; int temp_xMAX_CITY_NUMBER; Node* pNode = NULL; int miniSum; int miniOutMAX_CITY_NUMBER; MiniHeap* heap = new MiniHeap; InitMiniHeap(heap); miniSum = 0; for (i=0;i<City_Size;i+) miniOuti = M

8、AX_COST; for(j=0;j<City_Size;j+) if (City_Graphij>0 && City_Graphij<miniOuti) miniOuti = City_Graphij; if (miniOuti = MAX_COST) Best_Cost = -1; return ; miniSum += miniOuti; for(i=0;i<City_Size;i+) Best_Cost_Pathi = i; Best_Cost = MAX_COST; pNode = new Node; pNode->lcost = 0;

9、pNode->cc = 0; pNode->rcost = miniSum; pNode->s = 0; pNode->pNext = NULL; for(int k=0;k<City_Size;k+) pNode->xk = Best_Cost_Pathk; put(heap,*pNode); while(pNode != NULL && (pNode->s) < City_Size-1) for(int k=0;k<City_Size;k+) Best_Cost_Pathk = pNode->xk ; if (pN

10、ode->s) = City_Size-2) int edge1 = City_Graph(pNode->x)City_Size-2(pNode->x)City_Size-1; int edge2 = City_Graph(pNode->x)City_Size-1(pNode->x)0; if(edge1 >= 0 && edge2 >= 0 && (pNode->cc+edge1+edge2) < Best_Cost) Best_Cost = pNode->cc + edge1+edge2; pNod

11、e->cc = Best_Cost; pNode->lcost = Best_Cost; pNode->s+; else for (i=pNode->s;i<City_Size;i+) if(City_GraphpNode->xpNode->spNode->xi >= 0) int temp_cc = pNode->cc+City_GraphpNode->xpNode->spNode->xi; int temp_rcost = pNode->rcost-miniOutpNode->xpNode->s

12、; if (temp_cc+temp_rcost<Best_Cost) for (j=0;j<City_Size;j+) temp_xj=Best_Cost_Pathj; temp_xpNode->xpNode->s+1 = Best_Cost_Pathi; temp_xi = Best_Cost_PathpNode->s+1; Node* pNextNode = new Node; pNextNode->cc = temp_cc; pNextNode->lcost = temp_cc+temp_rcost; pNextNode->rcost =

13、 temp_rcost; pNextNode->s = pNode->s+1; pNextNode->pNext = NULL; for(int k=0;k<City_Size;k+) pNextNode->xk = temp_xk; put(heap,*pNextNode); delete pNextNode; pNode = RemoveMiniHeap(heap); int main() int i,j;printf("请输入旅行的城市数"); scanf("%d",&City_Size); for(i=0;i<City_Size;i+) printf("请分别输入每个城市与其它城市的路程花费"); for(j=0;j<City_Size;j+) scanf("%d",&City_Graphij); Traveler(); printf("最小花费""%dn",Best_Cost); return 1; 二、实验截图:三、调试中的问题。通过本次实验,使我充分理解分支限界法的算法思想和旅行售货员代码的实现,主要算法实现,分支是只能以最优的方法解出最优答案

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论