回溯法,回溯法解装载问题
一、回溯法有“通用的解题法”之称,可以系统的搜索一个问题的所有解或任一解。它在问题的解空间中按深度优先策略,从根节点出发,搜索解空间树。算法搜索至解空间树的任一节点时,先判断该节点是否包含问题的解,如果肯定不包含则跳过对以该节点为根的子树的搜索,回到其父节点回溯。否则,进入该子树,继续按深度优先策略搜索。
利用回溯法解问题时一般按以下三步骤:
1)定义问题的解空间;
2)确定易于搜索的解空间结构;
3)以深度优先策略搜索解空间,并在搜索过程中用剪枝函数避免无效搜索;
二、回溯法应用——装载问题
一批集装箱共n个要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为Wi且W1+W2+……+Wn<=c1+c2;试确定一个合理的装载方案使这n个集装箱装上这两艘轮船。
#include<stdlib.h>
#include<stdio.h>
#include<iostream.h>
typedef int Status;
typedef int Type;
int n=0; //集装箱数
Type *x=(Type*)malloc((50)*sizeof(Type));//当前解
Type *bestx=(Type*)malloc((50)*sizeof(Type));//当前最优解
Type c=0, //第一艘轮船的载重量
cw=0, //当前载重量
bestw=0, //当前最优载重量
r=0,
*w=(Type*)malloc((50)*sizeof(Type)); //集装箱重量数组
int Backtrack(int i)//搜索第i层节点
{
int j_index;
/*如果到达叶结点,则判断当前的cw,如果比前面得到的最优解bestw 好,则替换原最优
解。*/
if(i>n)
{
if(cw>bestw)
{
for(j_index=1; j_index<=n; j_index++)
bestx[j_index]=x[j_index]; bestw=cw;
}
return 1;
}
//搜索子树
r-=w[i];
if(cw+w[i]<=c)//搜索左子树,如果当前剩余空间可以放下当前物品也就是,cw + w[ i ] <= c
{
x[i]=1;
cw+=w[i];//把当前载重 cw += w[ i ]
Backtrack(i+1);//递归访问其左子树,Backtrack( i + 1 )
cw-=w[i];//访问结束,回到调用点, cw - = w[ i ]
}
if(cw+r>bestw)//搜索右子树
{
x[i]=0;
Backtrack(i+1);
}
r+=w[i];
}
Type* Initiate()
{
int index=1;
printf("输入集装箱个数:");
scanf("%d",&n);
printf("输入轮船载重量:");
scanf("%d",&c);
while(index<=n)//数组从1号单元开始存储
{
printf("输入集装箱%d 的重量:",index);
scanf("%d",&w[index]);
index++;
}
bestw = 0;
cw = 0;
r = 0;
for(index =1;index <= n; index++)
r += w[index]; //初始时r 为全体物品的重量和
printf("n=%d c=%d cw=%d bestw=%d r=%d\n",n,c,cw,bestw,r);
for(index=1;index<=n;index++)
{
printf("w[%d]=%d ",index,w[index]);
}
printf("\n");
return w;
}
int main()
{
int i;
Initiate();
//计算最优载重量
Backtrack(1);
for(i=1;i<=n;i++)
{
printf("%d ",w[i]);
printf("%d\n",bestx[i]);
}
return bestw;
}
回溯法,回溯法解装载问题相关推荐
- 探讨与研究——动态规划算法、回溯法、分支限界法解0-1背包问题
一个人终归是要成长的,是要不断历练的,没有人可以安安稳稳一辈子.就算是最有地位最有钱的人也要不断追求.不断历练.不断提升自己. 人的学问少时在不断学习,青年时期不断实践.随着时间推移,到了老年终有所成 ...
- DID会固定年份吗_倍分法DID详解 (二):多时点 DID (渐进DID)
作者:王昆仑 (天津大学) Stata连享会 计量专题 || 公众号合集 2020寒假Stata现场班 (北京, 1月8-17日,连玉君-江艇主讲) 「+助教招聘」 2020寒假Stata现场班 文 ...
- java 回溯_java 实现迷宫回溯算法示例详解
用一个7 x 7的矩形表示迷宫,0和1分别表示的是通路和障碍.通过设计编写程序找到蓝色小球达到蓝色旗子的路线 思路: 构建一个迷宫(用二维数组)实现找通路的方法findRoad() 构建二维数组不难, ...
- 【原创】赋值法写基础解系中解向量
赋值法写基础解系中解向量 (一)背景引入 通常解方程组时,将系数矩阵化为行阶梯型,进而可化为行最简型 (说一嘴:行最简型是指阶梯口元素全是1,该1所在列全其余全为0:广义行阶梯的阶梯口处元素非1也可) ...
- rust如何在木板上上传图片_腐蚀rust游戏玩法方式详解
在腐蚀这款游戏中玩家所有的物资都需要自己去寻找,不过很多时候遇到不怀好意的玩家时最好提高安全意识,及时躲避袭击,下面是游戏玩法发展方式详解. 游戏玩法方式详解 这里分两种发展方式 1.纯新手 首先需要 ...
- Python实现TOPSIS分析法(优劣解距离法)
文章目录 (1).题目 (2).读取Excel表中的数据 (3).将不同的指标转换为极大型指标 (4).正向化矩阵标准化 (5).计算得分并归一化 (6).主函数 (7).完整代码部分 (8).计算结 ...
- 数学建模——TOPSIS法(优劣解距离法)学习笔记(一)
一.TOPSIS方法 TOPSIS法(Technique for Order Preference by Similarity to Ideal Solution) 可翻译为逼近理想解排序法,国内常简 ...
- DID会固定年份吗_倍分法DID详解 (三):多时点 DID (渐进DID) 的进一步分析
作者:王昆仑 (天津大学) E-mail: shawn0513@163.com 连享会专题课程:DSGE 模型及应用 连享会 DSGE 专题课程 这是连享会「倍分法(DID)专题推文」系列的第三篇文章 ...
- 倍分法DID详解 (二):多时点 DID (渐进DID)
作者:王昆仑 (天津大学) Stata连享会 计量专题 || 公众号合集 导入 在 「连享会 - 倍分法系列推文」-- 「倍分法DID详解 (一):传统 DID」 文中,我们详细介绍了 D ...
- 我的世界java版区块显示_我的世界手游区块显示指令分享:区块玩法操作详解[多图]...
我的世界手游区块是一个独特的机制,很多玩家对于区块是什么不太了解,区块显示指令以及区块的产生不是很熟悉,为了帮助到大家,今天小编就为大家带来我的世界手游区块显示指令分享:区块玩法操作详解的内容,希望大 ...
最新文章
- 什么是Kafka Global Table (GlobalKTable)
- 利用SPRING管理热加载的GROOVY对象!
- Program type already present: android.support.v4.app.BackStackRecord$Op
- 网页3D效果库Three.js学习[二]-了解照相机
- matlab lj( )函数,matlab 函数调用问题
- 刚刚,百度AI公布最新进展:Apollo2.0,新课程,设全球研究院
- C#窗体间传值的简便方法/工具
- atitit.事件驱动的总结attilax
- Dynamic 365 中创建编码规则
- Linux之zip命令
- Linux电脑怎么接入arm开发板,PC机与ARM开发板之间实现NFS共享
- 卖西瓜问题(Java经典编程案例)
- 基于Flask的视频网站设计与实现(Python电影视频推荐系统)
- 网易云音乐常用API浅析
- 谷歌科学家:目标优化不好使?今天聊聊泛化这件事儿
- 美团招聘CV算法专家/AutoML专家
- 百度云盘下载慢解决办法
- Mysql数据库地区表 递归查询 省市区
- 我和计算机技术-在迅雷
- python中callable_Python abc.Callable方法代码示例