搜索
bottom↓
回复: 77

深入研究无机酸版怀表布线 电气网络,图论与一笔画

[复制链接]

出0入309汤圆

发表于 2011-6-25 00:03:14 | 显示全部楼层 |阅读模式
之所以对这个问题做深入的研究是因为我也遇到了类似的问题,最后发现经过转化,与怀表的问题是一致的,花了不少时间进行分析,此处拿来分享。也算是对“怀表新版PCB出炉,12线6圈版(PCB23),同时向各位推荐一位数学高手 Matrix67 (77楼新增部分理论介绍)”一点粗浅的理论补完。
首先说说我遇到的问题:

(原文件名:switch_string.GIF)
有这样一串按键,为了读取它们的状态,当然希望IO越少越好。如果只是独立的按键,那么就是简单的C(2,n)的关系。但是由于按键首尾相连,关系就变得复杂:
三个IO:

(原文件名:button3.GIF)  
确实是C(2,3)=3
四个IO:

(原文件名:IO4.GIF)  
相比C(2,4)=6,这里只有5个按键。这不是由于我水平差,至少我用perl穷举了一下,不存在6键的解。
以4IO为例,4个IO就是指电路存在4个网络。按键按下就短接了两个不同的网络。如果对网络染色并编号:

(原文件名:IO4_color.png)  
这时问题与无机酸当时的
1、相邻的格子颜色不同
2、每种颜色组合(两个相邻的格子)只能出现一次
已经很类似了。区别仅在于无机酸led是环形的,而按键是链状的。其实区别只在于一个是环路而另一个是欧拉路径的关系(后文将解释)。


接下来换个话题:
现在俄国的加里宁格勤(Kaliningrad)市,从前为普鲁士的康尼斯堡(Königsberg),这个城市建立在普雷格尔河(Pregel)岸上,被河水分成四个部分,之间有七座桥将它们连起来,如下图。

(原文件名:bridge7.jpg)  
当时康尼斯堡的居民提出了一个有趣的问题:是否可以设计一次旅行,行经七座桥,而且每一座桥都恰恰好只走一次?解决这个问题便成了他们茶余饭后的消遣之一。然而,他们试了各种路线,但每一次都失败了。
早在十八世纪,大数学家欧拉(Leonhard Paul Euler)就已经解决了七桥问题。非但如此,他同时注意到这个问题可以利用数学上的图来描述,他以点代表城中被河水分隔的四个区域,并以边代表连接各个区域的桥,如下图:

(原文件名:Konigsburg_graph.png)
七桥问题就变成以下的问题:是否存在一条路径,能够经过每一条边,且每条边只能经过一次?
如果这条路径存在,那么成为欧拉路径。如果这条路径是一条闭合环路,就被称为欧拉环路。
简单来说,端点的秩就是交会在这个点的边的个数。如果秩为奇数,那么这个点必定是路径的起点或终点。返回去看康尼斯堡七桥问题,它的解需要至少两条路径,因为它有四个奇秩点。类似的,如果有两个奇秩点,那么存在欧拉路径。如果全部点都是偶秩点,存在欧拉环路。


这跟电路有什么关系?
如果这样呢?

(原文件名:switch_euler.GIF)  
四个节点的情况下,一笔最多能画出5条线,对应五个按键,比4个节点的极限连接6条要少。由于这不是回路,所以只能应用于链形连接,环形连接还要再少一点。

至此,电路的电气连接就被转化为一笔画问题。如果是奇数个IO口,由于所以端点都是偶秩点,能驱动的按键就是组合数C(2,n),而偶数个IO口,由于每个端点都是奇秩点,要形成环路,需要去掉n/2条边,而要形成路径只要去掉(n/2)-1条边。

到了这一步,如果要简单的获得一个网络表,只要在纸上画一个正n边形,然后把内部所有点相连接。如果n是偶数,把最外边的n/2条边去除。然后对节点和边标号,用笔一笔画出。节点对于网络,边对应按键。写下路径,网表就被生成了。
例如六网络,输入:
a = EdgeDelete[CompleteGraph[6], {1 \[UndirectedEdge] 2, 3 \[UndirectedEdge] 4, 5 \[UndirectedEdge] 6}]
FindEulerianCycle[a]
Dimensions[%]

