ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 自力更生:钢筋下料组合优化正式版发布(一维)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-10-30 20:28 | 显示全部楼层
燕雀安知 发表于 2014-10-30 17:56
女侠,你的“凑数帖”曾让我苦恼不已,原因在于你的代码太难读懂了(变量名随意,数组维数上、下标定义随意 ...

其实我的【比较复杂】的代码,当然也不是一下子就这样的。

大概是写到第4.7版的样子。

由于大部分使用者不关心算法原理,我也就没有做很多说明或标准化改动。

为了追求速度,尽量简化了过程……至于变量名称,我不是专业编程的,没有这个习惯。

TA的精华主题

TA的得分主题

发表于 2014-10-30 20:52 | 显示全部楼层
燕雀安知 发表于 2014-10-30 17:56
女侠,你的“凑数帖”曾让我苦恼不已,原因在于你的代码太难读懂了(变量名随意,数组维数上、下标定义随意 ...

【请注意附件中给的3个示例数据,有些数据你的无解,可我的依然有解。】
【此外,我曾尝试直接修改你的代码,以理清你代码无解的原因,始终不明所以,最终,我认为,你的代码应该有逻辑缺陷。故本次跟帖,其实也是想知道你若修改你的代码,将修改哪些地方。】

呵呵,我的代码并无缺陷,但我的参数设置,是很有讲究的。

如第1题 =-260,你得到 5个解,
-260.000000000001=4608.6+255-39.6-41-55-82-164-182.35-182.35-4377.3
-260.000000000001=3890+2300+255-55-82-164-182.35-182.35-182.35-280-451-748.65-4377.3
-260.000000000001=2300+2100+765-39.6-41-158.4-164-182.35-182.35-280-4377.3
-260=765-39.6-41-55-158.4-280-451
-260=-41-55-164

而我如果设置如下参数,则可以一网打尽21个解:
B2 求和下限=-260.01
B3 求和上限=-259.99
B4 小数位数=2
B10 计算深度=-1

-260.010000000002=4376.4+1912.5+255+40.18-39.6-41-55-82-99.12-164-182.35-182.35-182.35-182.35-228.02-280-748.65-4377.3
-260.01=6120+40.18-99.12-158.4-164-182.35-182.35-228.02-280-748.65-4377.3
-260.01=4313+1254+765+40.18-41-99.12-158.4-164-182.35-182.35-228.02-451-748.65-4377.3
-260.01=4313+765+255+40.18-55-82-99.12-158.4-182.35-228.02-451-4377.3
-260.01=2300+2100+1254+40.18-41-55-82-99.12-158.4-182.35-228.02-280-451-4377.3
-260.000000000001=4608.6+255-39.6-41-55-82-164-182.35-182.35-4377.3
-260.000000000001=3890+2300+255-55-82-164-182.35-182.35-182.35-280-451-748.65-4377.3
-260.000000000001=2300+2100+765-39.6-41-158.4-164-182.35-182.35-280-4377.3
-260=765-39.6-41-55-158.4-280-451
-260=41-55-164
-259.990000000002=3890+1912.5+1254-39.6-41-99.12-158.4-164-182.35-182.35-182.35-182.35-228.02-280-451-748.65-4377.3
-259.990000000002=3890+1912.5+255-39.6-55-82-99.12-158.4-182.35-182.35-182.35-228.02-280-451-4377.3
-259.990000000002=2100+1912.5+765+255-41-99.12-182.35-182.35-182.35-228.02-4377.3
-259.990000000001=6283.2-41-82-99.12-158.4-164-182.35-182.35-228.02-280-748.65-4377.3
-259.990000000001=2300+1912.5+1254+765+40.18-39.6-158.4-164-182.35-182.35-228.02-451-748.65-4377.3
-259.990000000001=2300+1912.5+1254+765+40.18-82-182.35-182.35-228.02-280-451-748.65-4377.3
-259.990000000001=2300+1912.5+765+255+40.18-39.6-41-55-158.4-182.35-228.02-451-4377.3
-259.990000000001=2100+1912.5+1254+765+255+40.18-39.6-55-158.4-164-182.35-182.35-228.02-451-748.65-4377.3
-259.990000000001=2100+1912.5+1254+765+255+40.18-55-82-182.35-182.35-228.02-280-451-748.65-4377.3
-259.990000000001=2100+1912.5+1254+40.18-39.6-55-82-158.4-164-182.35-228.02-280-4377.3
-259.99=3890+1912.5-99.12-158.4-228.02-451-748.65-4377.3

计算耗时是差不多的水平。

TA的精华主题

TA的得分主题

发表于 2014-10-30 21:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2014-10-30 20:52
【请注意附件中给的3个示例数据,有些数据你的无解,可我的依然有解。】
【此外,我曾尝试直接修改你的代 ...

不对,你那是近似值,而非精确值。

0值,你只有2个解:
+4608.6+255-39.6-82-182.35-182.35-4377.3
+3890+2300+255-39.6-41-82-158.4-182.35-182.35-182.35-451-748.65-4377.3

我的(当然也是你的)可得5个解(不要再拿近似值来说话):
4608.6+255-39.6-82-182.35-182.35-4377.3
3890+2300+255-39.6-41-82-158.4-182.35-182.35-182.35-451-748.65-4377.3
3890+2300+255-41-182.35-182.35-182.35-280-451-748.65-4377.3
1254-39.6-41-164-182.35-182.35-182.35-182.35-280
765-39.6-41-82-158.4-164-280

TA的精华主题

TA的得分主题

发表于 2014-10-30 22:22 | 显示全部楼层
燕雀安知 发表于 2014-10-30 21:35
不对,你那是近似值,而非精确值。

0值,你只有2个解:

2799609应该有很多解。

如果计算2个解,耗时约 2-3秒。

如果求 10个解,耗时约 40秒。
2799609=630828+555930+408600+302400+284466+275000+211200+110010+24552+1254+765+255-39.6-41-55-158.4-164-182.35-182.35-451-4377.3
2799609=630828+555930+408600+302400+284466+275000+211200+110010+24552+1254+765+255-41-55-82-182.35-182.35-280-451-4377.3
2799609=630828+555930+408600+302400+284466+275000+211200+110010+21954+2300+2100+765+255-82-164-182.35-182.35-182.35-280-748.65-4377.3
2799609=630828+555930+408600+302400+284466+275000+211200+110010+21954+765+255-39.6-55-158.4-164-182.35-451-748.65
2799609=630828+555930+408600+302400+284466+275000+211200+110010+21954+765+255-55-82-182.35-280-451-748.65
2799609=630828+555930+408600+302400+284466+275000+211200+110010+21954-39.6-55-82-158.4-164-280
2799609=630828+555930+408600+302400+284466+275000+211200+110010+21886.5+4608.6-55-158.4-182.35-182.35-182.35-182.35-4377.3
2799609=630828+555930+408600+302400+284466+275000+211200+110010+21886.5+4320+1912.5-39.6-41-55-82-158.4-164-182.35-182.35-182.35-280-451-748.65-4377.3
2799609=630828+555930+408600+302400+284466+275000+211200+110010+21886.5+2100+1912.5+1254+255-39.6-82-158.4-182.35-182.35-182.35-280-748.65-4377.3
2799609=630828+555930+408600+302400+284466+275000+211200+110010+21580+6120+255-39.6-41-55-82-158.4-182.35-182.35-182.35-280-451-748.65-4377.3

TA的精华主题

TA的得分主题

发表于 2014-10-30 22:28 | 显示全部楼层
燕雀安知 发表于 2014-10-30 21:35
不对,你那是近似值,而非精确值。

0值,你只有2个解:

我再次提醒你,注意我的 B10 【最大计算深度cnt1】的设置。

仅当设置=-1时,才是深度遍历计算。否则默认仅按组合深度=17时未找到解就退出递归搜索了。
因此,默认条件下无解或解很少,是很正常的结果。

即,默认递归深度条件下,计算速度很快,但可能会漏过很多解。

TA的精华主题

TA的得分主题

发表于 2014-10-30 22:31 | 显示全部楼层
燕雀安知 发表于 2014-10-30 21:35
不对,你那是近似值,而非精确值。

0值,你只有2个解:

当设置B10的递归计算深度=-1时,计算耗时约 30秒,
得到 5组解:

0=4608.6+255-39.6-82-182.35-182.35-4377.3
0=3890+2300+255-39.6-41-82-158.4-182.35-182.35-182.35-451-748.65-4377.3
0=3890+2300+255-41-182.35-182.35-182.35-280-451-748.65-4377.3
0=1254-39.6-41-164-182.35-182.35-182.35-182.35-280
0=765-39.6-41-82-158.4-164-280

所以说我的程序没有bug、毫无问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-30 22:53 | 显示全部楼层
一个小BUG,19楼159行代码中文本数字从大到小排序会出错,应当转为数值型,改成以下代码:
  1.                 If Val(brr(j)) < Val(brr(k)) Then gd = brr(k): brr(k) = brr(j): brr(j) = gd
复制代码
1楼附件已更新。

TA的精华主题

TA的得分主题

发表于 2014-10-30 23:28 | 显示全部楼层
本帖最后由 燕雀安知 于 2014-10-31 00:42 编辑
香川群子 发表于 2014-10-30 22:31
当设置B10的递归计算深度=-1时,计算耗时约 30秒,
得到 5组解:


你说程序没有Bug,毫无问题,那么我试了个负数:-40,计算深度如你所说,把其设为-1,何以得到的一大堆解让人莫名其妙。

我修改后的代码可得到6组解,全是精确解(没去按计算器验证,因为我深信这结果是正确的):
4313+765-39.6-41-55-82-158.4-182.35-182.35-4377.3
4313+765-41-55-182.35-182.35-280-4377.3
3890+1254+255-39.6-55-158.4-164-182.35-182.35-280-4377.3
3890+1254+255-82-164-182.35-182.35-451-4377.3
2300+2100+1254+765-39.6-55-82-158.4-182.35-182.35-182.35-451-748.65-4377.3
2300+2100+1254+765-55-182.35-182.35-182.35-280-451-748.65-4377.3

至于2799609这么大的数,指定计算深度的参数为-1后,其组合集是很多了。因计算时间长,没耐心等所有结果了,强制中断你的代码后得到27个解,这27个解倒没看出什么问题来。

事实上,我曾一直排斥那些参数的设置,故未详加留意。

事后补:关于你代码生成的正确组合却显示存在误差的问题,是我忽略了你代码的一个细节,即计算后的浮点误差写入单元格的造成的,真叫我晕。但类似-40的负数的计算结果还是存在问题。

TA的精华主题

TA的得分主题

发表于 2014-10-31 00:45 | 显示全部楼层
燕雀安知 发表于 2014-10-30 23:28
你说程序没有Bug,毫无问题,那么我试了个负数:-40,计算深度如你所说,把其设为-1,何以得到的一大堆 ...

你的这6组解,用Excel计算时,因为小数计算的浮点误差,
计算结果也会= -40.0000000000009……即,按照Excel 内部运算时也都不是精确解。


TA的精华主题

TA的得分主题

发表于 2014-10-30 23:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2014-10-30 22:31
当设置B10的递归计算深度=-1时,计算耗时约 30秒,
得到 5组解:

我修改后的代码,经多次测试,不超过27秒。

我还是那话,只要速度不是太慢,追求速度的些微差异无多大意义,我在乎的是得到精确解。所以,我纠结于你代码究竟哪个地方出了问题,难不成又是我对你代码的参数设置不了解?感觉不象,因为,计算深度设为-1,小数位数2位都设置了,h2参数不大了解,似乎与该参数无关,n和n2的参数留空了,应该也与之无关。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-23 20:09 , Processed in 0.034353 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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