算法第五章作业

一.问题描述

                          

7-2 最小重量机器设计问题 (25 分)
 

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

输入格式:

第一行有3 个正整数n ,m和d, 0<n<30, 0<m<30, 接下来的2n 行,每行n个数。前n行是c,后n行是w。

输出格式:

输出计算出的最小重量,以及每个部件的供应商

二.算法描述

void BackTrack(int t)
{
if(t==n)//到达最后一层
{
for(int i=1; i<=m; i++)//遍历所有叶子节点
{
cw+=w[t][i];
cc+=c[t][i];
x[t]=i;
if(cc<=max_c&&cw<bestw)//若费用不超过最大费用并且重量小于之前的最优解
{
//更新最优解
bestw=cw;
for(int j=1; j<=n; j++)
bestx[j]=x[j];
}
cc-=c[t][i];//返回上一层
cw-=w[t][i];
x[t]=0;
}
}
else//未到达最后一层
{
for(int i=1; i<=m; i++)//遍历该层节点
{
x[t]=i;
cw+=w[t][i];
cc+=c[t][i];
if(cc<max_c&&cw<bestw)//费用小于最小费用重量小于最优解时进入下一层
{
BackTrack(t+1);
}
cc-=c[t][i];//返回上一层
cw-=w[t][i];
x[t]=0;

}
}
}

三.问题求解  

1.回溯法

初始化供应商数量及部件数量,然后初始化部件的一些属性作为测试数据。程序关键点是中间变量的总价值取较小的那个,总重量与最小重量c的比对是否达到最小,最优。

2.算法解释

每次回溯后会根据不同选择的供应商更新对应位置的节点,每个结点的状态值是该点的总重量w和当前价格,不断回溯来比较价格变化。问题是求所选购部件的总价格不超过c  的最小机器重量。

这里采用的是穷举法计算所有的组合情况下的总重量及总价值,同时判断总价格不超过c的情况下,比对最小总重量与当前总重量,取较小的一个。

 

 四.回溯法心得体会、

回溯法模板

void Backtrack(int t)
{//以深度优先的方式遍历第t层中的某棵子树
    if(t>n) { Output(x); return; }
    if (……) 
  {  x[t]=1; Backtrack(t+1); }
    if (……) 
  {  x[t]=0; Backtrack(t+1); }
}

回溯法是一种选优搜索法,即探索与回溯法,又称为试探法,安选优条件向前搜索,以达到目标。如果探索到某一步时,发现无法达到最优解或者无解,则退回到上一步,即回溯,直到选出最优解为止。

回溯过程中之前走到的位置,可以是上个选择,也可以是根据算法自定条件的位置,甚至可以是原点,但是一般不考虑原点,会出现死循环。

 

 

回溯算法解题的一个显著特征,是在搜索解的过程中动态的产生问题的解空间。在任何时候,算法只保存从根节点到当前扩展结点的路劲。如果解空间树中从根节点到叶节点的最长路径的长度为h(n),则回溯法所需要的计算空间通常为O(h(n))。

 

posted @ 2021-12-14 21:41  ammmm  阅读(38)  评论(0编辑  收藏  举报