(原文件名:euleriancycle_6.PNG)  
而12节点网络,解为60个,正好是无机酸led的极限数量。

(原文件名:euleriancycle_12.PNG)  
根据欧拉回路,就可以标出led或者是按键引脚的网络号。可以开始布线。

不过还没有结束,尽管下一步我还没想出来。。。
欧拉回路的解远远不止一个。而且不是每个都能将线的空间压缩到最小。至于如何选取一个适当的欧拉回路使两个网络能共享一行的空间,以及如何能变幻出那么多花样,只能寄希望于无机酸大侠现身说法了。请大家期待。

出0入0汤圆

发表于 2011-6-25 12:52:32 | 显示全部楼层
高级,厉害,服了!!

出0入0汤圆

发表于 2011-6-25 13:06:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-25 13:22:18 | 显示全部楼层
77楼?怎么个状况。原来这句话是从原帖子里引用过来的!

Matrix67 记得是那个北大中文系的数学高手吧。

楼主也是高手啊,已经好久没见无机酸露面了

出0入0汤圆

发表于 2011-6-25 13:56:30 | 显示全部楼层
matrix67现在在果壳混呢~佩服的很,文科生的数学让搞了这么多年OI的我情何以堪……
图论已经好久没碰了,我先看看楼主的问题,晚些回复~

出0入0汤圆

发表于 2011-6-25 14:21:39 | 显示全部楼层
看了一下楼主的问题,"欧拉回路的解远远不止一个。而且不是每个都能将线的空间压缩到最小。"是要求指定节点数的无向等权图的最短欧拉路径吗?应该也不是,没太看懂。“至于如何选取一个适当的欧拉回路使两个网络能共享一行的空间”没有理解是何含义。楼主能否把问题抽象一下,不是很明白你的需求。

出0入309汤圆

 楼主| 发表于 2011-6-25 14:26:16 | 显示全部楼层
从无机酸贴转来两张图。

(Ô­ÎļþÃû:ourdev_498793.PNG)

(Ô­ÎļþÃû:ourdev_498794.PNG)
这两幅图是两个解。但是明显,第一张不具压缩的可能,而第二张可以压缩成:

(原文件名:ourdev_498795.PNG)

出0入309汤圆

 楼主| 发表于 2011-6-25 14:28:47 | 显示全部楼层
在无机酸的怀表上,一行代表背面的一个圈。而这个圈可以截断为两个网络所用。否则,就需要较多的圈数来布线。

出0入0汤圆

发表于 2011-6-25 16:01:26 | 显示全部楼层
哦,明白了。
给定了顶点数后生成最大欧拉回路只有一个,并不存在多解的问题,假如用邻接矩阵来保存的话,所有解都是其中一邻接矩阵的变换(第i行与第j行交换,第i列与第j列交换)。
那么在无机酸的图中,不同的编号方式共有  12
                                      A 12 = 479001600种,这个空间是很大的。要全部搜索的话实在是太笨了。
我们考虑欧拉回路的条件:图中所有顶点的边均为偶数条。对一个完全图,对其进行最少的边的删除操作后,使得图满足欧拉回路条件则得到最大欧拉回路。若顶点数n为奇数,则完全图中所有顶点的边均为n-1为偶数,此时完全图即为欧拉回路。若顶点数n为偶数,则所有顶点的边均为n-1为奇数,对每个顶点删除一条边即可得到欧拉回路,又由图的对称性得到只需删除n/2条边即可得到最大欧拉回路,而对不同边的选择即构成解的空间,即可由对完全无向图的邻接矩阵的简单操作得到所有解。
接下来分析此问题中pcb中圈可合并的条件。
(未完待续)

出0入0汤圆

发表于 2011-6-25 16:08:27 | 显示全部楼层
这些东西都还给老师了。。。

出0入309汤圆

 楼主| 发表于 2011-6-25 16:12:18 | 显示全部楼层
检查了一下无机酸的图纸,发现他的网络特别之处在于去除了所有的对顶角线

(原文件名:h2feo4.PNG)

出0入0汤圆

