回溯法求解最小机器重量设计问题
回溯法介绍
回溯法实际上是一个类似穷举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”,尝试别的路径。
它适合于解一些组合数较大的最优化问题。
是一种以深度优先搜索方式在问题的解空间中系统地搜索问题的解并结合剪枝函数(Pruning)的算法。
求解回溯法问题的步骤有:
- 设计解向量:复杂问题的解是由多个小解决决策组成的序列,因此一个问题的解可以表示为满足某个条件的解向量X={x1,x2,x3…,xn}
- 设计剪枝函数:剪枝函数包括了用约束函数在扩展节点处剪去不满足约束条件的子树以及用限界函数减去得不到问题解或最优解的子树。
- 构建解空间树:解空间树中的每一个结点代表了求解过程中的一个状态,树中的边表示了xi的一个可能值,解向量就是由根结点到任意(或叶)结点的路径定义,解空间就是由根结点到所有(或叶)结点的路径定义。
题目内容
设某一机器由n个部件组成,部件编号为1-n,每一种部件都可以从m个不同的供应商处购得,供应商编号为1-m。设wij是从供应商j处购得的部件i的重量,cij是相应的价格。对于给定的机器部件重量和机器部件价格,计算总价格不超过d的最小重量机器设计。(注意:输出结果中第一行最后没有空格。比如下面的输出样例中1 3 1后面没有空格。)
输入格式:
第1行输入3个正整数n,m和d。接下来n行输入wij(每行m个整数),最后n行输入cij(每行m个整数),这里1≤n、m≤100。
输出格式:
输出的第1行包括n个整数,表示每个对应的供应商编号,第2行为对应的最小重量。
输入样例:
3 3 7
1 2 3
3 2 1
2 3 2
1 2 3
5 4 2
2 1 2
输出样例:
1 3 1
4
解题思路
- 对数据的存放仍然采用一元数组形式,通过layer和count两个参数分别通过行和列的计算公式layer*m+count得出数组下标,从w[]和c[]中找到对应的重量和价格
- 利用getMin()函数构建解空间树,layer表示当前的层数,第i层表示第i件商品(从0开始),count表示当前的商户数,第j个表示从第j个供应商处购买。
- 对于每一层,进行由0~m-1的遍历,在当前层选中了该商户后,进入下一层开始新的m次遍历
- 设计剪枝函数,首先是tc[layer0*m+count0]<=d这是题目要求的条件,其次是tw[layer0*m+count0]<minw,此时没有必要进行对下一层的遍历。这里使用<而不是≤,因为题目要求得到的是符合条件的第一个解。
解题代码
#include<stdio.h>int n=0,m=0,d=0;
int minw=0;
int min[100]={0}; //解向量,min[i]存放了第i件商品采购于的商户编号
int temp[100]={0}; //暂存解向量,由此在遍历完解空间树后得到题目所要求得得解向量
int count=0;void getMin(int w0[],int c0[],int layer0,int tw,int tc){ //构建解空间树//其中w0[]数组存放了第i个商品从j商户处购买的重量//c0[]数组存放了第i个数组从j商户处购买的价格//tw表示当前总重量,tc表示当前总价格int i=0,j=0,k=0;if(layer0==n){//已经遍历到了叶节点,得到一个结果,将此结果与minw作比较//如果此时的tw<minw的话,则将temp[]中存放的解向量赋到min[]中//当tw=minw时,由于题目所求的是满足条件的第一个解,所以不变//上述操作由下面的剪枝函数完成if(minw==0)minw=tw;minw=(minw<tw)?minw:tw;if(tw==minw)for(i=0;i<n;i++)min[i]=temp[i];}else{for(i=0;i<m;i++){temp[layer0]=count%m;count++;if(tc+c0[layer0*m+temp[layer0]]<=d) //设计剪枝函数if(minw==0)getMin(w0,c0,layer0+1,tw+w0[layer0*m+temp[layer0]],tc+c0[layer0*m+temp[layer0]]);elseif(tw+w0[layer0*m+temp[layer0]]<minw) //设计剪枝函数getMin(w0,c0,layer0+1,tw+w0[layer0*m+temp[layer0]],tc+c0[layer0*m+temp[layer0]]);}}
}
回溯法求解最小机器重量设计问题相关推荐
- 求解最小机器重量(回溯法/分支限界)
求解最小机器重量(回溯法/分支限界) 回溯法:从后往前记录全局最优解(最小价值,最小重量,尽管他们不是同一个物品上的,最大程度贪心),因为采用DFS深度优先,会马上得到一个结果,然后比较当前选择的重量 ...
- 用回溯法解决最小重量机器设计问题
问题:设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得.设wij是从供应商j处够来的部件i的重量,cij是相应的价格. 试设计一个算法,给出总价格不超过c的最小重量机器设计. 算法设 ...
- 算法设计与分析 实验三 回溯法求解地图填色问题
回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...
- 回溯法求解N皇后问题(Java实现)
回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并以此慢慢地扩大问题规模,迭代地逼近最终问题的解.这种迭代类似于穷举并且是试探性的,因为当目前的可 ...
- 【算法分析】实验 4. 回溯法求解0-1背包等问题
目录 实验内容 实验目的 实验结果 步骤1:描述与分析 步骤2:策略以及数据结构 步骤3 步骤4 步骤5 步骤6 实验总结 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设 ...
- 回溯法求解消消乐实验
回溯法求解消消乐问题 实验概述 掌握回溯法设计思想. 掌握消消乐问题的回溯法解法. <开心消消乐>是一款乐元素研发的三消类休闲游戏.游戏中消除的对象为小动物的头像,包括小浣熊.小狐狸.小青 ...
- java背包算法回溯法_【算法分析】实验 4. 回溯法求解0-1背包等问题
[TOC] 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设计.算法描述.算法正确性证明.算法分析.算法实现与测试),通过回溯法的在实际问题求解实践中,加深理解其基本原理和 ...
- 拉斯维加斯算法结合回溯法求解n后问题
实验8 拉斯维加斯算法结合回溯法求解n后问题 设stopVgas为采用拉斯维加斯算法随机排设的皇后个数,对n.stopVgas进行多组不同取值时,记录程序成功率.运行时间 ① 参考课件.教材.其它资料 ...
- 回溯法解决tsp问题 matlab,回溯法求解tsp问题
回溯法以这种工作方式递归地在解空间中搜索, 直至找到所 要求的解或解 空间中已无活结点时为止. 回溯法求解 TSP 问题,首先把所有的顶点的访问标志初始化为 0,...... 回溯法求解 TSP 问题 ...
最新文章
- cisco 核心交换机连接两个路由器_CISCO、H3C、华为三层交换机端口二三层切换命令对比...
- Data Member 的存取
- u-boot分析之两阶段代码分析(三)
- 使用 bash 脚本把 AWS EC2 数据备份到 S3
- aws使用技巧_AWS:避免那些“神圣的法案”时刻的一些技巧
- 腾讯开源ML-Images,超越谷歌成业内最大多标签图像数据集
- linux 中国-新手村,从新手村开始,手把手带你入门梳理内核代码
- JavaScript 闭包介绍
- 番茄是水果还是蔬菜这事儿,居然闹到了最高法院?!
- STC单片机程序下载原理与自动下载
- 新手如何玩转拼多多?需要注意什么?
- 通过app打包修改app名称
- 汽车高级驾驶辅助系统ADAS功能盘点
- 【前端技术】一篇文章搞掂:HTML
- LeetCode 112 路径总和 python3
- 让我来发代数几何参考书
- win10更改固定IP出现意外无法更改
- 如何使用 Lightly 进行 Python GUI 项目开发
- 我是如何在硅谷获得年薪30万美金Offer的?
- 央行数据 App - 国债 逆回购 LPR M2/M1/M0 央行负债表 Shibor 票据 MLF 查询分析 央行公开市场业务交易数据