例 19(最小费用最大流问题)(续例18)由于输油管道的长短不一或地质等原因,

使每条管道上运输费用也不相同,因此,除考虑输油管道的最大流外,还需要考虑输油

管道输送最大流的最小费用。图 8 所示是带有运费的网络,其中第 1 个数字是网络的容

量,第 2 个数字是网络的单位运费。

图8 最小费用最大流问题

解 按照最小费用流的数学规划写出相应的 LINGO 程序如下:

model: sets: nodes/s,1,2,3,4,t/:d; arcs(nodes,nodes)/s 1,s 3,1 2,1 3,2 3,2 t,34,4 2,4 t/:c,u,f; endsets data: d=14 0 0 0 0 -14; !最大流为14; c=2 8 2 5 1 6 3 4 7; u=8 7 9 5 2 5 9 6 10; enddata min=@sum(arcs:c*f); @for(nodes(i):@sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=d(i)); @for(arcs:@bnd(0,f,u)); end

求得最大流的最小费用是 205,而原最大流的费用为 210 单位,原方案并不是最优

的。

类似地,可以利用赋权邻接矩阵编程求得最小费用最大流。LINGO 程序如下:

model: sets: nodes/s,1,2,3,4,t/:d; arcs(nodes,nodes):c,u,f; endsets data: d=14 0 0 0 0 -14; c=0; u=0; enddata calc: c(1,2)=2;c(1,4)=8; c(2,3)=2;c(2,4)=5; c(3,4)=1;c(3,6)=6; c(4,5)=3;c(5,3)=4;c(5,6)=7; u(1,2)=8;u(1,4)=7; u(2,3)=9;u(2,4)=5; u(3,4)=2;u(3,6)=5; u(4,5)=9;u(5,3)=6;u(5,6)=10; endcalc min=@sum(arcs:c*f); @for(nodes(i):@sum(nodes(j):f(i,j))-@sum(nodes(j):f(j,i))=d(i)); @for(arcs:@bnd(0,f,u)); end

求最小费用流的一种方法—迭代法

下面我们编写了最小费用最大流函数 mincostmaxflow,其中调用了利用 Floyd 算法

求最短路的函数 floydpath。

求解例 19 具体程序如下(下面的全部程序放在一个文件中):

function mainexample19 clear;clc; global M num c=zeros(6);u=zeros(6); c(1,2)=2;c(1,4)=8;c(2,3)=2;c(2,4)=5; c(3,4)=1;c(3,6)=6;c(4,5)=3;c(5,3)=4;c(5,6)=7; u(1,2)=8;u(1,4)=7;u(2,3)=9;u(2,4)=5; u(3,4)=2;u(3,6)=5;u(4,5)=9;u(5,3)=6;u(5,6)=10; num=size(u,1);M=sum(sum(u))*num^2; [f,val]=mincostmaxflow(u,c) %求最短路径函数 function path=floydpath(w); global M num w=w+((w==0)-eye(num))*M; p=zeros(num); for k=1:num for i=1:num for j=1:num if w(i,j)>w(i,k)+w(k,j) w(i,j)=w(i,k)+w(k,j); p(i,j)=k; end end end end if w(1,num) ==M path=[]; else path=zeros(num); s=1;t=num;m=p(s,t); while ~isempty(m) if m(1) s=[s,m(1)];t=[t,t(1)];t(1)=m(1); m(1)=[];m=[p(s(1),t(1)),m,p(s(end),t(end))]; else path(s(1),t(1))=1;s(1)=[];m(1)=[];t(1)=[]; end end end

%最小费用最大流函数 function[flow,val]=mincostmaxflow(rongliang,cost,flowvalue); %第一个参数:容量矩阵;第二个参数:费用矩阵; %前两个参数必须在不通路处置零 %第三个参数:指定容量值(可以不写,表示求最小费用最大流) %返回值 flow 为可行流矩阵,val 为最小费用值 global M flow=zeros(size(rongliang));allflow=sum(flow(1,:)); if nargin<3 flowvalue=M; end while allflow<flowvalue w=(flow<rongliang).*cost-((flow>0).*cost)'; path=floydpath(w);%调用 floydpath 函数 if isempty(path) val=sum(sum(flow.*cost)); return; end theta=min(min(path.*(rongliang-flow)+(path.*(rongliang-flow)==0).*M)); theta=min([min(path'.*flow+(path'.*flow==0).*M),theta]); flow=flow+(rongliang>0).*(path-path').*theta; allflow=sum(flow(1,:)); end val=sum(sum(flow.*cost));

