最近在解决一个费用分摊的问题,就是让费用在几个不同的项目之间分摊,并且分摊后的总额和费用之间差额的绝对值在一定的范围之内,当然越小越好。该问题是一个典型的线性规划问题,说实话如果没有学过运筹学,肯定解决不了该问题,幸好博主学过,而且还解决过比这更复杂的问题,今天就写一篇文章,怀念一下读研时的美好时光,也给有类似问题的人一个思路。
先把这个问题用一个很简单的例子描述:假设有三种项目费用分别是,项目A90 元,项目B80 元,项目C70元,总费用是1983元,现在要确定ABC三个各分配多少个,才能最接近1983元,且最大误差不得超过30元。
根据上述问题确定模型(模型不知道描述得准确吗,还有一个要求就是绝对值里面的数最小):
|90*X+80*Y+70*Z-1983|<=30;
X,Y,Z>=0;
用LINGO描述为:
Min=@ABS(90*x+80*y+70*z-1983);
@ABS(90*x+80*y+70*z-1983)<=30;
@GIN(x);
@GIN(y);
@GIN(z);
用LINGO求解的结果为:
从结果上看出,X、Y、Z分别取值18、1、4,能使分配的总和最接近费用值,与费用值的差额为3。
考虑到不止一个费用,而是有成百上千个费用需要分摊,那么就得考虑利用程序来批量计算。按之前上学时的做法,写程序,通过程序调用数据生成模型来求解。这里就将数据保存到计事本中,然后用C语言根据计事本中的数据,生成模型求解,将求解结果返回到计事本中。
假设文本文件为data.txt,内容为编号,费用值两个内容,现在用C读取每行的费用值,生成模型求解,然后将结果保存到每行的结尾。
data.txt的内容:
1 1983
2 2023
3 2323
您好,我用Lingo10求解您这个模型得到的结果最优解是零解,想请教下为什么?
我自己做的时候,都测试过,应该没有问题,你再好好检查检查,而且上面有模型和LINGO程序,你可以复制下来试试。
不好意思,复制之后是对的,应该是我搞错了,向您道歉。还有别的模型想请教您,因为评论没办法放公式,不知道您方不方便通过邮件指导一下?我的邮箱是1109213257@qq.com。谢谢!