- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最小重量器设计问题、工作分配问题
《算法设计与分析》
上 机 实 验 报 告
专 业 班 级 学 号 学生姓名 完成日期
1. 上机题目及实验环境
1.1上机题目:
最小重量机器设计问题
工作分配问题
1.2实验环境:
CPU:Pentium Core CPU 3.20 GHz
内存:3.21 GB
操作系统:Windows XP
软件平台:Visual C++
算法设计与分析
2.1 总体思想
回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。由此可知,解决下面两个问题时,可以使用回溯法。
2.2 最小重量机器设计问题细节处理
将问题封装成一个类来处理;
采用二维数组存储各部件的价格和重量;
选择部件时都优先考虑编号小的供应商;
在处理选择操作时,先考虑当前情况是否满足要求,再进行选择操作;
退回上一步时,需要还原临时价格tempC和临时重量tempW的值。
2.3 工作分配问题细节处理
将问题封装成一个类来处理;
采用二维数组存储员工对应各工作的费用;
采用一位数组来记录员工安排工作的状态,0为未分配,1为已分配;
退回上一步时,需要还原员工安排工作状态。
3. 核心代码
3.1 最小重量机器设计问题
void Design(int i) // 回溯算法,选择部件
{
int j, k;
if (i n) // 得到一次符合条件的选择
{
if (tempW minWeight)
{
minWeight = tempW;
for (j = 1; j = n; j++)
bestChoice[j] = choice[j];
}
return;
}
for (k = 1; k = m; k++) // 从1号厂商开始选择每个部件
{
choice[i] = k;
if ( ( ( tempW + weight[i][choice[i]] ) minWeight ) ( ( tempC + cost[i][choice[i]] ) = d ) )
{ //如果之前的重量+当前零件的重量小于最小重量,并且之前价值+零件的价值小于等于最大允许价值
tempW += weight[i][choice[i]];
tempC += cost[i][choice[i]];
Design(i + 1);
tempW -= weight[i][choice[i]]; //恢复到上一步
tempC -= cost[i][choice[i]];
}
}
}
3.2 工作分配问题
void Plan(int i,int tempC) // 回溯算法,安排工作
{
if (i n tempC minCost) // 当查找到底层时
{
minCost = tempC;
return;
}
if (tempC minCost) // 当查找没到底层时
for (int j = 1; j = n; j++)
if (isJob[j] == 0) // 在还没有安排工作的员工中安排
{
isJob[j] = 1;
Plan(i+1, tempC + cost[i][j]);
isJob[j] = 0; // 安排失败,还原
}
}
4. 运行与调试
4.1 最小重量机器设计问题
?给定的测试数据,运行结果如下图1: ?不能满足条件的测试数据,运行结果如下图2:
图1 给定测试数据运行结果 图2 不满足条件的运行结果
?满足条件的测试数据,运行结果如下图3:
图3 满足条件的运行结果
4.2 工作分配问题
?给定的测试数据,运行结果如下图4: ?当n=1时的运行结果,如下图5:
图4 给定数据运行结果 图5 n=1时的运行结果
?当n1且n=20时的运行结果如下图6:
图6 运行结果
5. 结果分析和小结
5.1 结果分析:
通过对不同的数据的测试,能确定程序在一定范围内的正确性、算法思想的正确性和可行性。但在工作分配问题的数据设计上,当员工的人数在[15,20]区间内时,程序运行的时间明显过久,想必是因为程序使用的是递归。
5.2 心得体会:
通过对以上两个问题的分析和设计,我学会了回溯法的设计思想,能掌握使用回溯法解决问题,
文档评论(0)