1234567
返回列表 发新帖
查看: 5049|回复: 92
打印

【源码】巧用Excel+Matlab助你"社区谷雨活动-拼点竞猜赢粮饷"

  [复制链接]

4915

积分

3748

人气

30

粮饷

Lv.9

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
发诏君主
发表于 2018-4-27 07:48:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 终~不敌沧桑岁月 于 2018-4-27 21:05 编辑

一 概述

先放结果图,中间是算法与代码,文末为Excel附件

说明:
1.发帖1W字数限制,没法直接放表格,只能放图片版,附件为Excel数据源文件和最后结果,大家可下zài搜索

2.因为竞猜数据本身不全,不可能得到所有精确值,所以有最小可能和最大可能。如果两者一样,表示你的点数就是该值,如果不同,可以根据自己感觉在最小到最大间猜一个值

3.因为楼层kào前的人 被拼点人数较多,可以形成完美闭环,所以大多能得到精确结果,拼点人数少的,误差较大

4.我没有参加拼点,可能是当时没请读规则,误以为拼Ta会扣Ta粮饷。此结果仅供大家交流学习

结果精确程度可参考下图,1001组有效数据,206人0误差,113人误差为1,分析结果较为满意


                表1

                                            表2

下图(高清)较长,手机用户可用电脑版页面查看原图,也可下zài附件Excel文件

                               图1




二 分析

1.可利用的条件只有两条

①点数相同的ID关系
②点数不同的大小关系

第一个条件可得262个等式,两两相等
第二个条件可得2740个不等式,两两存在确定的大小关系
为什么条件个数不能被3整除?因为我在计算时发现有一人(429层)是自己与自己拼点,其结果应该无效 @刀|刀

2.分为两大步
①由262个等式确定点数相同的人,得到相同点数的ID,可能有很多组
②由2740个不等式进行穷举对比,当某一结果满足所以条件,即为解,解有很多,我们采用最小和最大两种结果

三 算法及代码

1.第一步-找相同

算法:

①先将两个相同点数ID标记为A类

②再考察另两个相同点数的ID
如果有其一标记过,记入已知的类别
如果均未标记过,两者记为未知的B类

③继续考察
如果发现两者均标记过,且类别与之前不相同,则将其中一类别全部重新标记为另一类别

④结果得到很多类别
每一类别里的ID点数一定相同,不同类别的之间可能相同,条件不足无法继续求解

Matlab代码:
  1. clear all;
  2. num=2000;
  3. a=数组省略(见Excel);
  4. for i=1:262
  5.   
  6.     if b(a(i,1))~=0 && b(a(i,2))~=0
  7.         little=min(b(a(i,1)), b(a(i,2)));
  8.         large=max(b(a(i,1)), b(a(i,2)));
  9.         idx=find(b==large);
  10.         b(idx)=little;  
  11.     elseif b(a(i,1))==0 && b(a(i,2))~=0
  12.         b(a(i,1))=b(a(i,2));
  13.     elseif b(a(i,1))~=0 && b(a(i,2))==0
  14.         b(a(i,2))=b(a(i,1));
  15.     elseif b(a(i,1))==0 && b(a(i,2))==0
  16.         b(a(i,1))=num;
  17.         b(a(i,2))=num;
  18.         num=num+1;
  19.     end
  20.    
  21. end
  22. b
复制代码

结果后chù理:将结果转置,相同ID为同一行,得到数组,代入下一步
                                     图2

2.第二步-比大小(最小原则)

算法:

①一共2740个不等式,循环2740层,直到结果满足所有不等式时,输出该结果

②将所有数令为A(1点),两两作比较
如果本应比后者小的,返回结果错误,则相比数加一
如果本应比后者大的,返回结果错误,则自加一

③考察该数是否有相同数
如果有则将所有相同数,作同样chù理


Matlab代码:
  1. clear all;
  2. unequal=数组省略(见Excel);
  3. same=数组省略(见Excel);
  4. result=数组省略(见Excel);
  5. a=0;
  6. count=0;
  7. term=0;
  8. while (a==0)
  9.     for i=1:2740
  10.         
  11.         if unequal(i,3)==1
  12.             if result(unequal(i,1),2)<=result(unequal(i,2),2)
  13.                
  14.                 [m,n]=find(same==result(unequal(i,1),1));
  15.                     if isempty(m)==1
  16.                         result(unequal(i,1),2)=result(unequal(i,1),2)+1;
  17.                     else
  18.                         index=find(same(m,:)>0);
  19.                         c=same(m,index);
  20.                         result(c,2)=result(c,2)+1;
  21.                     end
  22.                     
  23.                break;
  24.             end
  25.         else
  26.             if result(unequal(i,1),2)>=result(unequal(i,2),2)
  27.                
  28.                     [m,n]=find(same==result(unequal(i,2),1));
  29.                         if isempty(m)==1
  30.                             result(unequal(i,2),2)=result(unequal(i,2),2)+1;
  31.                         else
  32.                             index=find(same(m,:)>0);
  33.                             c=same(m,index);
  34.                             result(c,2)=result(c,2)+1;
  35.                         end
  36.                
  37.                break;
  38.             end
  39.         end
  40.         count=i;
  41.         if term
  42.             term=count
  43.         end
  44.         if i==2740
  45.             a=1;
  46.             break;
  47.         end
  48.         
  49.     end
  50. end
  51. result
