算例:

产销平衡算例:


计算结果:

产大于销算例:


计算结果:

销大于产算例:


计算结果:

代码如下:

%表上作业法求解运输问题
%要求每个产地和每个销地之间都可达(即运价不可以存在inf)function [x,sigma]=Transport(N,out,in)
%N:运价表   out:每个产地产量(按行输入)   in:每个销地销量(按行输入)
%x:最优运输方案sum_out=sum(out);
sum_in=sum(in);if sum_out>sum_in          %产大于销的情况,转换为产销平衡问题[old_row,old_col]=size(N);new=zeros(old_row,1);N=[N,new];in=[in,sum_out-sum_in];disp("该问题产大于销,方案最后一列为虚拟销地")
elseif sum_in>sum_out     %销大于产的情况,转换为产销平衡问题[old_row1,old_col1]=size(N);new1=zeros(1,old_col1);N=[N;new1];out=[out,sum_in-sum_out];disp("该问题销大于产,方案最后一行为虚拟产地")
elsedisp("该问题为产销平衡问题")
end[row,col]=size(N);
sigma=zeros(row,col);%定义检验数表
x=-ones(row,col);%定义初始运输表
ui=zeros(row,1);%定义ui
vj=zeros(1,col);%定义vj
out1=out;    %求初始方案的运算过程的产量out1
in1=in;       %求初始方案的运算过程的销量in1%求初始方案(西北角法)
for i=1:rowfor j=1:colif out1(i)==0out1(i)=-1;%若该产地产量为0,则置为-1,即划掉该行endif in1(j)==0in1(j)=-1; %若该销地销量为0,则置为-1,即划掉该列endif out1(i)>0&&in1(j)>0if out1(i)>in1(j)        x(i,j)=in1(j);           %若产量大于销量,则该销地销量填入方案out1(i)=out1(i)-x(i,j);  %该产地剩余的产量in1(j)=in1(j)-x(i,j);    %该销地剩余的销量else                       x(i,j)=out1(i);          %若销量大于产量,则直接将产地产量填入方案in1(j)=in1(j)-x(i,j);    %该产地剩余的产量out1(i)=out1(i)-x(i,j);   %该销地剩余的销量break;endendend
end%迭代过程
while 1
%求检验数(位势法)
for i=2:row  %初始化ui,除了第一个元素为0,其他所有ui元素变为infui(i)=inf;
end
for i=1:col  %初始化vj,所有vj元素变为infvj(i)=inf;
end
while 1    %求ui,vjchecku=find(ui==inf);checkv=find(vj==inf);if isempty(checku)&&isempty(checkv)  %当ui,vj都不为inf时,ui和vj计算完成,跳出循环break;endfor i=1:rowfor j=1:colif x(i,j)~=-1if ui(i)==inf&&vj(j)==inf%若ui,vj全为inf,则先跳过计算continue;elseif vj(j)==infvj(j)=N(i,j)-ui(i);%若vj为inf,ui不为inf,计算vjelseui(i)=N(i,j)-vj(j);%若ui为inf,vj不为inf,计算uiendendend    end
end
for i=1:row  %初始化检验数表,所有元素变为inffor j=1:colsigma(i,j)=inf; end
end
for i=1:row  %计算检验数表for j=1:colif x(i,j)==-1sigma(i,j)=N(i,j)-ui(i)-vj(j);          endend
end%判断是否得到最优方案
if sigma>0   disp("有唯一最优方案,最优方案为(表中-1表示空格):")
%  可将最优方案中的-1点变为0,更美观,若执行此操作,还应删去计算最小运价过程中的判断条件
%  当最优方案中存在运量为0时,此操作会影响对方案的阅读
%     for i=1:row
%        for j=1:col
%           if x(i,j)==-1
%               x(i,j)=0;
%           end
%        end
%     endxsum_min=0;for i=1:row   %计算最小运价for j=1:colif x(i,j)~=-1sum_min=sum_min+x(i,j)*N(i,j);endendenddisp("最小运价为:")sum_minbreak;
elseif sigma>=0disp("最优方案不唯一,其中一个为(表中-1表示空格):")
%   可将最终结果中的-1点变为0,更美观,若执行此操作,还应删去计算最小运价过程中的判断条件
%   当最优方案中存在运量为0时,此操作会影响对方案的阅读
%      for i=1:row
%        for j=1:col
%           if x(i,j)==-1
%               x(i,j)=0;
%           end
%        end
%      endxsum_min=0;for i=1:row  %计算最小运价for j=1:colif x(i,j)~=-1sum_min=sum_min+x(i,j)*N(i,j);endendend disp("最小运价为:")sum_minbreak;
end%闭回路调整法
visit=x;
for i=1:row        %初始化访问表,可以被访问的点标为0for j=1:colif visit(i,j)~=-1visit(i,j)=0;  endend
endm=min(sigma(sigma<0));%找到小于零的最小检验数m
[r2,c2]=find(sigma==m);%找到m的位置%记录m的行标和列标,由于可能出现检验数相同的情况,我们取其中第一个
r=r2(1);
c=c2(1);
r1=r2(1);
c1=c2(1); visit(r,c)=2;  %标记m已被访问,记为2
circle=-ones(row+col+1,3);  %定义闭回路路径表
%circle表的结构:[行标  列标  运量]%将起点(m点)填入路径表
circle(1,1)=r1;
circle(1,2)=c1;
p=2;%找闭回路
while 1  for i=1:row         %找第c列中有无未被访问的点if visit(i,c)==0  %若该点未被访问,则访问该点,进行标记并存入路径表visit(i,c)=1;r=i;           %记录该点行标circle(p,1)=i; circle(p,2)=c;circle(p,3)=x(i,c);p=p+1;break;endendfor j=1:col         %找第r行中有无未被访问的点if visit(r,j)==0 %若该点未被访问,则访问该点,进行标记并存入路径表visit(r,j)=1;c=j;          %记录该点列标circle(p,1)=r;circle(p,2)=j;circle(p,3)=x(r,j);p=p+1;break;endenda=find(visit(r,:)==0);b=find(visit(:,c)==0);a1=find(visit(r,:)==2);b1=find(visit(:,c)==2);if isempty(a)&&isempty(b)  %判断该点所在行和列中有无未被访问的点if ~isempty(a1)||~isempty(b1)  %判断最后访问点是否与起始点在同一行或同一列,若是则跳出循环,找到闭回路break;else           %若不是,则将该点置为-1(此路不通,下次循环不走此路),重置访问表和路径表,开始下一次循环visit(r,c)=-1;for i=1:rowfor j=1:colif visit(i,j)==1visit(i,j)=0;endendendr=r1;c=c1;circle=-ones(row+col,3);circle(1,1)=r1;circle(1,2)=c1;p=2;endend
end[rows,cols]=size(circle);
%定义circle表时我们给了足够大的维度,而由于闭回路可能无法包括所有点,现在要将多余行删去
for i=1:rows   if circle(i,1)==-1break;end
end
circle(i:rows,:)=[];%开始找闭回路中的顶点表
add=circle(1,:);
circle=[circle;add];  %将起始点填入circle表,形成完整的闭回路
[row1,col1]=size(circle);
i=1;%若闭回路中同一行或同一列中有两个以上的点,则删去中间点,只留下顶点
while 1             if i==row1-1break; endi=i+1;if (circle(i-1,1)==circle(i+1,1))circle(i,:)=[];row1=row1-1;i=i-1;endif (circle(i-1,2)==circle(i+1,2))circle(i,:)=[];row1=row1-1; i=i-1;end
end%由于起始点在闭回路中出现了两次,因此删去第二次出现的起始点
k=find(circle(:,3)==-1);
circle(k(2),:)=[];[row2,col2]=size(circle);%将顶点中奇数编号和偶数编号分开
%顶点表的结构:[行标  列标  运量]
if mod(row2,2)==0    %若顶点总数是偶数single=zeros(row2/2,3);  %定义奇数编号顶点表double=zeros(row2/2,3);  %定义偶数编号顶点表
end
if mod(row2,2)==1    %若顶点总数是奇数single=zeros(row2/2+0.5,3);   %定义奇数编号顶点表double=zeros(row2/2-0.5,3);   %定义偶数编号顶点表
endj1=1;
j2=1;
%将闭回路中的点按编号分别存入奇数顶点表和偶数顶点表
for i=1:row2if mod(i,2)==1single(j1,:)=circle(i,:);j1=j1+1;endif mod(i,2)==0double(j2,:)=circle(i,:);j2=j2+1;end
end%更新运量表
value=double(:,3);
[min_x,index]=min(value(value>=0));%找到偶数顶点的运量最小值及其位置
x(r1,c1)=min_x;       %把该运量最小值填入闭回路起始点的运量
x(double(index,1),double(index,2))=-1;  %把该偶数顶点的运量标记为-1
double(index,:)=[];    %将该偶数顶点从偶数顶点表中删去,以免影响后续计算[row3,col3]=size(single);
[row4,col4]=size(double);
%将奇数编号顶点的运量加上min_x
for i=2:row3x(single(i,1),single(i,2))=single(i,3)+min_x;
end
%将偶数编号顶点的运量减去min_x
for i=1:row4x(double(i,1),double(i,2))=double(i,3)-min_x;
end
end

