ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2835|回复: 10

[原创] 发几个小工具_完全展开图论中环形顶点染色问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-1-17 12:06 | 显示全部楼层 |阅读模式
本帖最后由 aoe1981 于 2018-1-17 13:38 编辑

  本帖内容和我的下帖紧密相关:
  http://club.excelhome.net/forum. ... 1392190&pid=9380961
  (以上链接为“圆排列算法”7楼)

  做了几个什么小工具呢?有三个:
  1.生成全染色方案,代码如下:

  1. Option Explicit
  2. Public pd%
  3. Dim n&, c&, fas&, ys(), jg$(), k&, ljf$
  4. Sub FangAn() '生成全染色方案
  5.     Sheet1.Activate
  6.     If pd = 0 Then MsgBox "请选择颜色数初始化程序。": Range("b2").Select: Exit Sub
  7.     n = Range("b1").Value
  8.     c = Range("b2").Value
  9.     fas = Range("b4").Value
  10.     If fas > 1 Then ys = Range("b7:b" & 6 + c).Value Else ReDim ys(1 To 1, 1 To 1): ys(1, 1) = Range("b7:b" & 6 + c).Value
  11.     If Range("g2").Value = "" Then ljf = " " Else ljf = Range("g2").Value
  12.     ReDim jg$(1 To fas, 1 To 1)
  13.     k = 0: Call DG(1, "")
  14.     Application.EnableEvents = False
  15.     Range("h2:h" & Rows.Count).ClearContents
  16.     Range("h2").Resize(fas, 1).Value = jg
  17.     Application.EnableEvents = True
  18. End Sub
  19. Sub DG(c1&, s$)
  20.     Dim i&
  21.     For i = 1 To c
  22.         If c1 = n Then
  23.             k = k + 1: jg(k, 1) = s & ys(i, 1)
  24.         Else
  25.             Call DG(c1 + 1, s & ys(i, 1) & ljf)
  26.         End If
  27.     Next i
  28. End Sub
复制代码

  2.旋转变换染色方案字符串,代码如下:

  1. Public Function XZ(rng As Range, Optional ljf$ = " ", Optional n& = 0) As String '旋转变换(目标染色方案,连接符,旋转单位角的倍数)
  2.     Dim fa$, i&, gd, gd1, s$, r&
  3.     fa = rng(1).Value
  4.     If ljf = "" Or InStr(1, fa, ljf) = 0 Then ljf = " "
  5.     gd = Split(fa, ljf): gd1 = gd: r = UBound(gd) + 1: n = n * -1 '正值向右滚动,负值向左滚动
  6.     For i = 0 To r - 1
  7.         If n < 0 Then gd(i) = gd1((r + ((i + n) Mod r)) Mod r) Else gd(i) = gd1((i + n) Mod r)
  8.     Next i
  9.     For i = 0 To r - 1
  10.         s = s & ljf & gd(i)
  11.     Next i
  12.     XZ = Mid(s, 2)
  13. End Function
复制代码

  3.对称变换染色方案字符串,代码如下:

  1. Public Function DC(rng As Range, Optional ljf$ = " ") As String '对称变换(目标染色方案,连接符)
  2.     Dim fa$, i&, gd, gd1, gd2$, s$, r&, r1&
  3.     fa = rng(1).Value
  4.     If ljf = "" Or InStr(1, fa, ljf) = 0 Then ljf = " "
  5.     gd = Split(fa, ljf): gd1 = gd: r = UBound(gd) + 1
  6.     If r And 1 Then '奇数
  7.         For i = 1 To r - 1
  8.             gd(i) = gd1(r - i)
  9.         Next i
  10.     Else '偶数
  11.         r1 = r / 2
  12.         For i = 1 To r1 - 1
  13.             gd2 = gd(i): gd(i) = gd(r1 + r1 - i): gd(r1 + r1 - i) = gd2
  14.         Next i
  15.     End If
  16.     For i = 0 To r - 1
  17.         s = s & ljf & gd(i)
  18.     Next i
  19.     DC = Mid(s, 2)
  20. End Function
