|
本帖最后由 灰袍法师 于 2012-6-3 18:40 编辑
问题的定义:
1 有一堆发票,无法区分来源,要求从中找出若干张发票,其金额总和等于指定数额。 (求多种组合的方法补充在18楼)
2 有A,B两堆发票,要求找出若干张A发票,若干张B发票,要求A发票的金额总和等于B发票的金额总和,而且此金额越大越好。
问题的解决:
附件使用Excel工作簿存储发票数据。
然后调用运筹学软件 Lingo 求解,最后把求解结果放回Excel工作簿,用户的全部操作就是粘贴原始数据,然后点击一下按钮
运行前需要下载,安装,破解 Lingo 软件
Lingo的下载:eMule 搜索 Lingo8 Full Version.rar, 本人长期上传此文件,不必担心没源。 当然如果你搜索到别的更新更好的Lingo版本,也可以用的。
Windows7 必须安装 Lingo 11.0, 也已经有破解了,本Excel附件仍然可用。
CSDN下载中心绝对有各种版本的Lingo下载,不过要注册用户。
常见问题及其解决方法
1. 对于部分筒子反映必须把.xls放在Lingo文件夹才能正常使用,我估计是.xls文件的D4单元格所致,把里面的自动计算文件名的公式删除,输入这个附件的文件名即可解决。我已经修改后重新上传。
2. 绝对不要用绿色版免安装版的lingo,必须要完整安装的才能实现 excel_lingo 之间的自动化。
3. 把Lingo语句复制到Lingo软件里面执行,就不会在运行期间导致Excel不能用,也不会在运行时间太长的时候,Excel等待超时无法接受求解结果。
4. 需要求解超过1000数据的,自己修改一下excel工作表的名称定义,把数据区域设置为更大即可,注意要全部名称都改,不能只改一个。又,数据太多的话,求解速度明显变慢,自己掌握吧。
附件的使用:
解决1型问题,非常简单,而且速度会很快,一般不超过 10秒 。(当然,碰到极端困难的数据也将需要几个小时)
把A发票数据放在数据清单1,最多1000张发票,不足1000张发票的,其余数据请输入0。
把指定的求和金额放在数据清单2,把数据清单2的其余数据设为0
点击求解按钮即可。
解决2型问题,非常复杂,而且速度很难预计,如果找不到解,请 减少 一些明显不合要求的数据再次尝试。
把A发票数据放在数据清单1,最多1000张发票,不足1000张发票的,其余数据请输入0
把B发票数据放在数据清单2,最多只能也处理1000张发票,不足1000张发票的,其余数据请输入0
然后点击求解按钮即可。
附件的工作表 "Lingo模型" 里面放的就是Lingo语言定义的求解程序,求解速度跟Excel的规划求解相比,快得不可思议。
附:求接近值而不是精确的相等值的方法
要做到这一点,需要修改Lingo模型工作表里面的语句
@SUM(Data_List1(i): Data1(i) * Flag1(i)) = @SUM(Data_List2(i): Data2(i) * Flag2(i)) ;
这一句是要求左列的选择数据和等于右列选择数据和, 改为
@SUM(Data_List1(i): Data1(i) * Flag1(i)) <= @SUM(Data_List2(i): Data2(i) * Flag2(i)) ;
即把等号改为小于等于号
然后在下一行增加一句语句(不加这一句,求解模型也是正确的,但偶尔会明明有解都出现无解,原因不明)
@SUM(Data_List1(i): Data1(i) * Flag1(i)) >= @SUM(Data_List2(i): Data2(i) * Flag2(i)) - 100;
这个100就是你要求有多接近,太小则可能无解,太高可能得不到最佳值,建议先用比较大的数值,然后逐渐减少。
最好备份一下再修改,所有语句都应该用文本格式,也接受Excel公式生成的字符串。
[ 本帖最后由 灰袍法师 于 2011-3-13 17:31 编辑 ]
补充内容 (2013-12-2 15:38):
同时建议到此贴 http://club.excelhome.net/thread-688274-1-1.html 不需要装Lingo的VBA解决方法
补充内容 (2014-1-3 17:50):
强烈推荐 香川群子 的贴,不需装Lingo 也能用VBA求解,速度还很快,必须下载!
2014新年元旦第一强帖:实用凑数凑金额高效递归剪枝算法
http://club.excelhome.net/thread-1085112-1-1.html
|
评分
-
1
查看全部评分
-
|