ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: fanchunke1991

[求助] 求助:怎么利用VBA实现排列组合,进行分组排序?谢谢!

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-7-28 19:50 | 显示全部楼层
香川群子 发表于 2012-7-21 00:01
刚刚做了测试,发现确实还有bug……到倒数第2宿舍分配时,有时会产生重复错误。

解决方法,是强制抽取的 ...

现在发现下面这段好像是多余的,我在红字行设置断点,无论怎样运行都运行不到这一行:
            For k = 0 To dx_rs.Count - 1 '遍历检查各校剩余人数情况
                If q(k) = i Then  '如果该校剩余人数等于待分配宿舍数
                    s = Filter(dx_xh.items, p(k), True) '则必须强制从该校中先抽取1人,否则会造成死循环。
                    GoTo xDraw '学校甄别完成后,直接跳到女生随机抽取处理过程
                End If
            Next

TA的精华主题

TA的得分主题

发表于 2012-7-28 20:29 | 显示全部楼层
小花鹿 发表于 2012-7-28 19:50
现在发现下面这段好像是多余的,我在红字行设置断点,无论怎样运行都运行不到这一行:
            For  ...

你错了,有时候会出现这种状况的。

如果你运行几千到几万次你就会发现了。

我是运行了数千次以后发现了bug,才打上了这个补丁。呵呵。

TA的精华主题

TA的得分主题

发表于 2012-7-28 20:57 | 显示全部楼层
香川群子 发表于 2012-7-28 20:29
你错了,有时候会出现这种状况的。

如果你运行几千到几万次你就会发现了。

噢,我明白了,如果有两个q(k) = i - 1 本次抽取了第一个,那么下一次必定会有q(k) = i
我怎么没往这里想呢?

TA的精华主题

TA的得分主题

发表于 2012-7-29 13:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
小花鹿 发表于 2012-7-28 20:57
噢,我明白了,如果有两个q(k) = i - 1 本次抽取了第一个,那么下一次必定会有q(k) = i
我怎么没往这里 ...

是这样子。

典型的例子是:
最后3个宿舍剩14个人,而且正好7个学校每个学校2人。
即待分配宿舍数 i=3,剩余学校/人数状态是:ABCDEFG/2222222

则人数=i-1=2的学校有7个,优先分配以后,必然还要剩余1个。

即倒数第3个宿舍分配完成后,
剩余学校/人数状态就是:ABCDEFG/1111112

此时,待分配宿舍数 i=2,应该优先分配人数=2的学校的学生。


…………
如果没有设置这个优先级,则可能依旧把前面6个学校的人先分配掉了,
那么最后剩余2个学生就都是同一学校G校的了。


…………
不过,在整个随机过程中,这样情况出现的概率是很小、很小的。

但作为完整无误的代码来说,必须考虑和解决这种情况。


呵呵。


因此

TA的精华主题

TA的得分主题

发表于 2012-7-29 17:55 | 显示全部楼层
香川群子 发表于 2012-7-29 13:17
是这样子。

典型的例子是:

你说得很对,我原来说得不准确,重新描述一下:
某次抽取完成之后,有可能有超过6个的 i-1,下次抽取6个 i-1,那么再下一次必定存在=i 的情况。

TA的精华主题

TA的得分主题

发表于 2012-7-29 18:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
小花鹿 发表于 2012-7-29 17:55
你说得很对,我原来说得不准确,重新描述一下:
某次抽取完成之后,有可能有超过6个的 i-1,下次抽取6个 ...

呵呵,因此说,解决这个随机不重复分配问题的算法,

目前只有我一个人能做到一次性抽取成功。

TA的精华主题

TA的得分主题

发表于 2012-7-29 18:53 | 显示全部楼层
香川群子 发表于 2012-7-29 18:06
呵呵,因此说,解决这个随机不重复分配问题的算法,

目前只有我一个人能做到一次性抽取成功。

呵呵,你厉害!
1、我现在可以说已经很好的理解了你对这个问题的算法(说掌握可能有点过份,需要经过多次的实践),我想知道的是,你从得到这个题目到最后得出结论,经过了一个怎样的思考过程?
2、我觉得这个题目还有进一步讨论的必要(当然,可能偏离楼主的初衷),我愿意再进一步向你请教,如果你愿意的话。

TA的精华主题

TA的得分主题

发表于 2012-7-29 19:42 | 显示全部楼层
小花鹿 发表于 2012-7-29 18:53
呵呵,你厉害!
1、我现在可以说已经很好的理解了你对这个问题的算法(说掌握可能有点过份,需要经过多次 ...

嗯……其实也很简单。


所谓算法,就是要很好地掌握需求。


一个最简单的办法,就是模拟。

……
假设你是不用电脑,用手工方法来随机分配房间的话,

那么肯定程序是:
1.  随机抽
这个用代码实现是很简单的。(如果没有其它限制条件的话)


2.  需要排除同校
这个用代码如何实现呢?

一种方法,当然就是其他人很习惯的用法: 随机抽 → 比对 → if 不同校 then OK else 再抽一次。


但是,这个方法虽然简单,却肯定不是智慧的。

如果是你在手工抽的话,肯定是事先排除了同校的,然后从剩余学生中再去随机抽……

这个,其实就是我一开始就想到的算法思路。

至于具体实现方法,肯定比闭着眼睛随机抽要复杂得多……
使用了字典+数组过滤方法。

这个方法,就是我独创的。


3. 避免死循环。

如果是手工抽的话,肯定会注意到,剩余人数越少时,
同校集中的可能性会逐步增大。

真正解决死循环的方法,肯定不能在出现死循环条件以后再来……那样就晚了、完了。

其实,如果是手工处理的话,很快就能想到解决办法:
人数集中的学校,必须先抽,不让他们的剩余人数多于待分配宿舍数……

正确的思路其实真的很简单,并没有太复杂的地方。


话说,相当这些问题,倒是需要一些脑子(不是高智商,只是慎密的思维而已。)


…………
或者从技巧上来说,避免、或者说彻底解决死循环的思维方法,
是用了倒推的方法。即,最后出现死循环,是什么状态,又是什么原因造成的……
那么,之前更早一步的处理方法,是否已经决定了是产生死循环,还是不至于产生死循环的分歧点……


呵呵。

仔细研究,就能找到解决问题的思路和实现的方法。



TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-21 20:16 | 显示全部楼层
zhaogang1960 发表于 2012-7-19 17:46
请看附件

赵老师,您好!我用您给我的方法也解决了我的问题,但最近我又遇到了一些问题。原帖中是男女单独分组,每组人数为6且来自不同的学校,现在想男女混合分组,每组10人且男女平均各为5,而且来自不同学校。我按照您的程序想修改,但总是出错,老师能不能抽出点时间帮我看看,不胜感激!

TA的精华主题

TA的得分主题

发表于 2014-7-21 20:46 | 显示全部楼层
fanchunke1991 发表于 2014-7-21 20:16
赵老师,您好!我用您给我的方法也解决了我的问题,但最近我又遇到了一些问题。原帖中是男女单独分组,每 ...

这个结果满意吗

宿舍分配.rar

7.13 KB, 下载次数: 34

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 21:27 , Processed in 0.041136 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表