数学建模常用Matlab/Lingo/c代码总结系列——最小费用最大流问题相关推荐

  1. matlab 回路最优,数学建模常用Matlab/Lingo/c代码总结系列——hamilton回路

    提供一种求解最优哈密尔顿的算法---三边交换调整法,要求在运行jiaohuan3(三交换法)之前,给定邻接矩阵C和节点个数N,结果路径存放于R中. bianquan.m文件给出了一个参数实例,可在命令 ...

  2. 数学建模常用算法——Lingo求解数学规划问题

    什么是数学规划? 数学规划是运筹学的 ⼀个分支,其用来研究:在给定的条件下(约束条件),如何按照某 ⼀衡量指标 (目标函数)来寻求计划. 管理工作中的最优方案 . 简而言之,就是求目标函数在 ⼀定约束 ...

  3. 数学建模常用读取excel和txt代码

    文章目录 一.matlab篇 1.1.读取.xls和.xlsx的数据 1.2.读取.csv的数据 二.python篇 2.1.pandas库 2.1.1.xlsx和xls的读取和写入 2.1.2.cs ...

  4. 【Python数学建模常用算法代码(二)之BP神经网络】

    Python数学建模常用算法代码(二) BP神经网络模型Python代码 import numpy as np import math import random import string impo ...

  5. 数学建模常用模型04:灰色关联分析法

    数学建模常用模型04:灰色关联分析法 灰色关联分析法 本文所用的资料参考来源:美赛资料网:美赛资料网 与灰色预测模型一样,比赛不能优先使用,灰色关联往往可以与层次分析结合使用.层次分析用在确定权重上面 ...

  6. 数学建模常用模型(一):灰色预测法

    数学建模常用模型(一):灰色预测法 灰色预测法是一种用于处理少量数据.数据质量较差或者缺乏历史数据的预测方法.它适用于一些非线性.非平稳的系统,尤其在短期预测和趋势分析方面有着广泛的应用.灰色预测法作 ...

  7. 数学建模matlab和python_参加数学建模用 MATLAB,还是 Python?

    你应该学习吉他还是钢琴?你应该学习足球还是篮球?你应该学习化学还是物理学?这些问题的答案取决于你的兴趣点在哪里,方向选择是什么,而后再说选什么 :让我们借助比较通俗的方式切入,来讨论Matlab和Py ...

  8. 数学建模——层次分析法Python代码

    数学建模--层次分析法Python代码 import numpy as np class AHP: """ 相关信息的传入和准备 """ d ...

  9. 数学建模——TOPSIS综合评价模型Python代码

    数学建模--TOPSIS综合评价模型Python代码 正常代码 import numpy as np # 导入numpy包并将其命名为np ##定义正向化的函数 def positivization( ...

最新文章

  1. ib_logfile 在数据库中有何作用?
  2. 多级NUMA:AMD EPYC互连速率、位宽与功耗的关系
  3. 技术无罪?谷歌AI伦理团队负责人被解雇
  4. Python变量和对象类型速记手册
  5. 2020年十月下旬,再次更新了自己的linkedin工作经历
  6. 转发:Ajax动态画EChart图表
  7. 2.2.2.进程调度的时机切换与过程、方式
  8. gulp之gulp.watch报错
  9. 小学计算机课程报告怎么写,小学计算机课论文摘要怎么写 小学计算机课论文摘要范文参考...
  10. nginx 的启动、停止与重启
  11. oracle exp不生成dumpfile,预估出实际导出文件的大小。
  12. 得到app产品体验报告
  13. Wireshark通过TCP协议抓取QQ好友IP以及定位
  14. MATLAB之模型仿真(一)简单自由落体运动
  15. 半小时体验云原生:手把手教你在k8s上部署springboot应用——干货分享,建议收藏
  16. 微信小程序——手机号登录
  17. c语言36块砖36人搬答案编程,在C语言中.36块砖,36人搬;男搬4,女搬3,两个小孩抬一块.要求一次搬完,问男女小孩各多少?设计程序....
  18. 唯一ID生成算法剖析
  19. 可汗学院 统计学习第一天
  20. 互联网行业人事频繁变动:高速发展之忧

热门文章

  1. B-树叶子个数和关键字个数间关系推导
  2. 英语中’s和s’的区别
  3. html5网页录音和语音识别
  4. YII CONCAT
  5. Proteus8.9 VSM Studio SDCC编译器仿真STC15W4K32S4系列013_iic_02_AT24C04
  6. 精致又小巧的3款黑科技软件,一旦使用,难以割舍
  7. liunx挖矿程序排查思路
  8. 书评与摘抄《白鹿原》
  9. Axure中动态面板中的“推动/拉动原件”
  10. 好诗分享_《我想和你一起生活 》