作者yauhh (哟)
看板Programming
标题Re: [请益] 徵求强者解决程式难题
时间Tue Dec 6 10:00:40 2011
※ 引述《imorgan (i。摩根)》之铭言:
: 需求:
翻译:
: 1. 1~50任意选出25各数字成为一组(代号a$),剩余25各数字为该组剩余数(代号b$)
把50个数字分为二组,
: 2. 共需20组a1~a20(与相对应之b1~b20)
以二组为一对,总共需要取20对.
: 3. 以a来讲,总共会产生500各数字(25*20=500)
(这句可以忽略,因为以上步骤一定产生这个结果.)
: 4. 以a来讲,1~50每各数字出现次数为10次(50*10=500)
限制:将20对数列的前项收集起来,1~50的每个数字各在前项集合中出现10次.
: 5. 以a来讲,碰撞次数限制为4~6
: 碰撞定义:任意两组号码,同时出现在一组a中称为一次。
: 根据此一定义,任意两各数字 in 20组a中,碰撞次数n范围:0<=n<=10
: 碰撞举例:
: 有一组a1产出为(1,2,3,4,5,...,25)
: (1,2)的碰撞次数为1次,(1,3)(1,4)(1,5)...(24,25)亦同
这段看得挺模糊的. 以a1来看,(1,2)碰撞了1次.
总共有a1,a2,...a20,以其中平均1,2都出现10次来讲,
意思是最好有5组找得到(1,2),其他15组要嘛有1没有2,要嘛有2没有1,
要嘛(1,2)都没有,是这样吗?
: 6. 呈现上述20组a与其对应之20组b,共20*25=500各数字(与其对应各组剩余b),统计并
: 呈现所有碰撞组合之次数
: 目前计算总碰撞次数为C(25:2)*20=6000
: C(25:2)代表从25各号码当中,任意取出2各号码的次数
: 20代表共20组,算出来6000代表为这20组共500各号码各自在每一组的总碰撞组合次数,
: 平均碰撞次数为6000/(50*49/2)=4.89...
在前项集合找到的碰撞次数 + 在後项集合找到的碰撞次数?
这20对数字,你只想要取一份就够了? 或者是最好能把所有的数列对穷举出来?
: 愿意付15KNTD给写得出来的人,程式语言不限,但要能成功移植平台给我。
^^^
好好喔~
: 这问题困扰我很久了,一直想个方法解决,可以搜寻我的id一年半之前就有po过类似的,
^^^^^^^^^^^^
看到这觉得有点疑惑,是连演算法都找不出来吗?
1,2点是随机取集合 + 求差集.
4.5点是重复将目标集合取出来,然後用一些检查函数确认,如果不符合就重新
取目标集合,再做检查.
第6点就是统计,列表. 但第6点就是在第5点进行的时候顺便可以做了.
第5点就是把前项集合每一列都拆成数对,丢到数对集合,就很好统计了.
因为取随机组合是很疯狂的举动,要找到符合的集合就是靠运气,所以要消耗时间.
如果不要消耗时间,那就只好改用推理方式生成符合的目标集合.
不过使用推理就有太强的引导性,可能不符合你所研究事物的目的.
另一个办法就是考虑先产生前项集合,先把1到50数字复制10倍放在20x25的方阵中,
然後弄乱, 弄乱的限制条件比较简单,只要检查每一列数字是否有二个数字重复,
然後检查碰撞. 等弄乱完了,准备另一个20x25的方阵,将每一列对1~50的补集贴进去,
就可以了.
要不然或者做反向工作,先产生想要的目标数对,例如(1,2)取4个,(1,3)取5个,
(1,4)取6个... 等等,总计(取联集)1~50数列有10个,然後来打乱产生前项集合.
不过这也要看这种生成方式是否符合你的研究目的.
用一般的程式语言可能很难写. 这种需要随便写一写让电脑程式自己产生资料的事,
我个人建议使用Prolog即可.
--
/yau
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.231.65.211
※ 编辑: yauhh 来自: 61.231.65.211 (12/06 10:14)
1F:→ stool100:我认为逻辑上有问题.依照目标做题目220.132.235.209 12/06 23:14
令 +:取联集, -:取差集, *:取交集, =:集合相等, <:左项属於右集合,
U:{1,2,...,50}, e:{}
令有一目标集合为 T = {a1, a2, ..., a20, b1, b2, ..., b20},
并令a1, a2, ..., a20联集为A, b1, b2, ..., b20联集为B,
其中
a1 + b1 = U, a2 + b2 = U, ..., a20 + b20 = U,
且 a1 * b1 = e, a2 * b2 = e, ..., a20 * b20 = e.
且将A分解并收集为数对集合P1, 其中例如 (1,2) < P1,
则 for all (x, y) < P1, (x, y)存在次数 < {4, 5, 6};
同理作用於将B分解并收集的数对集合P2;
且 for all x < U, x在A中出现10次; 同理, for all x < U, x在B中出现10次.
T就是你所说的目标. 或许你说的依照目标做题目是指先取a1, b1, 然後取 a2, b2,
以此类推. 但是假如我先取A,然後取B,你能说这是不照目标吗?
所以,
2F:→ yauhh:请问逻辑上问题在哪里? 61.231.65.211 12/07 00:25
※ 编辑: yauhh 来自: 61.231.65.211 (12/07 01:06)