Acturpt
How Do You Feel About It?


Ok

Good

Sad

Angry

Fun




In some region there exists 8 lakes,in which lived 6 sorts of birds,with the number of 1000,1500,2000,2500,3000,3500.Moreover,the number of the birds living in each lake is:2400,1100,1400,1900,2500,1800,1400,1000.
Try to develop algorithms to solve the number of EACH kind of birds living in EACH lake.


先写出逻辑关系:
各种鸟总数的数组:bird[0-5]
最终各个湖泊中鸟总数的数组:lake[0-7]
最终每个湖中各种鸟的个数:l_b[0-7][0-5]
已知sum(bird[])=sum(lake[])=sumbird=13500
sum(l_b[i][0-5])=lake[i]
sum(l_b[0-7][i])=bird[i]

看起来很棘手的题,总共14个已知数,逻辑关系只有四条,却有6*8=48个未知数,似乎是不大可能解决的事情

当然,只是看起来棘手而已。

现在用Mont Carlo法进行模拟实验求解(其实也能利用数学期望来求解,但只能得到近似数据。而且…用纯数学方法不是我风格,尽管我本科念的数学系)。把所有的鸟做为一个样本,样本容量为sumbird。每次实验从样本中随机抽取一只鸟,随机地放入任何一个湖中。总共进行sumbird次实验。

算法设计:
如果完全随机地进行这sumbird次实验的话,最终得到符合条件的结果的概率很小。这个算法所需要做的是成立一个法则,在遵循这个法则的前提下,随机地进行所有实验,而所得到的结果能够满足所有条件。显然,这个法则一定是建立在已知条件上的。
问题:定制一个怎样的法则,才能使遵循它的sumbird 次实验能够符合条件?
初始状态:每个湖里鸟的数量为0;
最终状态:每个湖里鸟的数量为lake[i:0-5]。
第一次实验,取到i类鸟的概率为bird[i]/sumbird,把它放入j湖的概率为lake[j]/sumbird。(i∈[0,5]; j∈[0,7])
此时,样本中还有sumbird-1只鸟,其中i类鸟还剩bird[i]-1只;j湖中已经有1只鸟。
第二次实验,取到i类鸟的概率为(bird[i]-1)/sumbird(因为已经抽走了一只),把它放入j湖的概率为(lake[j]-1)/sumbird。(因为j湖中已经有一只鸟了,离lake[j]还差lake[j]-1只)
以此类推。
那么,可以推出,第n次实验(n∈[1,sumbird])时,抽到样本中i类鸟的概率为( bird[i]-已经抽走的i类鸟的总数)/(sumbird-已经抽走的鸟的总数);把它放入j湖中的概率为( lake[j]-j湖中已有鸟的总数)/ (sumbird-已经抽走的鸟的总数)  …………………………※
只要每次的抽取实验都遵循※,就能sumbird次实验后得到的结果符合所有条件。

实现方法:
易得:第n次实验时已经抽走的i类鸟的总数= sum(l_b[0-7][i]);
         j湖中已有鸟的总数= sum(l_b[j][0-5])。
设置两个动态数组:
w_b[i:0-5]:在样本余下的鸟中抽到种类为i的鸟的概率;
w_l[j:0-7]:将抽取到的鸟放入编号为j的湖中的概率。
易得:w_b[i]=(c[i]-sum(l_b[0-7][i]))/sumball
   w_l[j]= (l[i]-sum(l_b[j][0-5]))/sumball
每次抽取实验后sumball自减1。
循环进行sumball次实验,即可得符合条件的结果。
In some region there exists 8 lakes,in which lived 6 sorts of birds,with the number of 1000,1500,2000,2500,3000,3500.Moreover,the number of the birds living in each lake is:2400,1100,1400,1900,2500,1800,1400,1000.
Try to develop algorithms to solve the number of EACH kind of birds living in EACH lake.


