公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

0 投票
5.7k 浏览
题目大概是:选举过程中,群体选择a或b当总统,视其邻居节点的选择。共100人参与投票,可视为节点,每个节点以2为去心领域的半径,也就是第3点的邻居是第1个点、第2个点、第4个点、第5个点;第1个点的邻居为第98个点、第99个点、第2个点、第3个点。若邻居中有三人选择a当总统,则该点也选择a,反之则选择b。请用mathematica编程,描绘该动态过程。每个节点初始值选择a、b任意。
求大神明确下算法和语句。跪谢!
用户: 梦中人 (-24 分)
重新显示 用户:野鹤
请问按正常的第1个点的邻居为第99个点、第100个点、第2个点、第3个点吗?还是我理解错了呢?
感谢提出修正,是这样的 第1点的邻居为第99、100、2、3个点。
不好意思,你能再解释一下“每个节点初始值选择a、b任意。”吗?
初始值任意的意思是指,这个最开始每个节点选择a或b做总统不受其邻居影响,是任意的

3 个回答

+2 投票
 
已采纳

方法1

Nest[f /@ Partition[#, 5, 1, 3] &, Range[5], 1]
Nest[f /@ Partition[#, 5, 1, 3] &, Range[5], 2]

方法2

CellularAutomaton[{f, {}, 2}, Range[5], 2]

当然,请自行构建f的具体形式和“描绘该动态过程”。

 

用户: 苹果 (2.2k 分)
采纳于 用户:梦中人
请问元胞自动机函数中的f指的是什么呢,如何求解任意循环次数时的所有节点选择情况呢
f就是你的演化规则呀,例如“若邻居中有三人选择a当总统,则该点也选择a,反之则选择b”。
+2 投票

借鉴苹果元包自动机的方法,这里写一下函数f的定义:

(*1:代表选a,0:代表选b*)
f[x_, _] := If[Count[x[[;; 2]], 1] + Count[x[[3 ;;]], 1] > 2, 1, 0]
everyStep = CellularAutomaton[{f, {}, 2}, RandomInteger[1, 100], 10];
MatrixPlot[everyStep, ColorRules -> {1 -> Black, 0 -> White}]

 

用户: 野鹤 (5.1k 分)
楼主定义的函数我没看懂,麻烦能帮我讲一下吗?
请问函数f的哪部分不理解?
我觉得这答案至少1,2,99,100这四个点应该是对不上的,元胞机默认的是指定背景,比如说0,或者Padding一个最邻近的值,相当于Padding->"Fixed",不过我们需要的是Padding->"Periodic",但CellularAutomaton函数没有选项,所以我认为这题不太合适用CellularAutomaton。或者我理解错了,麻烦答主指正
貌似没有问题啊,你先不定义f,然后试一下:CellularAutomaton[{f, {}, 2}, Range[10], 2]
0 投票
  • 第一种情况:

产生初始选举序列后每个选民都同时看一下周围的人,然后这些选民再同时修改自己的选票

产生初始选举序列

SeedRandom[2016420]
init = RandomChoice[{a, b}, 100]
{b, a, b, a, b, a, b, a, a, a, a, a, b, b, b, a, b, b, a, a, a, b, a, 
a, b, b, a, a, b, a, a, a, a, b, a, b, b, a, a, b, b, b, b, a, b, a, 
a, b, b, a, a, a, a, a, a, b, b, a, b, a, b, b, a, b, a, b, b, a, b, 
a, a, b, b, a, a, a, b, a, a, a, a, b, b, b, b, a, b, b, b, a, b, a, 
b, b, b, b, a, b, a, b}

若邻居中有三个或四个人选择a当总统,则该点也选择a,反之则选择b

ArrayFilter[If[Count[Delete[#, 3], a] > 2, a, b] &, init, 2, 
 Padding -> "Periodic"]
{b, b, b, b, b, b, a, a, a, a, a, b, b, b, b, b, b, a, b, b, a, a, b, 
b, a, a, b, b, a, a, a, a, a, a, b, b, a, b, b, b, b, b, b, b, a, b, 
b, a, a, b, a, a, a, a, b, a, b, b, b, b, b, b, b, b, b, b, b, b, a, 
b, b, a, a, b, b, a, a, a, a, a, b, b, b, b, b, b, b, b, b, b, b, b, 
b, b, b, b, b, b, b, b}
  • 第二种情况

产生初始选举序列后,第1个人看一下周围的人,修改自己的选票,然后第2个人再看一下周围的人,修改自己的选票(注意,此时第1个人已经改过了), 然后第3个人再看一下周围的人,修改自己的选票(注意,此时第1和第二个人都已经改过了),然后第4个人....逐次到100个人。这种情况对a很不利(本来也只有0.3125的概率被修改成a),后面的人会跟风以致大家都选b

SeedRandom[2016409]
init = RandomChoice[{a, b}, 100];
SequenceFoldList[If[Count[Delete[{##}, 3], a] > 2, a, b] &, 
  init[[-2 ;;]], Join[init, init[[;; 2]]], 5][[3 ;;]]
{a, a, a, a, a, a, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, 
b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, 
b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, 
b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, 
b, b, b, b, b, b, b, b}

这还不是最糟糕的情况,我故意选得初始序列是最后两个都是a,如果是SeedRandom[2016420]的情况,最后迭代下去大家都会跟风选b

用户: Lozmlve*永 (1.2k 分)
修改于 用户:Lozmlve*永
然后还得Nest。。。。。
@ 苹果 嗯?后一个列表不是最后的选举结果?或者这题目我理解错了?
如果只迭代一次的话,那么你的理解是对的。“描绘该动态过程”感觉可能不止迭代一次。
@苹果 有道理,我知道你说的了,@梦中人 请问你的目的是苹果说的意思吗?
对的 我的意思是多次迭代 甚至可以求出在第某次迭代次数时的所有个体选择情况
@苹果 按你的意思改过来了
为什么我复制你的代码运行不出来啊
@jianbo 我这里是可以的
...