MATLAB表上作业法解决运输问题相关推荐

  1. 平衡运输问题及其表上作业法---指派问题及其匈牙利解法

    一.平衡运输问题及其表上作业法 平衡问题及数学建模  平衡运输问题: 就是生产数量与销售数量相等的运输问题.对总产量等于总需求量的运输问题,可直接采用表上作业法求最优运输方案  数学模型:  2.表上 ...

  2. c语言实现运输问题表上作业法,运输问题的表上作业法

    <运输问题的表上作业法>由会员分享,可在线阅读,更多相关<运输问题的表上作业法(15页珍藏版)>请在装配图网上搜索. 1.2020/9/25,Chapter 06 中文资料运输 ...

  3. 【运筹学】运输规划、表上作业法总结 ( 运输规划模型 | 运输规划变量个数 | 表上作业法 | 最小元素法 | 差额 Vogel 法 ★ | 闭回路法 ) ★★★

    文章目录 一.运输规划模型 1.产销平衡模型 2.产销不平衡模型 二.运输规划数学模型变量个数 三.表上作业法 四.表上作业法 : 求初始基可行解 1.最小元素法 2.差额法 ( Vogel ) 推荐 ...

  4. 【运筹学】表上作业法 ( 最优解判别 | 初始基可行解 | 运费修改可行性方案 | 闭回路法 )

    文章目录 一.最优解判别 二.初始基可行解 三.运费修改可行性方案 四.闭回路法 一.最优解判别 在上两篇博客 [运筹学]表上作业法 ( 求初始基可行解 | 最小元素法 ) , [运筹学]表上作业法 ...

  5. 【运筹学】表上作业法 ( 最小元素法分析 | Vogel 方法 )

    文章目录 一." 最小元素法 " 分析 二.Vogel 方法 ( 差额法 ) 一." 最小元素法 " 分析 在上一篇博客 [运筹学]表上作业法 ( 求初始基可行 ...

  6. 【运筹学】表上作业法 ( 求初始基可行解 | 最小元素法 )

    文章目录 一.表上作业法 第一步 : 确定初始基可行解 二.最小元素法 一.表上作业法 第一步 : 确定初始基可行解 运输问题如下 : 下面的表格代表 333 个产地 , 444 个销地 的运输规划问 ...

  7. 【运筹学】运输规划 ( 运输规划问题模型及变化 | 表上作业法引入 )

    文章目录 一.运输规划问题模型及变化 二.运输规划问题求解 ( 表上作业法 ) 一.运输规划问题模型及变化 运输规划问题一般形式 ( 产销平衡 ) : m\rm mm 个产地 : A1,A2,A3,⋯ ...

  8. 【运筹学】表上作业法 ( 示例 | 使用 “ 最小元素法 “ 找初始基可行解 )

    文章目录 一.运输规划问题 二.找初始基可行解 一.运输规划问题 运输规划问题 : B1\rm B_1B1​ B1\rm B_1B1​ B1\rm B_1B1​ B1\rm B_1B1​ 产量 A1\ ...

  9. 运筹学—运输问题与表上作业法

    西北角法 不考虑运价,从西北角的格子开始分配运量,按尽可能满足一方取小的原则,第一行和第一列的格子分配完后,依次向东南角方向的格子进行运量分配. 例如: 第一步:列出产售平衡表 第二步:利用西北角法进 ...

  10. python求解运输问题_【Python实现】运输问题的表上作业法:利用伏格尔 (Vogel) 法寻找初始基可行解...

    #运输问题求解:使用Vogel逼近法寻找初始基本可行解 import numpy as np import pandas as pd import copy #定义函数TP_vogel,用来实现Vog ...

最新文章

  1. 这是一次 docker 入门实践
  2. socket websocket
  3. microsoft office 卸载不了
  4. jdk11 后用的指定编码格式,读取文件
  5. linux下软件的基本安装和卸载
  6. web基础编程-图片管理网站
  7. 深入了解Delphi 7中的四种消息框
  8. MYSQL中的SELECT查询时进行运算
  9. Python基础---循环、条件判断
  10. building for iOS simulator, but linking in object file built for tvOS, for architecture x86_64
  11. 录音转文字 android,录音转文字pro
  12. DirectAdmin安装Zend Optimizer
  13. POI 2014 切题记
  14. 石大远程在线考试计算机网络课程设计,20202021石大远程在线考试——《计算机网络课程设计》在线考试主观题参考资料答案.docx...
  15. 在cmd 中输入了错误mysql命令后,如何退出?
  16. Php大马的简单解密[技巧]
  17. UnityVR--小程序3--金色的子弹1
  18. bios 升级后win7无法启动的一个可能原因
  19. 计算机病毒与网络安全的小报,关于网络安全手抄报内容
  20. Autoware-激光雷达目标检测与跟踪

热门文章

  1. chirp信号频谱(三角波和锯齿波)
  2. 「硬见小百科」30个EMC标准电路分享
  3. 下载 Eclipse 中文语言包进行汉化
  4. 随机森林模型保存-python
  5. 犀牛插件-插件开发-rhino-插件开发形式
  6. sd卡计算机无法读取数据,怎么强制格式化sd卡-内存卡突然无法读取、数据损坏……整个人都是崩溃的!...
  7. unity3d UniWebView插件的使用和经验
  8. java ascii 排序_java 根据 ASCII 码表顺序升序排列
  9. mldn出品java风暴_MLDN出品JAVA风暴-JAVA学习的终极资料
  10. h5策划书_一个成功的H5策划方案有哪些注意的点