9.3 多阶段决策问题

这篇博客探讨了使用动态规划解决多阶段决策问题,包括多段图的最短路问题和0-1背包问题。在最短路问题中,通过状态转移方程找到从起点到最后一列的最小开销路径。0-1背包问题分为物品无限和有限的情况,动态规划方法分别用于求解最大重量。博客还提到了滚动数组优化,但指出这种方法不利于回溯找到解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9.3 多阶段决策问题

这一章先看题。


9.3.1 多段图的最短路

9-4 单向 TSP (UVA 116)

给一个m行n列(m<=10,n<=100,这里的数据范围就是提醒大家这是一个宽度可能要远大于长度的矩阵)的整数矩阵,从第一列任何一个位置出发每次向右,右上或右下三个方向选择一个方向走一格,最终到达最后一列。要求经过的整数之和最小。整个矩阵是环形的,即第一行的上一行是最后一行,最后一行的下一行是第一行。输出路径路径每列的行号,多解时输出最小的。

分析:状态的设计就比较简单了,d(i,j)表示从格子(i,j)出发到最后一列的最小开销。于是有状态转移方程:d[i][j]=max{d[i-1][j+1],d[i][j+1],d[i+1][j+1]}+a[i][j]。边界条件的话比较简单:d[i][n]=0,d[i][n-1]=a[i][j],逆推即可。

代码如下:

int ans=INF,first=0;//ans表示最短路径,first表示在第一列的第first行出发可以得到最短路径 
for (int j=n-1;j>=0;j--) for (int i=0;i<m;i++){
   
	if (j==n-1) d[i][j]=a[i][j];//边界条件 
	else{
    int rows[3]={
   i-1,i,i+1};//表示右上,右,右下三个方向 
		//环形矩阵,第0行上面一行是第m-1行,第m-1行下面是第0行 
		if (i==0) rows[0]=m-1; if (i==m-1) rows[2]=0; 
		sort(rows,rows+3); d[i][j]=INF;//这里的排序是为了方便得到字典序最小的解 
		for (int k
### 关于决策树的例题与练习题 #### 决策树算法概述 决策树是一种常见的监督学习方法,广泛应用于分类和回归任务。其核心在于通过一系列条件判断构建一棵树形结构模型[^1]。为了更好地理解决策树的工作原理及其应用,可以通过解决实际问题来加深认识。 --- #### 经典例题解析 ##### 例题 1:基于信息增益的选择特征 假设有一个简单的数据集如下表所示: | 天气 | 温度 | 风力 | 是否游玩 | |------|------|------|----------| | 晴朗 | 炎热 | 微风 | 否 | | 晴朗 | 炎热 | 强烈 | 是 | | 阴天 | 中等 | 微风 | 是 | | 下雨 | 寒冷 | 微风 | 是 | 目标是根据天气、温度和风力等因素预测是否会去游玩。 计算每个属性的信息增益并选择最佳分裂点作为根节点[^1]。 **解答思路**: 1. 计算原始数据集的经验熵 \( H(D) \)[^1]: 假设正类样本数为 \( P=2 \),负类样本数为 \( N=2 \),则经验熵为: \[ H(D) = -\frac{P}{P+N} \log_2{\frac{P}{P+N}} - \frac{N}{P+N} \log_2{\frac{N}{P+N}} \] 2. 对每个属性分别计算条件熵 \( H(D|A) \) 并求得信息增益 \( G(D, A) = H(D) - H(D|A) \)。 3. 选取具有最大信息增益的属性作为当前节点的最佳分割标准。 最终可以得到一颗完整的决策树用于预测新样本的结果。 --- ##### 例题 2:防止过拟合 考虑以下情况,在某次实验中发现当使用“最小训练误差”准则时,决策树在测试集上的表现较差[^2]。试分析原因,并提出改进措施。 **解答思路**: - 过拟合的原因可能是由于决策树过度适应了训练集中的一些噪声或细节模式,从而降低了泛化能力。 - 改进策略包括但不限于剪枝操作(预剪枝/后剪枝)、设置最大深度限制以及引入交叉验证机制评估模型性能[^2]。 --- #### 推荐练习题 以下是几道适合初学者尝试的经典练习题: 1. **手写实现ID3算法** 使用Python编写一段程序模拟ID3算法流程,输入自定义的小型数据集完成建模过程。 ```python from math import log def entropy(data): total_samples = len(data) positive_count = sum([1 for d in data if d[-1] == &#39;Yes&#39;]) negative_count = total_samples - positive_count if positive_count == 0 or negative_count == 0: return 0 p_positive = positive_count / total_samples p_negative = negative_count / total_samples return -(p_positive * log(p_positive, 2)) - (p_negative * log(p_negative, 2)) # 更多功能待补充... ``` 2. **CART算法实践** 利用Scikit-Learn库加载鸢尾花(Iris)数据集,对比不同参数配置下的 CART 分类器效果差异。 3. **随机森林扩展** 结合多个基决策树构成集成学习框架(Random Forests),观察单棵决策树与整体模型之间的精度差距。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值