分派问题的回溯算法(整理版)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
试回溯算法, 在给每个人分派一件不同工作的情况下使得总成本最小。 1.2.阐述用回溯法求解的状态空间树结构:
画出部分树,说明节点、边、到根节点的路径的意义,给出答案节点的定义。 1.3.阐述用回溯法求解的基本思想:
设计并说明规范函数,扼要阐述搜索过程。 1.4.画出搜索过程的主要流程图。 1.5.说明输入数据的表示方法、主要的数据变量、主要的函数功能。 1.6.写出各函数的伪C语言代码。 2.分派问题的表示方案
for(j=0;j<N;j++) scanf("%d",&C[i][j]);
}
int place(int k) { int i;
for(i=0;i<k;i++) if(X[i]==X[k])
return false; return true; } void back(int sum) { int k=0,i; X[k]=-1; while(k>=0) { X[k]=X[k]+1; while((X[k]<N)&&(!place(k)))X[k]=X[k]+1; if(X[k]<N) { sum=sum+C[k][X[k]]; if(k<N-1) {
3.主要数据类型与变量 int sum; /* 成本总和 */ int min /* 最小的成本总和 */ int k /* 第k个人*/ X[k] /*d第k个人做 第X[k]个任务*/ A[i][j] /* 表示i个人做第j号任务的成本 */ 4.算法或程序模块 int place(int k) 功能: 判断第k个人能否做第X[k]号任务 void back(int k,int sum) 功能: 遍历每种情况,比较每种情况下的的成本,得出最小成本summin 各函数的伪C语言代码: int place(int k) { int i;
k++; X[k]=-1; } else { if(sum<min)
4
{ min=sum; for(i=0;i<N;i++) Q[i]=X[i];
} sum=sum-C[k][X[k]]; } } else { k=k-1; sum=sum-C[k][X[k]]; } } }
void main() { int i,n,sum; n=N; sum=0; Cost(C,n); back(sum); printf("分配方案:\n"); for(i=0;i<N;i++)
分派问题的回溯算法
一.设计目的 1.掌握回溯法解题的基本思想; 2.掌握回溯算法的设计方法; 3.针对分派问题,熟练掌握回溯递归算法、迭代算法的设计与实现。
二.设计内容 1. 任务描述 1.1.分派问题简介:
给n个人分派n件工作, 把工作j分派给第i个人的成本为cost(i, j), 设计、编程、 测
小于min时,用sum覆盖min,在搜索过程中,如果在某个结点出现sum大于min时,就没有必
1
要在搜索下去了。直接杀死该结点。 2)规范函数 int place(int k) \\判断第k个人能否做工作X[k] { int i; foห้องสมุดไป่ตู้(i=0;i<k;i++) if(X[i]==X[k]) \\判断X[k] 在前面是否有人做 return false; return true; }
for(i=0;i<k;i++) if(X[i]==X[k])
return false; return true; } void back(int sum) { int k=0,i; X[k]=-1; while(k>=0) { X[k]=X[k]+1; while((X[k]<N)&&(!place(k)))X[k]=X[k]+1; //找到可以解 if(X[k]<N) { sum=sum+C[k][X[k]]; if(k<N-1) {
四.总结与讨论 图一十用静态树表示分派问题的状态空间树,图中x1到2,18,34,50分别表示x1选择
3
问题1的情况下x2的三种不同选择。
附:程序模块的源代码 #include<stdio.h> #define N 4 static min=100; int X[N],C[N][N]; int Q[N]; void Cost(int C[][N],int n) { int i,j; printf("请输入成本:\n"); for(i=0;i<n;i++)
设计的状态空间树:
图一 图一是用静态树表示分派问题的状态空间树,图中x1,x2,x3,x4表示分派工作的 三个人,结点1到2,18,34,50分别表示x1分别选则工作1,2,3,4不同的状态,同样结点2到 3,8,13表示的是在x1选择问题1的情况下x2的三种不同选择。
阐述用回溯法求解的基本思想: 1)先设定一个最小成本min,然后深度优先搜索,当找到一组解并且他们的成本总和sum
2
k++; // 移到下一个人 X[k]=-1; } else //是一个完整的解时 { if(sum<min) // 判断此解是否最优 {
min=sum; for(i=0;i<N;i++)
Q[i]=X[i]; } sum=sum-C[k][X[k]]; } } else { k=k-1; / / 回溯 sum=sum-C[k][X[k]]; } } } 三.测试 1.方案 测试数据 4567 2345 6789 1234 2.结果
printf(" %d分配任务%d printf("\n"); printf("最小成本:"); printf("%d\n",min); }
",i+1,Q[i]+1);
5
画出部分树,说明节点、边、到根节点的路径的意义,给出答案节点的定义。 1.3.阐述用回溯法求解的基本思想:
设计并说明规范函数,扼要阐述搜索过程。 1.4.画出搜索过程的主要流程图。 1.5.说明输入数据的表示方法、主要的数据变量、主要的函数功能。 1.6.写出各函数的伪C语言代码。 2.分派问题的表示方案
for(j=0;j<N;j++) scanf("%d",&C[i][j]);
}
int place(int k) { int i;
for(i=0;i<k;i++) if(X[i]==X[k])
return false; return true; } void back(int sum) { int k=0,i; X[k]=-1; while(k>=0) { X[k]=X[k]+1; while((X[k]<N)&&(!place(k)))X[k]=X[k]+1; if(X[k]<N) { sum=sum+C[k][X[k]]; if(k<N-1) {
3.主要数据类型与变量 int sum; /* 成本总和 */ int min /* 最小的成本总和 */ int k /* 第k个人*/ X[k] /*d第k个人做 第X[k]个任务*/ A[i][j] /* 表示i个人做第j号任务的成本 */ 4.算法或程序模块 int place(int k) 功能: 判断第k个人能否做第X[k]号任务 void back(int k,int sum) 功能: 遍历每种情况,比较每种情况下的的成本,得出最小成本summin 各函数的伪C语言代码: int place(int k) { int i;
k++; X[k]=-1; } else { if(sum<min)
4
{ min=sum; for(i=0;i<N;i++) Q[i]=X[i];
} sum=sum-C[k][X[k]]; } } else { k=k-1; sum=sum-C[k][X[k]]; } } }
void main() { int i,n,sum; n=N; sum=0; Cost(C,n); back(sum); printf("分配方案:\n"); for(i=0;i<N;i++)
分派问题的回溯算法
一.设计目的 1.掌握回溯法解题的基本思想; 2.掌握回溯算法的设计方法; 3.针对分派问题,熟练掌握回溯递归算法、迭代算法的设计与实现。
二.设计内容 1. 任务描述 1.1.分派问题简介:
给n个人分派n件工作, 把工作j分派给第i个人的成本为cost(i, j), 设计、编程、 测
小于min时,用sum覆盖min,在搜索过程中,如果在某个结点出现sum大于min时,就没有必
1
要在搜索下去了。直接杀死该结点。 2)规范函数 int place(int k) \\判断第k个人能否做工作X[k] { int i; foห้องสมุดไป่ตู้(i=0;i<k;i++) if(X[i]==X[k]) \\判断X[k] 在前面是否有人做 return false; return true; }
for(i=0;i<k;i++) if(X[i]==X[k])
return false; return true; } void back(int sum) { int k=0,i; X[k]=-1; while(k>=0) { X[k]=X[k]+1; while((X[k]<N)&&(!place(k)))X[k]=X[k]+1; //找到可以解 if(X[k]<N) { sum=sum+C[k][X[k]]; if(k<N-1) {
四.总结与讨论 图一十用静态树表示分派问题的状态空间树,图中x1到2,18,34,50分别表示x1选择
3
问题1的情况下x2的三种不同选择。
附:程序模块的源代码 #include<stdio.h> #define N 4 static min=100; int X[N],C[N][N]; int Q[N]; void Cost(int C[][N],int n) { int i,j; printf("请输入成本:\n"); for(i=0;i<n;i++)
设计的状态空间树:
图一 图一是用静态树表示分派问题的状态空间树,图中x1,x2,x3,x4表示分派工作的 三个人,结点1到2,18,34,50分别表示x1分别选则工作1,2,3,4不同的状态,同样结点2到 3,8,13表示的是在x1选择问题1的情况下x2的三种不同选择。
阐述用回溯法求解的基本思想: 1)先设定一个最小成本min,然后深度优先搜索,当找到一组解并且他们的成本总和sum
2
k++; // 移到下一个人 X[k]=-1; } else //是一个完整的解时 { if(sum<min) // 判断此解是否最优 {
min=sum; for(i=0;i<N;i++)
Q[i]=X[i]; } sum=sum-C[k][X[k]]; } } else { k=k-1; / / 回溯 sum=sum-C[k][X[k]]; } } } 三.测试 1.方案 测试数据 4567 2345 6789 1234 2.结果
printf(" %d分配任务%d printf("\n"); printf("最小成本:"); printf("%d\n",min); }
",i+1,Q[i]+1);
5