先写出逻辑关系:
各种鸟总数的数组:bird[0-5]
最终各个湖泊中鸟总数的数组:lake[0-7]
最终每个湖中各种鸟的个数:l_b[0-7][0-5]
已知sum(bird[])=sum(lake[])=sumbird=13500
sum(l_b[i][0-5])=lake[i]
sum(l_b[0-7][i])=bird[i]

看起来很棘手的题,总共14个已知数,逻辑关系只有四条,却有6*8=48个未知数,似乎是不大可能解决的事情

当然,只是看起来棘手而已。

现在用Mont Carlo法进行模拟实验求解(其实也能利用数学期望来求解,但只能得到近似数据。而且…用纯数学方法不是我风格,尽管我本科念的数学系)。把所有的鸟做为一个样本,样本容量为sumbird。每次实验从样本中随机抽取一只鸟,随机地放入任何一个湖中。总共进行sumbird次实验。

算法设计:
如果完全随机地进行这sumbird次实验的话,最终得到符合条件的结果的概率很小。这个算法所需要做的是成立一个法则,在遵循这个法则的前提下,随机地进行所有实验,而所得到的结果能够满足所有条件。显然,这个法则一定是建立在已知条件上的。
问题:定制一个怎样的法则,才能使遵循它的sumbird 次实验能够符合条件?
初始状态:每个湖里鸟的数量为0;
最终状态:每个湖里鸟的数量为lake[i:0-5]。
第一次实验,取到i类鸟的概率为bird[i]/sumbird,把它放入j湖的概率为lake[j]/sumbird。(i∈[0,5]; j∈[0,7])
此时,样本中还有sumbird-1只鸟,其中i类鸟还剩bird[i]-1只;j湖中已经有1只鸟。
第二次实验,取到i类鸟的概率为(bird[i]-1)/sumbird(因为已经抽走了一只),把它放入j湖的概率为(lake[j]-1)/sumbird。(因为j湖中已经有一只鸟了,离lake[j]还差lake[j]-1只)
以此类推。
那么,可以推出,第n次实验(n∈[1,sumbird])时,抽到样本中i类鸟的概率为( bird[i]-已经抽走的i类鸟的总数)/(sumbird-已经抽走的鸟的总数);把它放入j湖中的概率为( lake[j]-j湖中已有鸟的总数)/ (sumbird-已经抽走的鸟的总数)  …………………………※
只要每次的抽取实验都遵循※,就能sumbird次实验后得到的结果符合所有条件。

实现方法:
易得:第n次实验时已经抽走的i类鸟的总数= sum(l_b[0-7][i]);
         j湖中已有鸟的总数= sum(l_b[j][0-5])。
设置两个动态数组:
w_b[i:0-5]:在样本余下的鸟中抽到种类为i的鸟的概率;
w_l[j:0-7]:将抽取到的鸟放入编号为j的湖中的概率。
易得:w_b[i]=(c[i]-sum(l_b[0-7][i]))/sumball
   w_l[j]= (l[i]-sum(l_b[j][0-5]))/sumball
每次抽取实验后sumball自减1。
循环进行sumball次实验,即可得符合条件的结果。
Less
3
Please login to leave a comment.
Comments (3)
我觉得我只要看第一本就够啦,反正算法部分也不是我负责的。哈哈我是懒虫我怕谁

guest%3A%E7%8E%8B%E6%95%8F%E8%85%BE
对于算法我也只是略知一二而已,大家一起讨论吧,谈不上请教的。

Computer Algoriths,C++ Ellis Horowitz等著
常用算法程序集 徐士良著
第一本介绍的是比较普遍的计算机算法,比较基础第二本介绍的主要是数值计算的算法,专业性比较强,对数学基础要求比较高。就这两本吧~我自己也没吃透呢。

acturpt
强悍!这种课题要是拿给我们做的话估计会得出无解的结论
看来算法方面以后要多请教请教你了
推荐几本好的算法书给我啊

guest%3A%E7%8E%8B%E6%95%8F%E8%85%BE