控制结构(强化):15.汉明距离

本文介绍如何利用C++实现计算两个整数之间的汉明距离,通过比较它们二进制表示中不同位数来确定距离,适用于编程和技术理解的基础教学。

【问题描述】

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。

【输入形式】

给出两个整数 x 和 y(0 ≤ x, y < 231),用空格分隔

【输出形式】

输出它们之间的汉明距离
【样例输入】

1 4

【样例输出】

2

【样例说明】

1的二进制表示为(00000000 00000000 00000000 00000001)

4的二进制表示为(00000000 00000000 00000000 00000100)

他们的第一位和第三位不一致,所以它们的汉明距离为2

#include<iostream>
using namespace std;
int main() {
	long long int a,b,c,d,sum=0;
	cin>>a>>b;
	for(int i=0;i<31;i++)
	{
		c=a%2;
		d=b%2;
		a/=2;
		b/=2;
		if(c!=d)
		{
			sum+=1;
		}
	}
	cout<<sum<<endl;
	system("pause");
	return 0;
}

<think>我们使用PC算法(Peter-Clark算法)从CartPole环境数据中自动构建因果图。PC算法是一种基于约束的因果发现方法,通过条件独立性测试(如卡方检验、G检验等)来推断变量间的因果关系。 ###步骤1:收集CartPole环境数据首先,我们需要在随机策略或简单策略下运行CartPole环境,收集足够的状态转移数据。每个样本包含:-当前状态$s_t =[x,\dot{x},\theta, \dot{\theta}]$ -动作$a_t$ -下一状态$s_{t+1}= [x',\dot{x}',\theta', \dot{\theta}']$-奖励$r_t$###步骤2:数据预处理将数据整理为变量表,每一行是一个样本,每一列是一个变量(包括状态变量和动作)。注意:动作是离散变量,状态是连续变量。###步骤3:使用PC算法进行因果发现PC算法的基本流程:1.初始化一个完全无向图,节点包括所有状态变量($x, \dot{x}, \theta,\dot{\theta}$)和动作$a$。 2.通过条件独立性测试逐步删除边(如果两个变量在给定某些条件变量下独立,则删除它们之间的边)。3.确定边的方向:利用V结构(碰撞节点)和避免新V结构的原则定向。####代码示例(使用`causal-learn`库)```pythonimportnumpy asnpimport pandasas pdfromcausallearn.search.ConstraintBased.PCimport pcfromcausallearn.utils.citimport chisq, gsq#步骤1:模拟收集数据(这里用随机策略示例) defcollect_cartpole_data(num_samples=10000):env= gym.make('CartPole-v1')data= []for_ inrange(num_samples):state= env.reset()done= Falsewhile notdone andlen(data) <num_samples:action =env.action_space.sample()next_state,reward,done,_ =env.step(action)#记录:当前状态+动作+下一状态sample= list(state)+ [action]+ list(next_state)data.append(sample)state =next_statereturn np.array(data) data= collect_cartpole_data(10000) #定义变量名:当前状态(s1,s2,s3,s4) +动作(a)+下一状态(ns1,ns2,ns3,ns4)columns= ['s1','s2','s3','s4','a', 'ns1', 'ns2', 'ns3', 'ns4']df =pd.DataFrame(data,columns=columns)#步骤2:选择当前状态和动作作为节点(我们关注当前状态变量间的因果关系) #注意:因果发现通常在同一时间步的变量间进行nodes= ['s1', 's2', 's3', 's4','a']X =df[nodes].values#步骤3:运行PC算法(动作a是离散变量,状态s1-s4是连续变量,但PC算法要求所有变量为离散或连续,这里将状态离散化)#方法1:将连续状态离散化(分箱)fromsklearn.preprocessing importKBinsDiscretizerdiscretizer =KBinsDiscretizer(n_bins=5, encode='ordinal',strategy='uniform')X_disc =discretizer.fit_transform(X)#方法2:使用混合条件独立性检验(如针对连续变量的高斯检验,但动作是离散的,这里使用G检验(适用于离散变量))#我们使用G检验(条件独立性检验)cg= pc(X_disc,alpha=0.05,indep_test=gsq, stable=True,uc_rule=0, uc_priority=2) #步骤4:可视化因果图fromcausallearn.utils.GraphUtils importGraphUtilsimportmatplotlib.pyplotas pltpyd= GraphUtils.to_pydot(cg.G) plt.figure(figsize=(10,10))plt.imshow(plt.imread(pyd.create_png())) plt.axis('off') plt.show()``` ###关键问题处理1. **变量类型混合问题**:CartPole的状态是连续变量,动作是离散变量。PC算法要求所有变量类型一致,因此:-将连续状态离散化(分箱),然后使用离散变量的条件独立性检验(如G检验或卡方检验)。-或者使用支持混合变量的条件独立性检验方法(如基于核的检验),但实现较复杂。2.**时间依赖性**:我们关注同一时间步的状态变量间的因果关系(即$s_t$中各分量间的因果关系),以及动作$a_t$对状态变量的影响。注意:下一时刻的状态$s_{t+1}$是结果,不应与$s_t$在同一时间步的因果图中。3.**因果方向确定**:-动作$a_t$是人为干预,应作为因(指向状态变化)。-状态变量间的方向:PC算法通过条件独立性测试和V结构确定方向。例如,在CartPole中,角度$\theta$和角速度$\dot{\theta}$之间,$\theta$应导致$\dot{\theta}$(因为角速度是角度的导数)。 ###预期因果图结构理想情况下,PC算法应发现以下因果关系: -$a \rightarrow \dot{x}$(动作直接影响水平速度变化) -$a\rightarrow\dot{\theta}$(动作影响角速度变化)- $\theta \rightarrow \dot{\theta}$(角度影响角速度)- $\dot{\theta}\rightarrow\theta$(角速度也影响角度变化,形成反馈)但由于环境动态的复杂性,实际发现的因果图可能包含更多边或缺少某些边。需要调整显著性水平(alpha)和条件独立性检验方法。###改进建议1. **增加先验知识**:在PC算法中加入已知的因果约束(如禁止某些边的方向)。```python#示例:禁止从下一时刻状态指向当前状态forbidden_edges =[('ns1', 's1'), ('ns2', 's2'), ...]```2.**使用时间序列因果发现**:考虑状态转移的时序性,使用PCMCI等算法[^1]。3.**验证因果图**:通过干预实验验证边的可靠性(如固定某个状态变量,观察对其他变量的影响)。 ###总结通过PC算法从CartPole数据自动构建因果图的流程: 1.收集随机策略下的状态-动作序列数据2.离散化连续状态变量3.运行PC算法(使用G检验或卡方检验) 4.解析并验证因果图结构该方法可发现状态变量间的基本因果关系,为后续因果强化学习提供基础[^1][^2]。 §§相关问题§§1. PC算法中条件独立性检验的选择(离散vs连续变量)有何影响?2.如何验证从数据中发现的因果图的正确性?3.在部分可观测环境中如何应用因果发现?4.因果发现需要多少样本量才能保证可靠性?5.如何处理动态变化的环境中的因果结构?</think>### 使用PC/FCI算法从CartPole数据自动构建因果图 #### 方法概述 在CartPole环境中自动发现因果图的核心流程如下: 1. **数据收集**:在随机策略下运行环境,收集状态转移数据 2. **变量选择**:确定观测变量集合$V = \{x, \dot{x}, \theta, \dot{\theta}, a, r\}$ 3. **条件独立性测试**:使用PC算法进行因果发现 4. **方向确定**:利用V结构和方向规则确定因果方向 5. **验证优化**:通过干预实验验证因果结构[^1][^2] #### 具体实现步骤 ##### 1. 数据收集与预处理 ```python import numpy as np import pandas as pd import gym from causallearn.search.ConstraintBased.PC import pc from causallearn.utils.cit import fisherz # 收集CartPole交互数据 def collect_cartpole_data(num_episodes=500): env = gym.make('CartPole-v1') data = [] for _ in range(num_episodes): state = env.reset() done = False while not done: action = env.action_space.sample() # 随机策略 next_state, reward, done, _ = env.step(action) # 记录: [x, x_dot, theta, theta_dot, action, reward] sample = list(state) + [action, reward] + list(next_state) data.append(sample) state = next_state return np.array(data) # 数据预处理 data = collect_cartpole_data() df = pd.DataFrame(data, columns=[ 'x', 'x_dot', 'theta', 'theta_dot', 'action', 'reward', 'next_x', 'next_x_dot', 'next_theta', 'next_theta_dot' ]) ``` ##### 2. 因果发现算法选择 使用**PC算法**(Peter-Clark算法)进行因果发现: - **优势**:适合中等规模变量系统 - **核心**:基于条件独立性测试的约束方法 - **数学基础**: $$X \perp\!\!\!\perp Y | Z \Rightarrow \text{无直接因果}$$ 其中$Z$是条件集[^1][^3] ##### 3. 因果图构建实现 ```python # 选择因果分析变量集 variables = ['x', 'x_dot', 'theta', 'theta_dot', 'action', 'reward'] # 创建PC算法实例 cg = pc( data=df[variables].values, alpha=0.05, # 显著性水平 indep_test=fisherz, # 连续变量用Fisher Z检验 stable=True, uc_rule=0 # 方向确定规则 ) # 可视化因果图 print("发现因果边:") for edge in cg.G.get_graph_edges(): print(f"{variables[edge[0]]} --> {variables[edge[1]]}") # 提取因果邻接矩阵 adj_matrix = cg.G.graph ``` ##### 4. CartPole因果图解析 预期发现的因果关系: ``` theta --> theta_dot # 角度影响角速度 theta_dot --> theta # 角速度影响角度变化 action --> x_dot # 动作影响水平速度 action --> theta_dot # 动作影响角速度 theta --> reward # 角度影响奖励 x --> reward # 位置影响奖励 ``` #### 算法优化关键点 1. **条件独立性检验选择**: - 连续变量:Fisher Z检验 - 离散变量:G²检验或卡方检验 ```python from causallearn.utils.cit import gsq, chisq ``` 2. **先验知识注入**: ```python # 添加时间顺序约束:当前状态不能导致先前状态 forbidden_edges = [(4,0), (4,1), (4,2), (4,3)] # action不能导致当前状态 ``` 3. **高维数据处理**: - 使用FCI算法处理潜在混杂因子 - 添加FDR校正控制假发现率 #### 验证与评估 1. **干预验证**: ```python # 固定角度θ=0,观察其他变量变化 fixed_theta_data = df[df['theta'].between(-0.1, 0.1)].copy() # 重新运行PC算法验证theta_dot变化 ``` 2. **指标评估**: - 边发现准确率:$$Acc = \frac{TP+TN}{TP+FP+TN+FN}$$ - 方向召回率:$$Recall = \frac{TP}{TP+FN}$$ - SHD(结构汉明距离)[^3] #### 实际应用注意事项 1. **样本量要求**:PC算法需$n > 1000$样本点保证稳定性 2. **动态系统处理**:考虑时间滞后因果: $$X_t \rightarrow Y_{t+1}$$ 3. **动作影响建模**:将动作视为干预变量: $$do(a=left) \Rightarrow P(\theta_{t+1}|\theta_t)$$ ### 典型结果分析 在CartPole环境中,PC算法通常发现: 1. 强因果关系:$\theta \leftrightarrow \dot{\theta}$(双向影响) 2. 动作影响:$a \rightarrow \dot{x}$,$a \rightarrow \dot{\theta}$ 3. 奖励依赖:$\theta \rightarrow r$,$x \rightarrow r$ 这些发现与物理原理一致:小车通过左右移动(动作$a$)改变角加速度$\ddot{\theta}$,从而影响角度$\theta$和角速度$\dot{\theta}$[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一二爱上蜜桃猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值