算法第五章实践报告

算法第五章作业

1. 用回溯法的方法分析“最小重量机器设计问题”

题目:7-2 最小重量机器设计问题

设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij​是从供应商j 处购得的部件i的重量,cij​是相应的价格。 试设计一个算法,给出总价格不超过d的最小重量机器设计。

代码:

#include <iostream>

using namespace std;

 

int n,m,d;

int c[1000][1000];

int w[1000][1000];

int x[1000];

int p[1000];

int curc;

int curw;

int minc=10000000;

int minw=10000000;

 

void Backtrack(int t)

{

if(t>n)

{

minw=curw;

for(int i=1;i<=n;i++)

{

p[i]=x[i];

}

return ;

    }

    else{

     for(int i=1;i<=m;i++)

     {

     if(curc+c[t][i]<=d&&curw+w[t][i]<minw)

     {

     x[t]=i;

     curc+=c[t][i];

     curw+=w[t][i];

     Backtrack(t+1);

     curc-=c[t][i];

     curw-=w[t][i];

}

}

}

}

 

int main()

{

cin>>n>>m>>d;

curc=0;

curw=0;

for(int i=1;i<=n;i++)

{

for(int j=1;j<=m;j++)

{

cin>>c[i][j];

}

}

for(int i=1;i<=n;i++)

{

for(int j=1;j<=m;j++)

{

cin>>w[i][j];

}

}

Backtrack(1);

cout<<minw<<endl;

for(int i=1;i<=n;i++)

{

cout<<p[i]<<" ";

}

return 0;

}

1.1 说明“最小重量机器设计问题"的解空间

解空间即进行穷举的搜索空间,包含所有的可能解,解空间如下:

1,1,1)(1,1,2)(1,1,3)

1,2,1)(1,2,2)(1,2,3)

1,3,1)(1,3,2)(1,3,3)

2,1,1)(2,1,2)(2,1,3)

2,2,1)(2,2,2)(2,2,3)

2,3,1)(2,3,2)(2,3,3)

3,1,1)(3,1,2)(3,1,3)

3,2,1)(3,2,2)(3,2,3)

3,3,1)(3,3,2)(3,3,3)

 

1.2 说明 “最小重量机器设计问题"的解空间树

 

 

 

1.3 在遍历解空间树的过程中,每个结点的状态值是什么

每个结点的状态值为:当前的重量curw和当前的价格curc。

2. 对回溯算法的理解

回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。

若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。 而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。

回溯法的基本步骤:

(1)针对所给问题,定义问题的解空间;

(2)确定易于搜索的解空间结构;

(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

 常用剪枝函数:

用约束函数在扩展结点处剪去不满足约束的子树;

用限界函数剪去得不到最优解的子树。

 问题的解空间树是虚拟的,并不需要在算法运行时构造一棵真正的树结构,只需要存储从根结点到当前结点的路径。

 

posted @ 2021-12-16 16:47  Linqylin  阅读(41)  评论(0)    收藏  举报