异星工厂吧 关注:62,278贴子:398,866

【电路展示】最大值筛选模块

只看楼主收藏回复

昨天晚上看到的那个帖子,就做了一个
本来想着有时间慢慢说,结果各种原因(停电、抽贴)并不想多说了


IP属地:重庆1楼2022-04-20 13:56回复
    先丢蓝图
    https://去pan.baidu.com/s去/1OKi2U去Ve1d2xV9去gMjauQxZw
    qaec


    IP属地:重庆2楼2022-04-20 13:57
    收起回复
      2025-07-17 05:00:40
      广告
      大概思路其实和他们差不多,就是取平均值,然后不停的进行筛选。
      不同的是我这个电路不要求脉冲信号
      因为我个人觉得脉冲信号这玩意不稳定,容易出错


      IP属地:重庆3楼2022-04-20 13:58
      回复
        在信号箱旁边放置一个自增循环电路,把信号接到常量箱上,模拟信号不停变动,看看会不会对输出造成影响


        4楼2022-04-20 14:18
        收起回复
          先说一下原理吧
          假设我们有4个信号a,b,c,d
          先是取信号的平均值Average=1/4(a+b+c+d)
          考虑游戏的运算器不能保留小数,当运算器有小数的时候会向下取整数,所以运算器实际输出的是整数平均值int(Average)<=Average
          注意:这一点很重要,后续不对它进行处理会出问题的。
          举例:4个信号4,5,15,16
          第一次取平均值int(10)=10
          筛选掉4和5,留下15和16
          第二次取平均值int(15.5)=15,此时判断器设置的是≥Average,那么这个装置就没办法进一步筛选了,有人可能说我乘上2再比较就完事,但是这是行不通的,因为没人知道这一轮剩下几个数据,如果是3个就不行了
          比如16,16,17的平均值int(47/3)=16,这个时候乘以2是完全不行的
          当然,有人能想出很多点子去处理掉这个问题,但是这些点子在游戏中估计也没几个有办法落地。这不是一个点的问题,是一整个系统的问题,头痛医头脚痛医脚是行不通的
          电路图如下:




          IP属地:重庆5楼2022-04-20 14:19
          回复
            忘了发案例的求平均数模块了


            IP属地:重庆6楼2022-04-20 14:25
            回复
              接着进行比较,这一步咋说呢,因人而异吧,不同人的选择造就了不同的后续处理思路
              这一块的比较我是选择的任一信号*>=Average,输出任一信号*(如果是最小值那就≤)
              我选择≥的原因是,电路系统的随机和数据量大是无处不在的,可能存在4个/100个数值一样的信号,那么对应的平均值也和它们一样
              这个时候如果>Average是不会输出值的,所以我这个选择了>=Average


              IP属地:重庆7楼2022-04-20 14:32
              回复
                可以看到上面截图在输出信号的同时也把平均值Average输出了,所以这一步就是消除多余的Average
                就是将A*-1相抵消
                具体看图


                IP属地:重庆8楼2022-04-20 14:36
                回复
                  2025-07-17 04:54:40
                  广告
                  好了,到此一个单元做完了,我们只需要进行简单的向后复制最多10个单元,便可以将所有的可能性都囊括进去
                  毫无疑问,这个结构是最稳健的,也是最好的解决办法,除了占地面积奇大无比
                  所有下一步我们就需要牺牲这个结构的稳健性来消除占地面积巨大这一个弊端


                  IP属地:重庆9楼2022-04-20 14:41
                  回复
                    循环结构
                    消除相同模块最有效的方式就是循环,让它在一个模块里进行多次循环,总能跑出最优解
                    但是循环模块有一个弊端就是,循环需要时间,模块只有一个
                    在循环的过程中,如果有新的信号进来,原有的循环还没有出结果,那信号岂不是乱套了,容易出问题
                    我个人觉得,循环结构在游戏里面还是比较难实现
                    所以现有的解决办法就是在信号输入端设置一个开关,在运行的时候不让信号进来,运行完了再打开
                    这或许就是很多人将连续信号转变成脉冲信号的原因
                    我的想法有些不一样,因为我的假定条件和他们不相同
                    他们的假定条件可能是时时刻刻信号都会发生改变,我认为信号总会有稳定的一个时间段
                    正是因为这个假定条件,我抛弃脉冲信号这个想法
                    既然总有稳定的时间段,那么就有一段稳定的输入时间,只要我们在稳定的输入时间内求解就行
                    波动的时间内,信号总是变化无常的,就是获得了最大值下一刻就变了,那么获得它的意义何在,我觉得没有必要嘛
                    所以我这一部分的大致思路就是,信号输入后,求得第一次的结果,然后根据结果情况关闭信号输入,形成自循环结构,知道最后输出的信号稳定下来了,那么稳定的信号就是最大值


                    IP属地:重庆10楼2022-04-20 14:52
                    回复
                      咋说呢,总感觉自己说的有点不大对劲的样子
                      不管了,我这一部分的核心来了,绝对要惊呆你们
                      这一部分的变动只有一个,把最后面两个运算器挪到最前头,就可以实现循环结构
                      先上图


                      IP属地:重庆11楼2022-04-20 15:08
                      回复
                        为什么这样挪动就可以实现自循环结构呢
                        先回顾这两个运算器是干嘛的
                        判断器的设置是任一*>=Average,输出任一*
                        计算器是用于清除信号A(Average),输出一个-A
                        开始工作流程:
                        0t:信号4 5 15 16发出,同时到达第一排的判断器和计算器
                        1t:此时信号A=0,判断器,所有信号都≥0,全部输出4 5 15 16;运算器,A*-1=0
                        此时所有信号均到达第二排判断器
                        2t:第二排运算器是求信号的个数(Number)和各个信号的加和(Summary),所以N=4,S=40
                        此时所有信号均到达第三排计算器
                        3t:求取平均值Average,所以信号A=int(S/N)=int(40/4)=10
                        此时信号A传送到第一排
                        4t:输入信号依旧是4 5 15 16,外加一个信号A=10。判断器工作4 5 15 16≥10,输出15 16 A=10;运算器工作输出-A=-10
                        此时,信号15 16 A -A均输出到第二排判断器,但是由于相同信号在红线内会自动进行加法运算,所以A+(-A)=0
                        真正到第二排的信号只有15 16
                        5t:信号N和S更新,N=2,S=31。并输出到第三排计算器
                        6t:更新A,平均值A=int(S/N)=int(31/2)=int(15.5)=15。并将更新后的A=15传送到第一排
                        7t:输入信号依旧是4 5 15 16,外加更新的信号A=15。判断器≥15输出15 16,运算器输出-A=-15
                        信号15 16输出到第二排
                        8t:信号N和S更新,N=2,S=31。
                        9t:更新A,平均值A=int(S/N)=int(31/2)=int(15.5)=15。
                        。。。。。。
                        可以发现,在输入信号平稳的情况下,这个模块的工作将无限循环输出一个稳定的信号15和16
                        也就是说,当信号在短暂2t时间变动后,它就能输出一个最大值的结果
                        如果排除相同值和运算器除法取整数这个因素,那么最简单的取极值模块完成了,它只需要简简单单的5个运算器就能搞定
                        有没有觉得神奇到爆炸啊


                        IP属地:重庆12楼2022-04-20 15:30
                        回复
                          好了,到这一步,我已经完成了在不怎么损失原有结构的稳定性同时,极大的简化这个取极致的模块
                          但是,回到最开始我说的运算器除法只取整数部分,进而导致的一些后果
                          如果你在乎这个后果,那么上述模块直接用就行
                          如果在乎,我们就要先深抠一下这个问题


                          IP属地:重庆13楼2022-04-20 15:35
                          回复
                            首先,我们要知道出现无法筛选15 16的直接原因是因为平均值的整数部分为15
                            但是,大家有没有想过为什么平均值的整数部分是15
                            可能这个问题有点搞笑啊
                            但是这牵扯到两个信号的扩展问题,比如:9个1 1 1 1 1 1 1 1 1和一个10,他们的平均值Average=int(S/N)=int(19/10)=int(1.9)=1
                            这个时候就不能说全都要了,这个很明显就只能要9,其他的都不行太低了
                            所以必须从数学的角度深抠
                            虽然我数学很差啊


                            IP属地:重庆14楼2022-04-20 15:45
                            收起回复
                              2025-07-17 04:48:41
                              广告
                              我们要知道,什么情况下才会出现:int(Average)≤输入信号
                              只有把这个搞清楚了才能解决问题


                              IP属地:重庆15楼2022-04-20 15:47
                              回复