ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2404|回复: 12

[分享] 随机组合择优算法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-11-3 23:43 | 显示全部楼层 |阅读模式
工作表1有49列数据,从中任选12列,从第1行开始,如果该行有一个数字 则继续往下查找,
直至某行N与所选12列 交叉单元格的内容皆空,停止查找并记录最大行数 N-1。

题目就是 寻找49选12所有组合中,可能满足 最大的N。本例只有114行数据,故N 理论最大值为114。
海量组合 穷举法耗时太长,故选用 随机组合算法,主要参考了 遗传算法的 交叉算子。有待优化。

无标题.jpg


随机组合择优算法.rar (28.73 KB, 下载次数: 47)

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-11-4 12:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
49选12 组合:
1、个体编码为 一个字符串,长度49代表所有列,数字1代表 选中列,数字0代表未选中,数字1累计 为12个。
     穷举法 一次生成所有组合,普通随机 一次生成一个组合 判断,遗传算法 一次生成一个 若干个组合的族群。
2、遗传算法 本例中一次生成 50个 组合(初始族群),每迭代一次 又是50个 新的组合(完整步骤是 :选择+交叉+变异),加快了筛选。


a、当选出两个 个体rg1、rg2 ,要 交叉部分的 数字1 累计个数相等才可以 交叉操作,否则 新产生的个体 不符 组合要求。
     1010 和 0011     可以交叉置换
     1010 和 0001     不可以交叉
b、变异操作 也要设计为 1与 0 交换。




TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-23 15:34 | 显示全部楼层
题目见  http://club.excelhome.net/thread-1513250-1-1.html
关于搬石头的解答 (随机组合),撞不出最优解564,太难了。

122.JPG

搬石头.zip (20.21 KB, 下载次数: 19)




TA的精华主题

TA的得分主题

发表于 2019-12-23 16:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zopey 发表于 2019-12-23 15:34
题目见  http://club.excelhome.net/thread-1513250-1-1.html
关于搬石头的解答 (随机组合),撞不出最优 ...

17人去搬9块石头,有10^17种搬法,只有163种最大564的搬法。
确实大海捞针

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-23 16:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
yjh_27 发表于 2019-12-23 16:12
17人去搬9块石头,有10^17种搬法,只有163种最大564的搬法。
确实大海捞针

人不怕多,应是 9^17 搬法。

TA的精华主题

TA的得分主题

发表于 2019-12-23 17:43 | 显示全部楼层
zopey 发表于 2019-12-23 16:56
人不怕多,应是 9^17 搬法。

是的,不计不出力的,就减为9^17

按我原帖16L的算法,求出163个最佳,也就5秒

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-15 10:00 | 显示全部楼层
题目 :
http://club.excelhome.net/thread-1525690-1-1.html

说有两个答案:
39,15,46,25,23,30,03
39,15,46,25,23,30,06
答题器,随机多试几次,运气好出来一个答案
迭代表2.rar (33.11 KB, 下载次数: 8)




TA的精华主题

TA的得分主题

发表于 2020-3-15 10:49 | 显示全部楼层
丢丢老师这个题目,来自于论坛一个求助,之前我推荐他倒代码版求助了,但是老师们都没答,估计是因为求助的太随意了。

感觉应该有某个算法适合解决,但是不懂,用数组排列组合运算量又大,只能用排除法选最多,然后排除选次多,一个一个选,但是随机数据测试的时候,这样排除不合理。并列数字选择的时候,只能随机选,对结果有影响。

TA的精华主题

TA的得分主题

发表于 2020-3-15 11:23 | 显示全部楼层
zopey 发表于 2020-3-15 10:00
题目 :
http://club.excelhome.net/thread-1525690-1-1.html

这个问题确实也没有什么好的想法,如果局部最优都为一个估计直接就能得出全局最优。但实际情况会有很多个,如果按组合来算计算量太大了,所以先随机再取第一个局部最优去匹配,随机次数100可能就能得到全局最优的。当然它可能会有很多个最优解,只是不能确定这种方法是否一定能得到全局最优解,,,

http://club.excelhome.net/forum. ... ;page=2#pid10264106

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-15 11:54 | 显示全部楼层
一把小刀闯天下 发表于 2020-3-15 11:23
这个问题确实也没有什么好的想法,如果局部最优都为一个估计直接就能得出全局最优。但实际情况会有很多个 ...

遗传算法 族群繁衍有3个步骤 :1、选择,2 交叉,3、变异。

目前只有 交叉运算,初始的生成族群(要多试几次)对后面迭代结果影响较大;考虑增加 变异运算,使程序更有效率。
  1. '交叉位置
  2. 'tempb = Int(1 + Rnd() * k1)

  3. For i = 1 To k1
  4.    If Mid(rg1, i, 1) <> Mid(rg2, i, 1) Then Exit For '交叉 起始位 i
  5. Next

  6. t1 = 0: t2 = 0
  7. For j = i To k1
  8.     If Mid(rg1, j, 1) = 1 Then t1 = t1 + 1
  9.     If Mid(rg2, j, 1) = 1 Then t2 = t2 + 1
  10.     If t1 = t2 Then Exit For '交叉 结束位 j
  11. Next
复制代码




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

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-19 21:26 , Processed in 0.047819 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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