算法之回溯法实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验4回溯法实现
一、实验目标:
1.熟悉回溯法应用场景及实现的基本方法步骤;
2.学会回溯法的实现方法和分析方法:
二、实验内容
1.旅行售货员问题:
当结点数为4,权重矩阵为01
10
23
94
29
34
06
60
,求最优路径及开销。
2.0-1背包问题:
对于n=5,C=10,vi={6,3,5,4,6},wi={2,2,6,5,4},计算xi及最优价值V。
分别利用动态规划、回溯法和分支限界法解决此问题,比较并分析这三种算法实现!
三、实验过程
1.源代码
旅行售货员问题(回溯法):
#include
using namespace std;
class travel //回溯
{
friend int TSP(int **, int[], int, int);
private:
void Backtrack(int i);
int n, //顶点数
*x,
*bestx;
int **a,
cc,
bestc,
NoEdge;
};
void S a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
return;
}
void travel::Backtrack(int i)
{
if (i == n)
{
if (a[x[n - 1]][x[n]] != NoEdge && a[x[n]][1] != NoEdge &&
(cc + a[x[n - 1]][x[n]] + a[x[n]][1]) < bestc || bestc == NoEdge)
{
for (int j = 1; j <= n; j++) bestx[j] = x[j];
bestc = cc + a[x[n - 1]][x[n]] + a[x[n]][1];
}
}
else
{
for (int j = i; j <= n; j++)
{
if (a[x[i - 1]][j] != NoEdge && a[x[n]][1] != NoEdge
&& (cc + a[x[i - 1]][x[j]] < bestc || bestc == NoEdge)) {
swap(x[i], x[j]);
cc += a[x[i - 1]][x[i]];
Backtrack(i + 1);
cc -= a[x[i - 1]][x[i]];
swap(x[i], x[j]);
}
}
}
}
int TSP(int** a,int v[], int n, int NoEdge)
{
travel Y;
Y.x = new int[n + 1];
for (int i = 1; i <= n; i++)
Y.x[i] = i;
Y.a = a;
Y.n = n;
Y.bestc = NoEdge;
Y.bestx = v;
= 0;
Y.NoEdge = NoEdge;
Y.Backtrack(2);
delete[] Y.x;
return Y.bestc;
}
int main()
{
int const max = 10000;
cout << "请输入节点数:" << endl;
int n;
cin >> n;
int *v = new int[n];//保存路径
int NoEdge = 0;
int **p = new int*[max];
for (int i = 0; i < n+1; i++)//生成二维数组p[i] = new int[n+1];
cout << "请依次输入各城市之间的路程:" << endl;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> p[i+1][j+1];
cout << "最短路径长度:" << TSP(p, v, 4, 1000) << endl;
cout << "路径为:";
for (int i = 1; i < 5; i++)
cout << v[i] <<' ';
cout << endl;
return 0;
}
运行截图:
旅行售货员问题(分支限界法):
#include
using namespace std;
#define MAX_CITY_NUMBER 10 //城市最大数目
#define MAX_COST 1000 //两个城市之间费用的最大值
int City_Graph[MAX_CITY_NUMBER][MAX_CITY_NUMBER];//表示城市间边权重的数组int City_Size; //表示实际输入的城市数目
int Best_Cost; //最小费用
int Best_Cost_Path[MAX_CITY_NUMBER];
//结点
typedef struct Node {
int lcost; //优先级
int cc; //当前费用
int rcost; //剩余所有结点的最小出边费用的和
int s; //当前结点的深度,也就是它在解数组中的索引位置int x[MAX_CITY_NUMBER]; //当前结点对应的路径
struct Node* pNext; //指向下一个结点
}Node;
//堆
typedef struct MiniHeap {
Node* pHead; //堆的头
}MiniHeap;
//初始化
void InitMiniHeap(MiniHeap* pMiniHeap) {
pMiniHeap->pHead = new Node;
pMiniHeap->pHead->pNext = NULL;
}