发表于 2011-6-25 17:37:39 | 显示全部楼层
为了找出这个可合并条件,我们用matlab来构建这个欧拉图。由于上面提到的欧拉回路的等效性,为了省事我们用无机酸在帖子中给出的数字来构建邻接矩阵。
origData = [10, 6, 11, 5, 8, 6, 9, 5, 12, 6, 7, 12, 8, 9, 7, 10, 11, 9, 12, 10, 8, 11, 7, 5, 3, 1, 10, 2, 11, 1, 8, 2, 9, 1, 4, 2, 5, 1, 6, 2, 7, 1, 12, 2, 3, 10, 4, 11, 3, 8, 4, 9, 3, 6, 4, 7, 3, 12, 4, 5];
origDataNum = 60;
graphNodeNum = 12;
graphMat = [zeros(graphNodeNum)];

for i = 1:origDataNum
    if i == 1
        foreTemp = origData(origDataNum);
    else
        foreTemp = origData(i -1);
    end
    if i == origDataNum
        backTemp = origData(1);
    else
        backTemp = origData(i + 1);
    end
    graphMat(origData(i),foreTemp) = 1;
    graphMat(foreTemp,origData(i)) = 1;
    graphMat(origData(i),backTemp) = 1;
    graphMat(backTemp,origData(i)) = 1;
end

得到邻接矩阵如下

(原文件名:捕获1.PNG)

得到邻接矩阵后我们再来重构建出回路历经顶点,即无机酸贴中的数据类型
采用的算法为 从顶点1开始,选择与当前顶点邻接的最后一条没有被历经过的边为下一条遍历边
graphMatTemp = graphMat;
for i = 1:origDataNum

    if i == 1
        rebuildData(i) = 1;
    end
    tempRow = rebuildData(i);
    for j = 1:graphNodeNum
        tempLine = graphNodeNum - j + 1;
        if tempLine > graphNodeNum
            tempLine = tempLine - graphNodeNum;
        end
        if graphMatTemp(tempLine,tempRow) == 0
        else
            if i == origDataNum
                temp = 1;
            else
                temp = i + 1;
            end
            rebuildData(temp) = tempLine;
            graphMatTemp(tempLine,tempRow) = 0;
            graphMatTemp(tempRow,tempLine) = 0;
            break;
        end
    end
end
重构出遍历路径为
1        12        10        11        9        12        8        11        7        12        6        11        5        12        4        11        3        12        2        11        1        10        8        9        7        10        6        9        5        10        4        9        3        10        2        9        1        8        6        7        5        8        4        7        3        8        2        7        1        6        4        5        3        6        2        5        1        4        2        3

定义每一条pcb线条的长度为:包含该顶点的最短的循环线段长度
(未完待续)

出0入309汤圆

 楼主| 发表于 2011-6-25 19:29:15 | 显示全部楼层
我另外说说我的收获吧,没有理论,纯观察:
无机酸的图是12对称的。每一节像这样:

(Ô­ÎļþÃû:h2feo4_5.png)
这种对称节,包含长度为12345的边各一段,重复12次正好能形成欧拉网络。但并不总能形成6线的结构。比如:

(原文件名:h2feo4_5_try.png)

(原文件名:try1.PNG)
显然不靠谱。。。
但是假如限制条件,即这一节限制在图的半边,且终点与起点差1,解很有限:
5,-2,3,-4,-1, 下图
5,1,-4,2,-3, 无机酸图
4,-2,3,1,-5,
4,-2,1,3,-5,
4,1,-2,3,-5,
3,1,-2,4,-5,

(原文件名:try2.PNG)
就可以压缩

但是没有理论支撑,总觉得薄弱。。。

出0入0汤圆

发表于 2011-6-25 19:46:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-25 19:53:23 | 显示全部楼层
学习!

出0入0汤圆

发表于 2011-6-25 20:06:29 | 显示全部楼层
学习了,谢谢

出0入0汤圆

发表于 2011-6-25 20:18:03 | 显示全部楼层
晕,膜拜高手!

出0入0汤圆

发表于 2011-6-25 20:29:43 | 显示全部楼层
for i = 1:graphNodeNum
    k = 0;
    for j = 1:origDataNum
        if rebuildData(j) == i
            k = k+1;
            nodePosition(i,k) = j;
        end
    end
