- UID
- 102244
- 经验
- 4915
- 粮饷
- 30
- 最后登录
- 2019-1-7
- 在线时间
- 107 小时
Lv.9
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 终~不敌沧桑岁月 于 2018-4-27 21:05 编辑
一 概述
先放结果图,中间是算法与代码,文末为Excel附件
说明:
1.发帖1W字数限制,没法直接放表格,只能放图片版,附件为Excel数据源文件和最后结果,大家可下zài搜索
2.因为竞猜数据本身不全,不可能得到所有精确值,所以有最小可能和最大可能。如果两者一样,表示你的点数就是该值,如果不同,可以根据自己感觉在最小到最大间猜一个值
3.因为楼层kào前的人 被拼点人数较多,可以形成完美闭环,所以大多能得到精确结果,拼点人数少的,误差较大
4.我没有参加拼点,可能是当时没请读规则,误以为拼Ta会扣Ta粮饷。此结果仅供大家交流学习
结果精确程度可参考下图,1001组有效数据,206人0误差,113人误差为1,分析结果较为满意
下图(高清)较长,手机用户可用电脑版页面查看原图,也可下zài附件Excel文件
图1
二 分析
1.可利用的条件只有两条
①点数相同的ID关系
②点数不同的大小关系
第一个条件可得262个等式,两两相等
第二个条件可得2740个不等式,两两存在确定的大小关系
为什么条件个数不能被3整除?因为我在计算时发现有一人(429层)是自己与自己拼点,其结果应该无效 @刀|刀
2.分为两大步
①由262个等式确定点数相同的人,得到相同点数的ID,可能有很多组
②由2740个不等式进行穷举对比,当某一结果满足所以条件,即为解,解有很多,我们采用最小和最大两种结果
三 算法及代码
1.第一步-找相同
算法:
①先将两个相同点数ID标记为A类
②再考察另两个相同点数的ID
如果有其一标记过,记入已知的类别
如果均未标记过,两者记为未知的B类
③继续考察
如果发现两者均标记过,且类别与之前不相同,则将其中一类别全部重新标记为另一类别
④结果得到很多类别
每一类别里的ID点数一定相同,不同类别的之间可能相同,条件不足无法继续求解
Matlab代码:- clear all;
- num=2000;
- a=数组省略(见Excel);
- for i=1:262
-
- if b(a(i,1))~=0 && b(a(i,2))~=0
- little=min(b(a(i,1)), b(a(i,2)));
- large=max(b(a(i,1)), b(a(i,2)));
- idx=find(b==large);
- b(idx)=little;
- elseif b(a(i,1))==0 && b(a(i,2))~=0
- b(a(i,1))=b(a(i,2));
- elseif b(a(i,1))~=0 && b(a(i,2))==0
- b(a(i,2))=b(a(i,1));
- elseif b(a(i,1))==0 && b(a(i,2))==0
- b(a(i,1))=num;
- b(a(i,2))=num;
- num=num+1;
- end
-
- end
- b
复制代码
结果后chù理:将结果转置,相同ID为同一行,得到数组,代入下一步
图2
2.第二步-比大小(最小原则)
算法:
①一共2740个不等式,循环2740层,直到结果满足所有不等式时,输出该结果
②将所有数令为A(1点),两两作比较
如果本应比后者小的,返回结果错误,则相比数加一
如果本应比后者大的,返回结果错误,则自加一
③考察该数是否有相同数
如果有则将所有相同数,作同样chù理
Matlab代码:
- clear all;
- unequal=数组省略(见Excel);
- same=数组省略(见Excel);
- result=数组省略(见Excel);
- a=0;
- count=0;
- term=0;
- while (a==0)
- for i=1:2740
-
- if unequal(i,3)==1
- if result(unequal(i,1),2)<=result(unequal(i,2),2)
-
- [m,n]=find(same==result(unequal(i,1),1));
- if isempty(m)==1
- result(unequal(i,1),2)=result(unequal(i,1),2)+1;
- else
- index=find(same(m,:)>0);
- c=same(m,index);
- result(c,2)=result(c,2)+1;
- end
-
- break;
- end
- else
- if result(unequal(i,1),2)>=result(unequal(i,2),2)
-
- [m,n]=find(same==result(unequal(i,2),1));
- if isempty(m)==1
- result(unequal(i,2),2)=result(unequal(i,2),2)+1;
- else
- index=find(same(m,:)>0);
- c=same(m,index);
- result(c,2)=result(c,2)+1;
- end
-
- break;
- end
- end
- count=i;
- if term
- term=count
- end
- if i==2740
- a=1;
- break;
- end
-
- end
- end
- result
复制代码
2.第三步-比大小(最大原则)
算法:
①一共2740个不等式,循环2740层,直到结果满足所有不等式时,输出该结果
②将所有数令为K(13点),两两作比较
如果本应比后者小的,返回结果错误,则自减一
如果本应比后者大的,返回结果错误,则相比数减一
③考察该数是否有相同数
如果有则将所有相同数,作同样chù理
Matlab代码:
- clear all;
- unequal=数组省略(见Excel);
- same=数组省略(见Excel);
- result=数组省略(见Excel);
- a=0;
- count=0;
- term=0;
- while (a==0)
- for i=1:2740
-
- if unequal(i,3)==1
- if result(unequal(i,1),2)<=result(unequal(i,2),2)
-
- [m,n]=find(same==result(unequal(i,2),1));
- if isempty(m)==1
- result(unequal(i,2),2)=result(unequal(i,2),2)-1;
- else
- index=find(same(m,:)>0);
- c=same(m,index);
- result(c,2)=result(c,2)-1;
- end
-
- break;
- end
- else
- if result(unequal(i,1),2)>=result(unequal(i,2),2)
-
- [m,n]=find(same==result(unequal(i,1),1));
- if isempty(m)==1
- result(unequal(i,1),2)=result(unequal(i,1),2)-1;
- else
- index=find(same(m,:)>0);
- c=same(m,index);
- result(c,2)=result(c,2)-1;
- end
-
- break;
- end
- end
- count=i;
- if term
- term=count
- end
- if i==2740
- a=1;
- break;
- end
-
- end
- end
- result
复制代码
结果后chù理:根据最小最大原则得到的两组解,计算两者差值,观察结果。
|
评分
-
查看全部评分
|
我也说一句