复制代码


2.第三步-比大小(最大原则)


算法:

①一共2740个不等式,循环2740层,直到结果满足所有不等式时,输出该结果

②将所有数令为K(13点),两两作比较
如果本应比后者小的,返回结果错误,则自减一
如果本应比后者大的,返回结果错误,则相比数减一

③考察该数是否有相同数
如果有则将所有相同数,作同样chù理


Matlab代码:

  1. clear all;
  2. unequal=数组省略(见Excel);
  3. same=数组省略(见Excel);
  4. result=数组省略(见Excel);
  5. a=0;
  6. count=0;
  7. term=0;
  8. while (a==0)
  9.     for i=1:2740
  10.         
  11.         if unequal(i,3)==1
  12.             if result(unequal(i,1),2)<=result(unequal(i,2),2)
  13.                
  14.                 [m,n]=find(same==result(unequal(i,2),1));
  15.                     if isempty(m)==1
  16.                         result(unequal(i,2),2)=result(unequal(i,2),2)-1;
  17.                     else
  18.                         index=find(same(m,:)>0);
  19.                         c=same(m,index);
  20.                         result(c,2)=result(c,2)-1;
  21.                     end
  22.                     
  23.                break;
  24.             end
  25.         else
  26.             if result(unequal(i,1),2)>=result(unequal(i,2),2)
  27.                
  28.                     [m,n]=find(same==result(unequal(i,1),1));
  29.                         if isempty(m)==1
  30.                             result(unequal(i,1),2)=result(unequal(i,1),2)-1;
  31.                         else
  32.                             index=find(same(m,:)>0);
  33.                             c=same(m,index);
  34.                             result(c,2)=result(c,2)-1;
  35.                         end
  36.                
  37.                break;
  38.             end
  39.         end
  40.         count=i;
  41.         if term
  42.             term=count
  43.         end
  44.         if i==2740
  45.             a=1;
  46.             break;
  47.         end
  48.         
  49.     end
  50. end
  51. result
复制代码


结果后chù理:根据最小最大原则得到的两组解,计算两者差值,观察结果。


竞猜点数结果.zip

456.57 KB, 下载次数: 46

评分

参与人数 12人气 +52 收起 理由
司马烽 + 5 精彩精彩,才华横溢!
Demon无情 + 5 厉害了我的哥!
惜时 + 5 精品文章,给你点个赞!
初蓝 + 4 真是难为你了
游离比我小4岁 + 5 以后活动就***你了
忘却录音 + 1 原创内容,膜拜大神!
祖娅纳惜 + 5 厉害了我的哥!
良人当归即好 + 5 厉害了我的哥!
慕寒寒mio + 5 精彩精彩,才华横溢!
j52k8雪 + 5 惊呆了

查看全部评分

回复

使用道具 举报

3万

积分

7215

人气

271

粮饷

Lv.13

Rank: 13Rank: 13Rank: 13Rank: 13

舞态生风巧笑嫣然韬略志坚珠纱遮面剑眉星目心悦君兮七步成章洞察一切坚持不懈持之以恒日久弥坚冬至貂蝉小暑步练师荐言献策恭贺新禧为人民服务文韬武略高山流水桌游志曹婴特工灵雎非酋之约翩翩儒生佳人美眷勾唇嫣然上网的曹丕花笑初妍小权行舟步步带水女仆大乔执事陆逊棉弹心动

争玺诸侯
发表于 2018-4-27 07:50:39 | 只看该作者
。。。。  辛苦了 一大早
  • 我也说一句

年轻的时候我们也曾走失,还好,兜兜转转,原来你还在这里。
支持 反对

使用道具 举报

2558

积分

1139

人气

227

粮饷

Lv.8

Rank: 8Rank: 8

