使用深度搜索分析心理调查问卷的研究

来源:互联网 发布:软件维护费用 编辑:程序博客网 时间:2024/04/28 09:44

使用深度搜索分析心理调查问卷的研究

背景

昨天我女朋友发了一个心理调查问卷要我做。我向来对这种形似心理调查问卷嗤之以鼻: 一个人的性格怎么可能由几个简单的问题决定。但作为技术人员,我决定用技术的手段分析这份调查问卷,向女朋友证明其缺乏科学性。

调查问卷的原版如下图
这里写图片描述

有兴趣的朋友可以玩玩~

我想了解如下几个问题:
1. 问卷是不是有环路?如果有环路,则可证明这份问卷不正规。
2. A 答案是不是不可能达到?因为4个答案中,只有A答案没有同的倾向。
3. 如果 A 答案能到达,那么有多少种可能?占比是多少?

分析

这种问卷调查有特点:每一个题目都对应多个选项;每一个选项,都对应一个题目或者答案。从一个人答题的路径来看,其实这就是一个典型的图结构。

结合我想了解的问题,有如下几个方面需要考虑:
1. 证明图没有环路
2. 使用DFS证明A是可以达到的
3. 统计所有的可能的结果,算出A的占比

建模

我打算使用 列表模式 构建图

  @list = [    [1],    [2,3],    [3,4],    [4,5,6],    [5,6,7],    [6,7],    [7,8,9],    [8,9],    [9,10,11],    [10,11,12],    [12,13],    [13,14],    [13,15],    [15,18,14],    [15,18],    [16,18],    [17,18,19,20],    [20,21,'B'],    [19,'C'],    [22,'A'],    [21, 'D'],    [22, 'B'],    ['A', 'C', 'D']  ]

图的节点有 0 到 22, 再加上 A, B, C, D。
1. 因为我不想处理下标,所以图的起始位置,我设置成0;
2. 图的节点,我简单的用数组的下标表示;
3. 答案直接输出,不需要放在节点的集合中;

DFS

图有没有环路

代码如下:

def has_cycle?  recursion_stack = [false] * 23  check_cycle(0, recursion_stack)enddef check_cycle(vertex, recursion_stack)  recursion_stack[vertex] = true  @list[vertex].each do |node|    next if over?(node)    return true if recursion_stack[node]    check_cycle(node, recursion_stack)  end  recursion_stack[vertex] = false  return falseend

其中 over?方法是用来判断递归是否结束。

def over?(point)  ['A', 'B', 'C', 'D'].include?(point.to_s)end
  1. has_cycle 来判断是否有回路,我将一次完全迭代的节点是否访问到了的信息保存在recursion_stack
  2. 它调用 深度搜索 算法实现的 check_cycle

运行得出的结果是 false

A 可以到达吗?A如果可以到达,那么A的可能性有多大?

@result = []def dfs(node)  @list[node].each do |vertex|    if over?(vertex)      @result << vertex      next    end    dfs(vertex)  endend

使用深度有限搜索, 将最后的结果保存在 @result中,将结果打印出来。

def count_charactor(result, charactor)  result.count { |item| item == charactor }enddfs(0)puts "一共有 %d 可能的答案" % @result.size('A'..'D').to_a.each do |charactor|  puts "#{charactor}: %d 种可能, 占比为 %f" % [ count_charactor(@result, charactor), count_charactor(@result, charactor).to_f / @result.length]end

结果如下:

一共有 27860 可能的答案A: 8960 种可能, 占比为 0.321608B: 3360 种可能, 占比为 0.120603C: 8120 种可能, 占比为 0.291457D: 7420 种可能, 占比为 0.266332

输出能到答案A的100路径

@i = 0def dfs(node, stack)  stack.push node  @list[node].each do |vertex|    if over?(vertex)      @result << vertex      if vertex == 'A'        @i += 1        puts "到A的路径有:"        puts stack.join(" -> ")      end      break if @i == 100      next    end    dfs(vertex, stack)  end  stack.popend

用一个栈stack来保存路径, 到A点将所有的结果输出

总结

图的算法应用真的很广泛,值得深入研究。有时候将实时中的问题抽象成图的问题,能让我们从另外的一个角度看问题。再则,用ruby实现图的算法也是很简单的。dfsbfs简单,但收到程序栈的限制。但比较适合本程序。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 虚拟机没有自带怎么办 错误连接为720怎么办 dns错误不能上网怎么办 家里无线用不了怎么办 磁盘c5坏了怎么办 一体机装xp蓝屏怎么办 虚拟机密码忘记了怎么办 vivoy66手机太卡怎么办 虚拟机装xp蓝屏怎么办 exagear玩起来卡怎么办 第五人格模拟器玩太卡怎么办 速腾油箱盖打不开怎么办 奥迪a6油箱盖打不开怎么办 苹果手提虚拟机黑屏怎么办 mac系统桌面变大怎么办 删除文件要权限怎么办 页面载入错误了怎么办 手机打不开excel表格怎么办 皇室战争闪退怎么办 苹果老是闪退怎么办 黑苹果开机黑屏怎么办 MAC磁盘删了怎么办 mac磁盘被锁定怎么办 bt5读不到网卡怎么办 笔记本电脑cpu温度过高怎么办 笔记本cpu温度过高怎么办 联想系统崩溃了怎么办 办公软件用不了怎么办 win10设置闪退怎么办 手机浏览器版本低怎么办 wps界面动不了怎么办 手机设置删了怎么办 苹果手机设置不见了怎么办 笔记本电脑键盘不好使怎么办 网咖怎么办临时卡 cydia添加雷锋源失败怎么办 电脑mac已锁定怎么办 苹果home键发热怎么办 苹果软件消失了怎么办 苹果键盘消失了怎么办 苹果图标消失了怎么办