复制代码

  应用这些小工具的目的:完全展开图论中环形顶点染色问题的具体例子,比如:问题衍生4:用R、B两色对正方形顶点进行染色的不同方案。这些例子在图论的书籍、教学视频中都是被简化了的,因为完全展开费时费力,用蛮力几乎不可能。只能借助计算机来进行。我想以此为帮助,一窥burnside定理(伯恩赛德定理)在这个问题上应用的具体细节,以提高认识和理解。
  有关工具的仔细操作说明及应用背景的详细介绍放在2楼,由于多含图片的说明,编辑不易,我会传word内容。容后再说。这儿先上一张我已经做出的问题衍生4的过程及结果一览图:
   染色方案.jpg

  附件如下:
   发几个小工具_完全展开图论中环形顶点染色问题.zip (31.05 KB, 下载次数: 18)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-17 12:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 aoe1981 于 2018-1-17 22:31 编辑

  关于小工具的应用背景介绍和操作说明及效果直观示例。(先占楼)
  终于做出来了。

  直接粘贴word格式,图片不能显示。折腾在后。此楼空占。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-17 22:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 aoe1981 于 2018-1-18 13:53 编辑

  如果上述直接粘贴word文件内容格式不太友好的话,可下载word附件:
   发几个小工具_完全展开图论中环形顶点染色问题.zip (22.07 KB, 下载次数: 12)
  (修改了内容中的个别字眼错误,楼下内容由于编辑较繁,不再同步修改)

  (楼下内容已修正)

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-17 22:28 | 显示全部楼层
本帖最后由 aoe1981 于 2018-1-18 13:49 编辑

