ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 多步骤规划求解

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-2-8 17:33 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
多步骤规划求解

请教各位大佬一个类似于背包问题的题目,问题描述如下:
现有27个数据,称之为原始值,最小是24万,最大是2.2亿,总和是4.0亿,分布在A1-A27。
另有16个数据,称之为目标值,最小是20万,最大是1亿。

原始值                        目标值
220,553,262         100,000,000
32,891,651         100,000,000
30,181,894         50,000,000
26,177,374         20,000,000
22,146,155         11,238,000
14,298,221         8,426,000
13,162,524         6,616,900
7,565,448                 5,008,000
7,555,948                 4,055,700
6,024,198                 3,203,900
3,836,060                 2,452,500
3,344,881                 1,801,800
3,326,535                 1,251,300
2,524,299                 800,680
2,256,824                 450,310
1,504,079                 200,110
1,503,074        
1,503,059        
1,016,024        
886,096        
886,096        
886,091        
886,091        
886,091        
590,727        
590,727        
240,111        

由小到大,对每一个目标值,从原始值中挑选出任意个数据的组合,使其和满足:大于目标值,且与目标值的差值最小,且每个原始值只能使用一次。
对每一个目标值,我都能够采用规划求解的方法来寻找最优的组会,但是一共就需要进行16次规划求解的操作。

例如:
第一个目标值200,110,应使用原始值240,111;
第二个目标值450,310,应使用原始值590,727;
第三个目标值800,680,应使用原始值886,091;
第四个目标值1,251,300,应使用原始值886,091和590,727,其和为1,476,818。由于240,111这个原始值已经用过了,所以此处不能使用1,016,024和240,111;
…………

现在的情况是:原始值会发生变化,目标值不会变化。每当原始值发生变化的时候,我就又需要重复进行上述16次规划求解的操作。

所以想请教各位大佬:是否有更简便的方法,不需要进行16次规划求解,例如只需要一次操作就能够产生针对这16个目标值的16个原始值组合?

备注1:在完成了前15个目标值之后,最后一个目标值100,000,000是无法达到的,这个暂时就这样了。

备注2:目前的16次规划求解的方法,是每一步都是局部最优解,但是未必是整体的最优解。若能实现整体最优解,即差值总和最小,最好。暂时不能实现整体最优解,只能实现局部最优解也可以。

工作簿3.zip

40.65 KB, 下载次数: 25

TA的精华主题

TA的得分主题

发表于 2019-2-8 20:41 | 显示全部楼层
数量有点多,求多个数字任意个数的和的最接近某个固定值的解,公式是可以做到的。但是求16次,那只能分开求,一个公式搞定太复杂了

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-8 21:09 | 显示全部楼层
micch 发表于 2019-2-8 20:41
数量有点多,求多个数字任意个数的和的最接近某个固定值的解,公式是可以做到的。但是求16次,那只能分开求 ...

谢谢micch回复。那你提到的“求多个数字任意个数的和的最接近某个固定值的解,公式是可以做到的。”这个问题在针对一个目标值时,使用公式是如何实现的呢?想学习一下。

TA的精华主题

TA的得分主题

发表于 2019-2-8 21:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 micch 于 2019-2-8 21:56 编辑
hanyangyu 发表于 2019-2-8 21:09
谢谢micch回复。那你提到的“求多个数字任意个数的和的最接近某个固定值的解,公式是可以做到的。”这个 ...
  1. =OFFSET(A1,MID(BASE(MOD(MIN(TEXT(MMULT(MID(BASE(ROW(1:255),2,8),{8,7,6,5,4,3,2,1},1)/1,A2:A9)/1%%+ROW(1:255)-4055700/1%%,"[<0]9!e14")/1),10^4),2,8),{8,7,6,5,4,3,2,1},1)*{1,2,3,4,5,6,7,8},)
复制代码
数字从小到大排列,以A2:A9为前8个数,求最接近4055700这个数的求和组合为例:

公式懒得简化了,能得到一个数组,组合为前6个数的和4079838为最接近目标值的最小正数;

看你的结果是如何显示了,显示在同一个单元格里需要合并函数,分列显示加个函数屏蔽不需要的值就行。

按照题目的要求,每求解一次,还需要剔除掉已经使用过的数字,所以不能直接引用A2:A9,还需要用函数取值,所以最后下来,不用辅助怕是做不到了。

其实这类问题,到VBA求助更好,我不会VBA递归,也不会规划求解的代码,所以即使代码做,也只能循环循环,还不如辅助列完成省事呢

TA的精华主题

TA的得分主题

发表于 2019-6-18 17:21 | 显示全部楼层
觉得不用vba没法解决,主要是每次都需要排除一些值。

刚好学习了下用vba调用规划求解,楼主请参考。谢谢。


工作簿3.rar

28.93 KB, 下载次数: 50

TA的精华主题

TA的得分主题

发表于 2019-6-26 20:52 | 显示全部楼层
考虑一种总体进行规划求解的方式,请各位大牛指点。

将原数据进行编号,补充一些值为0的序列供组合使用。目标数据通过编号索引匹配到源数据,增加alldiferent约束,进行规划求解。

我尝试了一些但是有的数据是无法达到约束条件。或许可以再次优化。

总体规划求解思路.rar (9.86 KB, 下载次数: 123)

无标题.jpg


TA的精华主题

TA的得分主题

发表于 2019-11-14 09:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
用python也可以实现

TA的精华主题

TA的得分主题

发表于 2019-12-13 16:55 | 显示全部楼层
把目标数据横着从小到大排序, 然后用VBA调用规划求解Solver就可以解决. 这个用线性规划可以解决.
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 12:04 , Processed in 0.041022 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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