end
for i = 1:graphNodeNum
    for j = 1:fix((graphNodeNum-1)/2)
        if j == fix((graphNodeNum-1)/2);
            distMat(i,j) = origDataNum - nodePosition(i,j)  + nodePosition(i,1);
        else
            distMat(i,j) = nodePosition(i,j+1) - nodePosition(i,j);
        end
    end
end

distMatTemp = distMat;

for i = 1:graphNodeNum
    maxTemp = 0;
    for j = 1:fix((graphNodeNum-1)/2)
        if maxTemp < distMatTemp(i,j)
            maxTemp = distMatTemp(i,j);
            jTemp = j;
        end
    end
    distMatTemp(i,jTemp) = 0;
    lengthMat = sum(distMatTemp');
end

以上求出了每条pcb的长度及起始位置


(原文件名:捕获2.PNG)


(原文件名:捕获3.PNG)

(未完待续)

复习之余断断续续做这个问题,不一定啥时候能做出来
呃,图论忘得实在是差不多了,想了半个小时没想起来欧拉图的完全遍历算法=.=!!!上面那个遍历方法其实不太对,有可能陷入死胡同。。。
明天图书馆借本图论回来继续做

出0入309汤圆

 楼主| 发表于 2011-6-25 22:26:31 | 显示全部楼层
套用直接贴子的方法,用比较简单的5IO为例,可压为3条线。

(&#212;&#173;&#206;&#196;&#188;&#254;&#195;&#251;:try_5IO.PNG)


(&#212;&#173;&#206;&#196;&#188;&#254;&#195;&#251;:try_5IO_3line.PNG)

出0入309汤圆

 楼主| 发表于 2011-6-25 22:35:20 | 显示全部楼层
8IO被卡住了。。。 由于1 2 3 做加减运算无法算出奇数,连欧拉回路都无法形成。。。

出0入0汤圆

发表于 2011-6-26 13:03:14 | 显示全部楼层
能够合并的条件就是17楼中矩阵nodePosition某一行点起始位置包含在除此行外某一行的两个点之间,合并后作为一个新行存在进行下一步判定。但是依然没有找到一条判定准则能进行剪枝,似乎一个比较大规模的搜索是不可避免的了。
利用随机fleury算法求出一条随机欧拉回路,对此遍历数组按照如上规则判定并按最少剩余行适应度选择保存,即可得到最优合并解。暂时没有优化算法,再研究研究。

出0入0汤圆

发表于 2011-6-26 13:45:40 | 显示全部楼层
fleury算法的思想是,选定一个顶点作为起始点,从每一个当前点中选择一条路径指向下一个点,选择路径必须满足要求:1.此路径从未走过 2.此路径如非无其他路径可选,不可为当前(包括此次选择)已生成路径的桥bridge(即如果除去此条路径,当前已遍历过的点不能连通)。
晚上回来写个程序把所有解贴出来。

本想估计一下这个算法的规模,没想到无向图的欧拉回路计数依然是个悬案~以下摘自wikipedia


Counting the number of Eulerian circuits on undirected graphs is much more difficult. This problem is known to be #P-complete.[7] In a positive direction, a Markov chain Monte Carlo approach, via the Kotzig transformations (introduced by Anton Kotzig in 1968) is believed to give a sharp approximation for the number of Eulerian circuits in a graph.[8]

我去查了上面的注释8给出的论文,给出的近似方法也只是2n+1点完全图的欧拉回路计数,偶数点最大欧拉图回路计数没有搜到任何文献。
以下表格摘自此文献,为3到21点奇数点完全图的欧拉回路数量,这个数有点小大啊……⊙﹏⊙b汗


(原文件名:捕获.PNG)

出0入309汤圆

 楼主| 发表于 2011-6-26 14:32:20 | 显示全部楼层
今天尝试了链状连接开关的布线。区别在于图的左右两边界不是相连的。这样,之前的对称式生成法一定是无效的。
我用mathematica列举出5个5点图的欧拉回路,只有最后一个,能够压缩到3线:

(&#212;&#173;&#206;&#196;&#188;&#254;&#195;&#251;:try_5IO_string.PNG)


(&#212;&#173;&#206;&#196;&#188;&#254;&#195;&#251;:try_5IO_3line_string.PNG)

出0入0汤圆

发表于 2011-6-26 15:19:49 | 显示全部楼层
厉害。

出0入309汤圆

 楼主| 发表于 2011-6-26 15:35:17 | 显示全部楼层
回复【21楼】eggcar  八号机
-----------------------------------------------------------------------

嗯。。你的那幅图是来自“ASYMPTOTIC ENUMERATION OF EULERIAN CIRCUITS IN THE COMPLETE GRAPH”吗?
en是表示完全图的欧拉回路数量么?

出0入0汤圆

发表于 2011-6-26 16:00:40 | 显示全部楼层
是的。en是真实的欧拉回路数量,后面是理论的误差项。搜索空间太大了,决定随机搜索。无机酸可能是在对称解空间中搜的,但是没有理论表明对称性与优化度有关…晚上回来试试吧。另外要对matlab吐个槽,这图论工具箱约等于无…

出0入0汤圆

发表于 2011-6-26 23:48:14 | 显示全部楼层
研究发现fleury算法虽然可以生成欧拉回路,但不能生成所有欧拉回路。为了避免丢掉解,只好随机生成回路并剪枝了~算法效率影响不是很大,虽然增大了搜索空间但是省下了连通性判定。

今天晚上宿舍电表里没电费了,程序没写完,明天吧……

出0入309汤圆

 楼主| 发表于 2011-6-26 23:50:42 | 显示全部楼层
穷举了一下5IO的264条欧拉回路。(再大的复杂度就不靠谱了)
如果使用环形连接 共有240组解。
如果使用链形连接 共有48组解。

出0入309汤圆

 楼主| 发表于 2011-6-27 01:07:06 | 显示全部楼层
穷举了一下6IO的11160条欧拉回路。(去除三条对顶角线)
如果使用环形连接 共有4860组解。
如果使用链形连接 共有480组解。

出0入0汤圆

发表于 2011-6-27 09:09:41 | 显示全部楼层
这个解的数量是指的最大合并的解的数量吗?
是去除对角线还是去除临边对结果没有影响,因为图的定义就是跟顶点的位置无关只跟顶点与边的关系有关,不管如何得到这个欧拉图都是等价的

出0入8汤圆

发表于 2011-6-27 10:17:38 | 显示全部楼层
学习。。。

出0入309汤圆

 楼主| 发表于 2011-6-27 10:44:11 | 显示全部楼层
回复【29楼】eggcar  八号机
-----------------------------------------------------------------------

生成方法:对于一个图,它的欧拉回路长度是确定的。首先固定这个序列的最后一个数。这样可以减小复杂度,并消除所有中心对称的欧拉回路(指两个回路仅仅是差一定角度,如1,2,3,4,5和2,3,4,5,1)。
以5IO为例,生成5^9个序列。之后判定它们是否第零个数大于第一个数,去除轴对称回路。再判定是否为欧拉回路,判定规则:
1、相邻的格子数字不同  
2、每种数字组合(两个相邻的格子)只能出现一次
这样能生成264个解。
然后用另外一个程序进行筛选,将其尽可能压缩,输出能压缩到3行的解数。
这种算法的复杂度对于7IO就基本无能为力了。。。
(好像5IO链状的有些问题,把一个环断开的位置是应该有多个的。。我再看看)

5IO欧拉回路生成代码(perl)ourdev_652603HN27PL.txt(文件大小:1K) (原文件名:test3_IO5.txt)

出0入309汤圆

 楼主| 发表于 2011-6-27 10:51:38 | 显示全部楼层
5IO欧拉回路生成代码的输出值(从上个程序里输出的内容,删除了不需要的字符):
点击此处下载 ourdev_652610Z8QK47.txt(文件大小:5K) (原文件名:IO5_enu.txt)

出0入0汤圆

发表于 2011-6-27 10:51:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-27 11:58:50 | 显示全部楼层
MARK,纯学习...

出0入0汤圆

发表于 2011-6-27 13:00:44 | 显示全部楼层
回复【31楼】iamseer
回复【29楼】eggcar  八号机
-----------------------------------------------------------------------
生成方法:对于一个图,它的欧拉回路长度是确定的。首先固定这个序列的最后一个数。这样可以减小复杂度,并消除所有中心对称的欧拉回路(指两个回路仅仅是差一定角度,如1,2,3,4,5和2,3,4,5,1)。
以5io为例,生成5^9个序列。之后判定它们是否第零个数大于第一个数,去除轴对称回路。再判定是否为欧拉回路,判定规则:
1、相邻的格子数字不同   
2、每种数字组合(两个相邻的格子)只能出现一次
这样能生成264个解。
然后用另外一个程序进行筛选,将其尽可能压缩,输出能压缩到3行的解数。
这种算法的复杂度对于7io就基本无能为力了。。。
(好像5io链状的有些问题,把一个环断开的位置是应该有多个......
-----------------------------------------------------------------------

不用这么麻烦,以节点1为出发点,广搜这个图,剪掉提前回到出发点的分支,就可以遍历出这264个解。
正在写压缩的程序,敬请期待结果

出0入309汤圆

 楼主| 发表于 2011-6-27 13:11:09 | 显示全部楼层
回复【35楼】eggcar  八号机
-----------------------------------------------------------------------

期待。没学过图论,正在研究什么是DFS....

出0入309汤圆

 楼主| 发表于 2011-6-28 02:07:11 | 显示全部楼层
回复【31楼】iamseer  
-----------------------------------------------------------------------

链状的结论应该没有问题.欧拉回路从任何一点断开,都能映射到这264个中的一个.所以应该没有遗漏解.

出0入309汤圆

 楼主| 发表于 2011-6-28 02:44:08 | 显示全部楼层
规律观察: 对于链状可压缩回路(仅列举一些栗子,实际是所有最优的解都符合的规律)

4134215235  3
4214315235  3
4124315235  3
2142315435  3
2132415435  3
3243125145  3  
a..a..b..b

出0入309汤圆

 楼主| 发表于 2011-6-28 03:16:27 | 显示全部楼层
对于7IO枚举欧拉回路,最暴力的枚举是10^18量级,111222...666777的排列数是10^14量级,而结果只有10^7量级。这命中率显然低了点。天亮再研究高效的搜索法。。

出0入0汤圆

发表于 2011-6-28 13:57:46 | 显示全部楼层
生成了10万条12点欧拉图的欧拉回路,竟然没有一条可压缩的路径,怀疑是压缩算法写错了,我再检查检查,昨天晚上宿舍人打三国杀太吵了,脑子不清醒

出0入0汤圆

发表于 2011-6-28 14:15:24 | 显示全部楼层
找到错误了,一处矩阵的标号写重复了导致判断进不去。。。果然工作需要安静的环境。
上课去了,跑着matlab回来看结果

出0入0汤圆

发表于 2011-6-28 15:30:59 | 显示全部楼层
高手如云.......

出0入309汤圆

 楼主| 发表于 2011-6-28 20:43:49 | 显示全部楼层
由蛮力升级到fleury 算法,随机生成回路,发现对于链状连接:
5IO 3线
7IO 5
9IO 7
11IO 9
13IO 11
15IO 13
虽然可能遗漏更优秀的解,但是可能性并不大。所以这一算法对于链状连接,可能真的没有什么意义。

出0入0汤圆

发表于 2011-6-28 22:01:51 | 显示全部楼层
花了三分钟检验了12IO的10w条随机路径,但是只能得到压缩到七线的解。六线解看来比较少,需要多跑些路径了……+到50w试试,等待中

出0入0汤圆

发表于 2011-6-28 22:03:45 | 显示全部楼层
十分好奇无机酸用什么算法解出来的?只搜对称解?好久不见无机酸了,看见了就出来冒个泡呗~~

出0入0汤圆

发表于 2011-6-28 22:08:11 | 显示全部楼层
mk

出0入309汤圆

 楼主| 发表于 2011-6-28 22:20:43 | 显示全部楼层
12IO 6线 我的解在12楼
环形还是很好算的

出0入0汤圆

发表于 2011-6-29 10:04:50 | 显示全部楼层
事实证明,这种乱撞式的随机法很难搜到最优解,昨天晚上挂机生成了1000w多条路径,最多只能搜到压缩到8线的解,而且数量其实很少,大约每3w条内有一条8线解
当然我没考虑一行有超过两个网络的情况

出0入0汤圆

发表于 2011-6-29 10:18:04 | 显示全部楼层
不懂,飘走!

出0入0汤圆

发表于 2011-6-29 10:50:35 | 显示全部楼层
回复【48楼】eggcar 八号机
事实证明,这种乱撞式的随机法很难搜到最优解,昨天晚上挂机生成了1000w多条路径,最多只能搜到压缩到8线的解,而且数量其实很少,大约每3w条内有一条8线解
当然我没考虑一行有超过两个网络的情况
-----------------------------------------------------------------------

人肉验证了一下结果,发现压缩上还是有点问题,因为有时候某一行可能与多行都可合并,但是并不是任意合并都可以产生最大压缩结果,无意间丢掉了许多解,点数少时可能体现不出来,点数多了这种解就多起来了。不过对于无机酸那种唯一合并的最优解来说没有影响。修改的话复杂度又提高了,时间复杂度已经很难接受了,考虑对算法进行优化。

出0入0汤圆

发表于 2011-6-29 22:13:20 | 显示全部楼层
今天支付宝被盗了了200块钱,实在没心情弄这个了……

出0入0汤圆

发表于 2011-6-29 23:45:45 | 显示全部楼层
牛逼

出0入309汤圆

 楼主| 发表于 2011-6-30 02:46:36 | 显示全部楼层
回复【51楼】eggcar  八号机
-----------------------------------------------------------------------

节哀...节哀.... 最后我大概认为对于链形排列的按键,应该最多压缩掉两行(没随机出反例)。意义不大,就直接生成欧拉回路了,这样在别的方向例如扫描速度和扫描程序空间上可以做更自由的优化。
刚把一个有几百个3mm孔的PCB提交给JLC,看看这几天的研究到底有没有效果。

出0入0汤圆

发表于 2011-6-30 08:10:32 | 显示全部楼层
值得深究呐

出0入0汤圆

发表于 2011-6-30 14:02:58 | 显示全部楼层
回复【53楼】iamseer
回复【51楼】eggcar  八号机
-----------------------------------------------------------------------
节哀...节哀.... 最后我大概认为对于链形排列的按键,应该最多压缩掉两行(没随机出反例)。意义不大,就直接生成欧拉回路了,这样在别的方向例如扫描速度和扫描程序空间上可以做更自由的优化。
刚把一个有几百个3mm孔的pcb提交给jlc,看看这几天的研究到底有没有效果。
-----------------------------------------------------------------------

哎,我要哀一阵子了,考试周了,暂时不再更新算法了,十六号考完试,按时回来更新~~
期待你的成果

出0入309汤圆

 楼主| 发表于 2011-7-5 15:07:33 | 显示全部楼层

(原文件名:DSC03463.JPG)
效果还行...没优化算法,但是证明理论是对的.

出0入0汤圆

发表于 2011-7-5 15:48:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-9 22:32:27 | 显示全部楼层
我出现一下
所有可行解空间很大,但为了美观和布线方便,我把搜索范围定位在12次对称的解,且不超过半边,所以解的数量很少
在火车上无聊的时候纸笔搜索的,大概三张草稿纸就出来了
只是粗略推算了下哪些类型的解不可能,剩下的纯粹靠暴力搜索得到的

最近比较忙,较少出现,下个月可能回来

出0入0汤圆

发表于 2011-7-9 22:59:43 | 显示全部楼层
回复【18楼】iamseer
-----------------------------------------------------------------------

最开始,压缩仅限把若干个环打断
后来改成渐开线之后,其实任何12次旋转对称的解,都可以有效的压缩

出0入309汤圆

 楼主| 发表于 2011-7-9 23:05:01 | 显示全部楼层
回复【59楼】h2feo4  无机酸
-----------------------------------------------------------------------

渐开线,这个我还真没研究,有空看看.
现在随机搜索的结果是链形结构(像上图那把尺),最多压掉两行(搜索了几百万个欧拉回路,以及他们从任意一点断开形成的路径)
这种方式对于组合键的支持还蛮差的.我的序列只保证了临键按下正常识别不冲突.毕竟这种完全图想让按键组合不形成回路太难了.

出0入0汤圆

发表于 2011-7-9 23:11:13 | 显示全部楼层
回复【60楼】iamseer
-----------------------------------------------------------------------

想支持组合键的话,每个键都串二极管吧,而且二极管的压降得是1/3VCC,这样才能识别任意组合键

出0入0汤圆

发表于 2011-7-9 23:13:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-9 23:13:58 | 显示全部楼层
回复【60楼】iamseer
-----------------------------------------------------------------------

关于渐开线,举例吧
18楼的图可以压缩为绿框面积

(原文件名:ourdev_652377T1GBCI.jpg)

出0入309汤圆

 楼主| 发表于 2011-7-9 23:20:20 | 显示全部楼层
回复【63楼】h2feo4  无机酸
-----------------------------------------------------------------------

只使用二极管就能实现任意按键不冲突?这我倒没想过.虽然在这个应用意义不大,但在别的地方用用还是很有意思的.
可否举个实例?简单介绍即可.

delete("18楼的图可以压缩面积为绿框"这句话我没有看懂.可否再麻烦复述一下.)   不好意思刚看到图

出0入0汤圆

发表于 2011-7-9 23:20:49 | 显示全部楼层
有点意思

出0入309汤圆

 楼主| 发表于 2011-7-9 23:35:53 | 显示全部楼层
回复【63楼】h2feo4  无机酸
回复【60楼】iamseer
-----------------------------------------------------------------------

关于渐开线,举例吧
18楼的图可以压缩为绿框面积

(原文件名:ourdev_652377t1gbci.jpg)

-----------------------------------------------------------------------

仔细看了看,发现您把第五行左边的两个格子移到了右边再操作.但是我想想发现这似乎不能实现(详见56楼结构).

出0入0汤圆

发表于 2011-7-9 23:39:10 | 显示全部楼层
回复【66楼】iamseer
-----------------------------------------------------------------------

恩我这个只有环形条件下才能实现

出0入309汤圆

 楼主| 发表于 2011-7-9 23:44:41 | 显示全部楼层
回复【67楼】h2feo4  无机酸
-----------------------------------------------------------------------

另外还有一事请教:
在8IO的情况下,最大欧拉回路有1,2,3长度线各8条。
可是 1,2,3无论如何加减运算得到的结果都是偶数,不能与8互质。
这样一来,我猜想应该不能形成对称的解。这种情况下是不是以上讨论的方法全部失效?

出0入309汤圆

 楼主| 发表于 2011-7-10 00:30:36 | 显示全部楼层
回复【61楼】h2feo4  无机酸
回复【60楼】iamseer
-----------------------------------------------------------------------

想支持组合键的话,每个键都串二极管吧,而且二极管的压降得是1/3vcc,这样才能识别任意组合键
-----------------------------------------------------------------------
这样?是不是说:1/3VCC的意义在于如果电流流经两个按键,电压将低于.5VCC而不识别?

(&#212;&#173;&#206;&#196;&#188;&#254;&#195;&#251;:directional_diode.PNG)

出0入0汤圆

发表于 2011-7-10 19:42:49 | 显示全部楼层
回复【69楼】iamseer
-----------------------------------------------------------------------
这样?是不是说:1/3vcc的意义在于如果电流流经两个按键,电压将低于.5vcc而不识别?


对的,就是这个阴谋
另外,每条边可以装两个开关,分别串相反方向的二极管

出0入0汤圆

发表于 2011-10-8 09:53:26 | 显示全部楼层
mark 有空 在看

出0入0汤圆

发表于 2011-10-8 23:01:56 | 显示全部楼层
好久没看这个帖子了,无机酸出现了啊……忙着考研没空再做这个了,以后再回来完善算法。现在的算法适合分布式计算- -#搜索空间巨大……

出0入0汤圆

发表于 2011-10-9 00:34:34 | 显示全部楼层
码住。

出0入0汤圆

发表于 2011-10-9 08:32:42 | 显示全部楼层
顶礼膜拜牛人!

出0入0汤圆

发表于 2011-10-9 09:10:58 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-6-4 23:11:36 | 显示全部楼层
这个世界太疯狂了!

出0入0汤圆

发表于 2013-12-21 21:03:39 | 显示全部楼层
无聊来挖坟    现在比以前多看懂了一点
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-3 03:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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