排列组合算法1:生成全部有序列

生成长度为N的全部有序列(n-tuples) 

在QQ群上和朋友聊天(嗯,我还在用QQ,尽情鄙视我吧。什么时候MSN支持像QQ那样任意添加表情,任意贴图,而不是把我添加的表情图压缩得面目全非,我再放弃QQ不迟。连“彻底地全身心地毫无保留地崇拜你”都不能用,MSN my ass。QQ上的表情:
同样的图添加到MSN后: 。什么世道!),常遇到的话题之一是怎么生成一个有序列的所有组合,一个集合的所有子集(幂集),或者所有的全排列。一些论坛上也常出现类似的问题。很有意思的话题。在编程中时不时要遇到之外,也是锻炼大脑防止老年痴呆的上佳练习材料,尤其适合好静坐,喜油条, 30岁以上从不上健身房的程序员。不用左右看了。就是老大您!做这类题目还有个好处:重温当年写小程序的快乐。不知道多少人会享受搭建工资管理系统的全过程,津津有味地调试奇形怪状的API,反复修改庞杂的XML配置文件。反正我不会。写小程序就不同了。没有最后期限的压力,不用担心系统的羁绊,无需顾虑程序的架构。可以纠缠算法的每一个细节,也可以执着于提高代码的每一分性能。施主随喜。心智澄明,目光通透,心随意动,运指如飞。敲下的字符直切问题要害,摧枯拉朽。层层屏障随着代码的延伸支离破碎。写小程序解谜题的过程,就好像懵懂小孩儿扎堆游戏,纯粹为了好玩儿。一晃眼,一下午过去。他们满身泥浆,精疲力尽。但他们眼神依然兴奋,依然盼望下一次游戏。嗯,今年不收礼,收礼只收智力题。 
今天又开始犯贱,万事压身就是不想动手。不过秉承拖拉也要拖有所得的原则,干脆聊聊这类问题的常用算法。
知道怎么生成全部有序列的算法,也就知道怎么生成幂集。这两者有直观的对应关系。生成全排列则另有一套算法。生成所有有序列要简单些,所以先用它开胃。当然,这类问题早有 大牛写了详尽的 指南, 我也就当当廉价的搬运工而已。好在还能用大牛本人的话安慰一下自己:每当发现什么有趣的问题后,轻轻Google一把,总能不幸发现有聪明人已经做出答案。
一个N-tuple是一个包含N个元素的序列,一般写作 。比如说 就是一个6-tuple。注意tuple和集合的区别。Tuple里可以包含重复的元素。而且Tuple的元素是有序的,就跟数组的元素一样。
那么给定一个N-tuple, ,我们怎么生成全部有序列呢?由简入繁总是学习的不二法门。所以我们从简单的二进制N元有序列(binary n-tuple)开始:二进制N元有序列的每个元素都是一个bit,非0即1。比如说一个二进制3-tuple,生成的全部有序列为
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 1)
一共8个。二进制N元有序列虽然简单,却已经有了广泛的用途。比如说知道怎么生成二进制N元有序列,我们也就知道怎么生成幂集:一个N元集合 ,我们规定 属于于一个子集,当且仅当对应的二进制N元有序列的元素 。用上面的3-tuple作例子。给出一个集合 ,则
下面还会讨论更多的应用。而且从讨论二进制N元有序列中得出的结论为我们以后探讨怎么生成更复杂的组合样式奠定基础。
生成全部二进制N元有序列的方法再简单不过:我们从二进制数 开始,逐次加一,直到得到 为止。利用进位加法,我们刚好遍历了所有的N-tuples。简单,但是美妙。代码用Ruby实现的。因为Ruby的代码和伪代码差别不大,会不会Ruby的老大都可以
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,您的问题是如何使用鲸鱼算法来解决18个零件的序列优化问题。让我来为您解答。 首先,鲸鱼算法是一种基于自然界中鲸鱼的行为模式来设计的优化算法,适用于解决许多优化问题。对于您的问题,我们可以将每个序列看作一个个体,通过不断迭代更新个体,最终找到最优的序列。 具体实现步骤如下: 1. 初始化种群。首先,我们需要随机生成一些序列作为初始种群,每个序列代表一个个体。可以将1-18这18个零件随机排列,得到不同的序列作为初始种群。 2. 评估适应度。对于每个个体,需要计算其适应度。根据您提供的五个矩阵和规则,判断每个序列是否能够使用,并计算其适应度。适应度越高,说明该序列越优秀。 3. 选择操作。在选择操作中,我们采用轮盘赌选择的方,即按照每个个体的适应度大小将其放入轮盘上,并进行随机抽样,选出若干个个体进行下一步操作。适应度越高的个体被选中的概率越大。 4. 变异操作。在变异操作中,我们可以采用交换两个位置上的零件的方来进行变异。具体来说,随机选取两个位置,将它们上面的零件进行交换。这个过程可以多次进行,以增加种群的多样性。 5. 更新种群。通过选择操作和变异操作,我们得到了一些新的个体,将它们加入到种群中。同时,为了保持种群规模不变,我们可以将适应度较差的一些个体进行淘汰,只保留适应度较好的个体。 6. 终止条件。在每次迭代中,我们可以记录下最优的个体,并不断更新。如果最优的个体在连续若干次迭代中没有明显的变化,或者达到了一定的迭代次数,那么算法可以停止。 通过上述步骤,我们可以使用鲸鱼算法来解决18个零件的序列优化问题。最终,可以找到适应度最小的序列,也就是最优的序列

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值