发几个小工具_完全展开图论中环形顶点染色问题

  内容繁多,思绪凌乱,捋了半天,就先从给定的正方形(以至于正1、2、3、……、n边形及至圆,同理可得)的顶点的标注开始吧。如下图:

                       1.jpg

  对于正方形顶点染色的问题,我们要标注的事实上有两种:一是顶点的名称,一是顶点的颜色。其中:顶点我们假定位置、次序不变,变化的是其颜色,也即下文所说的“置换”我们可以理解为顶点不变而置换其颜色。这时就有不同的习惯,为不至于造成不必要的混乱,此处声明。我们可以用数字序号表示顶点,也可以表示颜色,字母符号则表示颜色或顶点,此处我选择用数字序号表示顶点,方便确定顶点位置、次序的不变,用字母表示颜色。当然,这只是习惯而已,我的做法不具代表性。于是,给定一种染色方案,可以完整地如下表示:
  1 2 3 4
  a b c d
  当然,这时您会发现用了4种不同的颜色,事实上可以选用任意种颜色,比如:2种颜色,甚至5种颜色。所以用和顶点数相同的颜色数举例,是为了方便展现下文置换的效果,这只是理解上的需要。

  一、什么是置换?

  一个4元置换f可以用符号可以表示为(一般情况为n元置换,此处以正方形为例):

               2.jpg

  从左到右的次序表示顶点1、2、3、4的着色,经过f置换,顶点1的着色由a变为d,顶点2的着色由b变为a,顶点3的着色由c变为b,顶点4的着色由d变为c。
  这样的4元置换一共有4!=24(个),这是根据乘法原理可以得到的易理解的。

  二、什么是置换群?
  我们重点要考察的是由以上置换所组成的集合。显然,对于上面的例子,最大的集合包含所有24个置换。这个最大的集合作成一个群,可以称为置换群,表示为:
         S4={f|f是4元置换}
  既然有集合的概念,为什么又要创造一个“群”的概念呢?简单回答,是因为群不是一般的集合,而是满足特定条件的集合。换个角度理解,就是对于以上4元置换组成的集合,有许许多多,比如:0个4元置换组成的空集φ、1个4元置换组成的集合、2个4元置换组成的集合、……、直到24个4元置换组成的最大集合。总数应当是2^24个,够多,这还只是4元置换的,n元置换所有的集合总数为:2^(n!)个。这些集合并不都是具有好的性质,借用一个概念,众多集合往往是平凡的,只有特定的集合才是不平凡的。群就是一些不平凡的集合。
  一个集合G怎样才能做成一个群?要满足3个条件:
  1.合成运算封闭。我们习惯的运算是加、减、乘、除,运算对象是数。现在,运算对象变了,是置换,运算也要重新定义,叫做合成运算,用圈ο表示。比如:
    f∈G,g∈G,定义在G上的圈运算写为:fοg
  怎样理解这个运算呢?类似于复合函数。fοg的意思是先进行g置换,再将结果进行f置换。顺序是从右到左。这个运算的实质就是置换可以施加多次。
  定义好运算以后,关键的一点就是:封闭。如果一个由置换组成的集合G,其元素进行圈运算后,结果仍在集合G当中,我们称这个集合G对圈运算封闭。表示为:
    &#8704; f∈G,&#8704; g∈G,fοg∈G
  这时,集合G已经比很多集合“好”多了。但是要成为“群”,还不够。
  2.有单位元。记作L(这个符号读作:yi ao ta,不是字母L,只是找了个最像的),基本性质如下:
    L∈G &#8704; f∈G, Lοf= fοL=f

  单位元L是这样的一个置换:

             3.jpg

  也就是说啥也不动,也叫恒等置换。其作用类比于加法运算中的0,乘法运算中的1。通俗点讲就是,单位元与其他任何元素作定义其上的运算时,结果还是那个元素本身。
  3.有逆元。表示为:
    &#8704; f∈G,有:f^-1∈G,且:fοf^-1= f^-1οf=L
  逆元可类比于对于加法的正负数,对于乘法的倒数。
  到此,如果一个由置换作为元素组成的集合G满足以上3个条件后,G便作成一个群,叫做置换群。置换群是极好的集合。

  三、置换群的“好”与“坏”
  显然,所有4元置换集合S4作成一个最大的置换群,因为:
  1.对其间任意元素做任意次的迭加置换(即圈运算),其结果仍是一个置换,且在S4中,因为S4就包括所有的4元置换,结果无出其右。
  2.恒等置换包含其中。
  3.任一置换都有逆元存在。单位元的逆元是其本身,其他的比如:

         4.jpg

  二者显然互为逆元。有些置换其逆元是其他的置换,有些置换的逆元则是其本身。总之,S4满足这一条。
  同样显然,单独一个{L},即恒等置换作成一个最小的群。
  空集φ是最赖皮的,可以说拥有所有性质,也可以说啥性质都没有。他的存在,往往是为了理论的自我完善,实际意义不大。就好像写代码时,经常要考虑等于0、1时会不会出错。
  总之,上面谈到的两个群,S4最大,元素太多了,{L}最小,元素只有一个,都是不太好的群,称呼为平凡的群。在那些比{L}大的S4的真子群中,往往存在性质更好的群,在许多问题中能化腐朽为神奇。我们称这些群为不平凡的群。

  四、如何找到不平凡的群
  其实不平凡的群据我理解是和解决问题息息相关的。以上例:从R、B两色中对正方形顶点进行不同着色的问题入手谈谈。

  首先是全染色方案,这个很简单:4个顶点,2种颜色,每个顶点都有2种颜色选择,共有2^4=16(种)染色方案。形如:
    RRRR,RRRB,RRBR,RRBB,RBRR,RBRB,RBBR,RBBB,
    BRRR,BRRB,BRBR,BRBB,BBRR,BBRB,BBBR,BBBB,
  请注意:此时顶点的次序是不变的,每种染色方案从左至右都为顶点1、顶点2、顶点3、顶点4的对应染色。
  如果问题止于此,则省去了许多折腾。但事实是,以上全染色方案中的许多方案都被认为是相同的,或是重复的。这是因为,我们不是以静止的角度看问题,而是让正方形动了起来。怎么动?从这个实际问题中来,影响我们对其是否为不同染色方案判断的图形运动是旋转变换和对称变换。

  其次是旋转变换。
  对于正方形而言,旋转变换有4个,记为:L,ρ4,ρ4^2,ρ4^3,其中:L=ρ4^0,ρ4=ρ4^1(ρ读作:rou,不是字母p、P)。什么意思?4个顶点将圆周角分为4个直角,上述4个旋转变换分别为将正方形旋转(逆时针考虑,其实顺逆无所谓,都能转回去)0°、90°、180°、270°。360°和0°自然效果是一样的,都是原地不动,也即所谓恒等变换。为了便于考虑顶点的染色问题,我们假定顶点不动,而只对顶点上的颜色进行旋转变换,于是就有:

                5.jpg

  列表为:
    1 2 3 4
    a b c d
    d a b c
    c d a b
    b c d a
  当然,此处我又用了4种颜色,如果只用RB,则对于一种染色方案RRBB,会变换为:
    RRBB,BRRB,BBRR,RBBR
  是不是不太直观了?呵呵

  再次是对称变换。
  对于正方形而言,对称变换也有4个,记为:τ1,τ2,τ3,τ4,τ读作:tao,不是字母t、T。这又是什么意思?如下图:

               6.jpg

  此时,列表为:
      1 2 3 4
    τ1 a d c b
    τ2 b a d c
    τ3 c b a d
    τ4 d c b a
  对称轴有4条,其中2条是对应顶点连线,2条是对边中点连线。
  如果颜色只用RB,则对于一种染色方案RRBB,会变换为:
    RBBR,RRBB,BRRB,BBRR

  最后是考察上述8个变换(与“置换”的说法个人感觉在于运算规则和表达符号上的不同,对于此问题二者实质相同)的集合:
    G={L,ρ4,ρ4^2,ρ4^3,τ1,τ2,τ3,τ4}
  很幸运,这个集合作成一个群,他果然是S4的真子群!!!这是因为:
  1.对圈运算封闭。其间任意个置换迭加后的结果仍是这8个置换之一,且有一些有趣的现象:
    ρορ→ρ,τοτ→ρ,所有ροτ1→τ的全体
  什么意思?即:两个旋转变换效果的迭加还是一个旋转变换;两个对称变换效果的迭加也是一个旋转变换;先进行对称变换τ1,再逐一进行所有旋转变化,可以得到全体对称变换(但请注意标号并不是简单对应的,比如:τ3=ρ4^0οτ1)。这说明G可以进一步简化:
    G={ρ4^0,ρ4^1,ρ4^2,ρ4^3, ρ4^0οτ1,ρ4^2οτ1, ρ4^1οτ1, ρ4^3οτ1}
  即:
    G={L,ρ4,ρ4^2,ρ4^3,τ1, ρ4^2οτ1,ρ4οτ1, ρ4^3οτ1}
  这说明,集合G中的8个变换中有3个变换是核心变换:恒等变换L、旋转变换ρ4、对称变换τ1。这个特点在我做自定义函数小工具时起到了莫大的帮助。
  2.存在单位元即恒等变换L。
  3.每个变换都有逆元。值得注意的是:一个对称变换的逆元是其本身。可以直观想到,同一对称变换施加两次,又回到了初始的状态。用符号表示为:
    (ρ4^i)^-1=ρ4^(4-i),i取值:0、1、2、3
    (τi)^-1=τi,i取值:1、2、3、4

  这个群G就是一个不平凡的群,原因与计算并寻找正方形顶点的不同染色方案的问题有关。现在,可以给出一个概括结论(这也是我的折腾心得):
  如果对于一个染色方案,在经历上述8种变换后都能保持不变或稳定,我们将其计数为1,从计算的角度出发,计数为:8/8。这样的方案很容易找,有两种:RRRR,BBBB(联系实际很简单,颜色都一样嘛,自然是很稳定,嘻嘻)。
  如果一个染色方案经历以上8种变换后,不变(稳定)的有i种,我们将其计数为i/8。
  对全染色方案进行上述计数的求和即为不同染色方案数。至于具体方案从我做的VBA附件结论中可以看出,需在每一种不同方案的8个不同表示中随便选一种作为代表即可,大抵为群论中的“互异代表”是也。



TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-17 22:29 | 显示全部楼层
本帖最后由 aoe1981 于 2018-1-20 08:44 编辑

  五、如何做出一个完整的示例
  对于从RB两色中对正方形的4个顶点进行染色的例子,是够简单的一个例子,然而要完整展示应用burnside定理(伯恩赛德定理)的过程和结果,依然是很不容易的。你需要对2^4=16个全染色方案分别施加上述8个变换,共操作128次,并进一步找出:f*c=c的所有变换做成一个集合G(c),或记为c(f),其个数为:|G(c)|或|c(f)|。数学家已证明,这个G(c)也作成一个群,至于有何特殊用途,我目前没有体察到。再将所有|c(f)|求和,除以置换群G的元素个数:|G|,即为不同染色方案数,在置换群G下的。
  又一重要的尚属猜测性的心得:为何一定要将置换作成群?我感觉,是为了保证置换应用的完备性,这样才有正确的结果。否则,从以上8个置换中任选7个、6个……,则结果便是错的。
  对于以上置换群G上的所有|c(f)|,具体为:
    |c(L)|,|c(ρ4)|,|c(ρ4^2)|,|c(ρ4^3)|,
    |c(τ1)|,|c(τ2)|,|c(τ3)|,|c(τ4)|
  也即:
          |c(L)|,|c(ρ4)|,|c(ρ4^2)|,|c(ρ4^3)|,
          |c(τ1)|,|c(ρ4^2οτ1)|,|c(ρ4οτ1)|,|c(ρ4^3οτ1)|
  现在,大家就可以理解我附件中的符号了。
  足见,手工蛮力完成上述简单的示例,也需要极大的毅力。明智地选择是利用计算机。


  六、基于以上困难的我的VBA小工具
  一共有3个。
  1.生成全染色方案,任意n个顶点,c种颜色;
  2.针对着色方案字符串表达式的旋转变换自定义函数;
  3.针对着色方案字符串表达式的对称变换自定义函数。
  为什么要加“针对着色方案字符串表达式”的定语?是因为,我以前也做过旋转与对称变换的自定义函数,见下帖:

  正式版发布:强大的旋转变换与对称变换自定义函数
  (出处: ExcelHome技术论坛)

  上帖中的旋转、对称自定义函数是基于直角坐标系下的数对的,是不能套用在本帖问题中的。


  本帖中的旋转自定义函数期望实现以下效果:
    abcd→dabc、cdab、bcda,即字符形式地从左向右滚动,当然,也可以从右向左滚动。
  自定义函数格式为:
  旋转变换(目标染色方案,连接符,旋转单位角的倍数)
  应用示例:
    =XZ($A2,",",COLUMN()-2)
  第一参数为染色方案的字符串表达式,如:R,R,B,B,需要用分隔符连接;
  第二参数为指定连接符,省略或不存在时,默认为英文状态下的空格;
  第三参数为负整数、0、正整数,表示滚动的位数,也即旋转的单位角度2π/n的倍数,正整数时向右滚动,代表顺时针旋转;负整数时向左滚动,代表逆时针旋转;0时不变,代表恒等置换。


  本帖中的对称自定义函数期望实现以下效果:
  偶数个顶点:abcd→adcb
  奇数个顶点:abcde→aedcb
  以上变换只针对τ1,一是由于τ1的基础重要性,与旋转变换ρ可以生成所有对称变换τ的全体;一是由于τ变换在染色方案字符串表达式上变化规律的多样性,没人情愿一个τ做一个自定义函数,而且τ的个数在正n边形的情况下有n个!!!
  自定义函数格式为:
  对称变换(目标染色方案,连接符)
  应用示例:
  先进行τ1变换:=DC(A2,",")
  再进行ρ变换:=XZ($B2,",",COLUMN()-3)
  也就是说:此时要对两个变换做一个圈运算,即:ροτ1。
  第一参数为染色方案的字符串表达式,如:R,R,B,B,需要用分隔符连接;
  第二参数为指定连接符,省略或不存在时,默认为英文状态下的空格。

  剩下的是比较寻找f*c=c,用到的公式是:
    =IF(C2=$A2,C2,"")
  以及其余的求和、平均计算。



  好了,完毕。有兴趣的可以参照附件演示,具体对照。此帖写完,我感觉要醉了……