逐鹿枭雄
发表于 2018-4-27 07:51:27 来自手机 | 只看该作者
羡慕MATLAB玩得好的大佬
  • 我也说一句

支持 反对

使用道具 举报

9199

积分

1220

人气

64

粮饷

Lv.8

Rank: 8Rank: 8

舞态生风巧笑嫣然韬略志坚珠纱遮面剑眉星目心悦君兮坚持不懈持之以恒荐言献策特工灵雎制霸天梯结伴而行

4#
发表于 2018-4-27 07:53:55 | 只看该作者
总算有个会玩的了
  • 我也说一句

支持 反对

使用道具 举报

9870

积分

125

人气

234

粮饷

Lv.11

Rank: 11Rank: 11Rank: 11Rank: 11

舞态生风巧笑嫣然韬略志坚珠纱遮面剑眉星目心悦君兮八斗高才坚持不懈持之以恒特工灵雎翩翩儒生勾唇嫣然

5#
发表于 2018-4-27 07:58:09 来自手机 | 只看该作者
厉害了。。。。
  • 我也说一句

支持 反对

使用道具 举报

1万

积分

353

人气

1225

粮饷

Lv.11

Rank: 11Rank: 11Rank: 11Rank: 11

舞态生风巧笑嫣然韬略志坚珠纱遮面剑眉星目心悦君兮初出茅庐坚持不懈持之以恒日久弥坚恭贺新禧招财进宝萌萌貂蝉特工灵雎勾唇嫣然上网的曹丕

6#
发表于 2018-4-27 08:02:22 | 只看该作者
感谢大佬为用实锤帮我吃下了一颗定心丸~~
  • 我也说一句

欢迎到周周直播间做客:https://www.huya.com/17784281
支持 反对

使用道具 举报

4634

积分

568

人气

493

粮饷

Lv.9

Rank: 9Rank: 9Rank: 9

舞态生风巧笑嫣然韬略志坚珠纱遮面心悦君兮特工灵雎结伴而行勾唇嫣然步步带水

7#
发表于 2018-4-27 08:03:12 | 只看该作者
已经回复了,不过差值为9,也没大用。
  • 我也说一句

支持 反对

使用道具 举报

5万

积分

1万

人气

1479

粮饷

「版主」

Rank: 16Rank: 16Rank: 16Rank: 16

舞态生风巧笑嫣然韬略志坚珠纱遮面剑眉星目心悦君兮初出茅庐桃园三杰金璧之才坚持不懈持之以恒荐言献策为人民服务文韬武略高山流水花蔓抖擞特工灵雎制霸天梯一代枭雄结伴而行无尽的巅峰翩翩儒生佳人美眷勾唇嫣然上网的曹丕社区灵雎花笑初妍小权行舟步步带水女仆大乔棉弹心动

8#
发表于 2018-4-27 08:03:51 | 只看该作者
厉害了 算法帝
  • 我也说一句

支持 反对

使用道具 举报

1万

积分

3826

人气

3323

粮饷

Lv.12

Rank: 12Rank: 12Rank: 12

舞态生风巧笑嫣然韬略志坚珠纱遮面剑眉星目心悦君兮坚持不懈持之以恒荐言献策特工灵雎结伴而行无尽的巅峰翩翩儒生佳人美眷勾唇嫣然上网的曹丕步步带水

9#
发表于 2018-4-27 08:04:15 | 只看该作者
大佬厉害了
  • 我也说一句

支持 反对

使用道具 举报

8万

积分

1万

人气

8790

粮饷

Lv.14

Rank: 14Rank: 14Rank: 14Rank: 14

舞态生风巧笑嫣然韬略志坚珠纱遮面剑眉星目心悦君兮恭贺新禧萌萌貂蝉桌游志曹婴特工灵雎勾唇嫣然上网的曹丕女仆大乔执事陆逊

10#
发表于 2018-4-27 08:06:14 | 只看该作者
说下我自己的结果吧。楼主给的范围是3-12。但是我自己跟117拼赢过。117楼楼主算的是7。所以我的范围应该是8-12吧,不知道是不是有什么问题
  • 所在归处 :这位,我想问下你之前发的桌面版多开方法盗用自本贴楼主的事情怎么解释?
    2018-4-27 09:55 
  • 终~不敌沧桑岁月 :回复JKLegend:朋友,你看错了吧。我这边搜索结果,你拼点的是17.217.233楼,分别是2-3,1-3,11-13,你是3-12,没问题吧
    2018-4-27 08:21 
  • JKLegend :我是811楼
    2018-4-27 08:06 
  • 我也说一句

  • 步步惊心
    人生若只如初见,何事秋风悲画扇
    支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则