运输问题c++

算法描述:

1.按照要求输入二维数组c以及行向量a与b,c表示运价,a表示产量,b表示销量
2.先求出总销量与总产量,再通过两者对比判断是否为产销平衡的问题。如果不是,那就将其转化成产销平衡的问题。
3.用最小值法求出初始解,通过不断比较产量和销量的值,选取最小量的归零,并记录下初始基解的位置,如果产量和销量相等的话就会出现退化的情况,在该基解的同一行内寻找一个最小值作为额外基变量即可。
4.位势法求检验数:通过将u,v的值与下边分开存储,分开计算。先对u,v都定义为0的数组,然后v的指针初始值取0,u的指针初始值取1。这样就能够实现对第一个u赋值为0的操作。再利用基变量检验数为0的特点,迭代计算出u和v的值。
5.求检验数:公式 thoat(i,j)= a(i,j)-u(i)-v(j);
6.判断检验数是否为非负,若为1,则输出。
7.若不是全部非负,那么获取最小检验数所在的位置,作为换入变量。
8.改进运输方案:根据总结的经验可知,要构成一个回路,回路之间的每一个量至少存在与他们的横坐标或者是纵坐标相同的量各一个,所以我们只要去除掉只有一行有或者一列有的基变量就能够得到回路的路线。这其中应用的原理还有:一个空格只能构成一个回路,基变量之间不能构成回路。
9.去掉后的矩阵只有换入变量和回路上的基变量,先将换入变量换到1号位然后通过排序将有共同横坐标或者共同纵坐标的量顺接在一起,便于之后的统计。
10.寻找闭回路上面的最小值,进行换基变换。
11.修正基变量坐标进入4步骤迭代。

代码如下:

function [x,result] = work1(c,a,b)
%产销平衡的运输问题求解
%c表示运价
%a表示产量之和
%b表示销量之和
%计算产量之和以及销量之和
[m,n]=size(c);%获取c的行数和列数
total1=sum(a);
total2=sum(b);
%如果判断到不是产销平衡问题,那就添加差值进入相应的向量
if total1>total2              
    c=[c,zeros(m,1)];
    b=[b,total1-total2];  
elseif total2>total1                      
    c=[c;zer
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值