aoe1981
2018.1.17

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-17 22:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  以上内容,既是对本帖附件的说明,也是对近段学习研究的心得与感悟。上述语言皆没有照抄照搬任何一本《图论》或《近世代数》,完全是自我组织。唯其如此,方能促进理解地加深。
  这是我的极大的收获与满足。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-18 10:25 | 显示全部楼层
  用1楼附件验证了一下用RB两色对正五边形顶点着色,共有8种不同方案。附件如下:
   用RB两色对正五边形顶点染色.zip (37.3 KB, 下载次数: 4)

  结论图如下:
   52.jpg

  但是这8种不同方案,每种方案相同的染色方案在表达数量上共有10个,与置换群G的元素个数同样多。如果在这8类互异族中找出一组代表表达具体的着色方案,仍然很烦,容后再想办法。用RB两色对正方形顶点着色的结论图中,我是手工用不同填充色表示的。

TA的精华主题

TA的得分主题

发表于 2018-1-18 11:09 | 显示全部楼层
不明觉厉,火钳刘明。楼主是个乐于分享的好学的好同志 大拇指.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-18 13:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  再发一个利用我的附件做的变式练习:
  也给正五边形的顶点染色,但是现在限定五个顶点中3个R、2个B,问有多少种不同的染色方案?

  结论图如下:
   532.jpg

  附件如下:
   限定3R2B对正五边形顶点染色.zip (36.69 KB, 下载次数: 5)

  结论是共有两种不同的染色方案。其实,用直观想像判断的方法也可以写出来,就是:RRRBB,RRBRB。

  该变式对附件应用的影响就是:现在不能使用全染色方案进行置换检验了,因为在染色方案中必须要有3个R,2个B,这个很容易筛选,从全染色方案共32个当中共筛出符合条件的染色方案:10种,其实就是combin(5,3)。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-1-18 13:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Moneky 发表于 2018-1-18 11:09
不明觉厉,火钳刘明。楼主是个乐于分享的好学的好同志 大拇指.jpg

  谢谢您的赞!!!“火钳刘明”特意百度了一下才明白,真是有点out了……感谢感谢,惭愧惭愧……借您的光!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-27 21:16 , Processed in 0.054869 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表