《运筹学》- 运输问题课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工厂原料运输问题课程设计报告
一、课程设计的目的
《运筹与最优化方法》是信息与计算科学专业的一门重要的专业课程,是一门综合应用课程。主要内容包括:线性规划、整数规划、动态规划、非线性规划、库存论、排队论、博奕论、图与网络分析的基本概念、方法和模型等,以及有广泛应用前景的运筹学问题的启发式算法。
《运筹学与最优化方法》中的运输问题是一种应用广泛的网络最优化模型,该模型的主要目的是为物资调运,车辆调度选择最经济的运输路线。
《运筹学与最优化方法》运输问题课程设计的目的是为了适应信息管理与信息系统培养目标的要求,使我们学习掌握如何应用运筹学中的数量方法与模型来分析通过计算机来实现研究现代企业生产与技术管理以及经营管理决策问题。课程设计使我们能成熟的理解和应用运筹学模型,使我们认识运筹学在生产与技术管理和经营管理决策中的作用,领会其基本思想和分析与解决问题的思路。为我们以后毕业参加工作单位的策略策划打下坚实的基础。
二、课程设计地点:
第三实验楼4楼, 运筹学实验室
三、课程设计时间:
第十八周,第十九周
四、课程设计原理与过程
(一)运输问题的内容及其解决方法
运输问题是一种应用广泛的网络最优化模型,该模型的主要目的是为物资调运、车辆高度选择最经济的运输路线。有些问题,如m 台机床加工零件问题、工厂合理布局问题,虽要求与提法不同,经适当变化也可以使用本模型求得最付佳方案。
运输问题的一般提法: 某种物资有m 个产地Ai ,产量是ai (i =1,2,…,m ),有m 个销售地Bi ,销量(需求量)是bj(j=1,2,…,m)。若从Ai 运到Bi 单位运价为dij(i=1,2,…,m;j=1,2,…,m),又假设产销平衡,即 ∑∑===m
i n
j j i b a 1
1
问如何安排运输可使总运费最小?
若用x ij (i=1,2,…,m;j=1,2,…,n)表示由A i 运到B j 的运输量,则平衡运输问题可写出以下线性规划模型: ∑∑===m
i n
j ij ij x d Z 11min
约束条件
⎪⎪⎪
⎩
⎪
⎪⎪
⎨⎧
==≥====∑∑==),...,2,1;...,2,1(0)...,2,1()...,2,1(11
n j m i x n j b x m i a x ij m i j ij n
j i ij 具体问题如下:
三个工厂B 1,B 2,B 3,它们需要同一种原料,数量分别是72吨、102吨、41吨,另外有三座仓库A 1、A 2、A 3可以供应上述原料56吨、82吨、77吨,由于工厂和仓库位置不同,单位运价不同,具体数据如表1。应如何安排运输方案,才能使总运费最小?
观察运输问题的线性规划模型可知:它有m*n 具变量,(m+n)个约束方程,其系数矩阵为0-1矩阵,且有大量的零,通常称为稀疏矩阵,形如:
x 11x 12 … x 1n x 21x 22 … x 2n … x m1x m2 … x mn
⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡⋯⋯⋯⋯⋯⋯⋯111111111111111111行行n m ⎪⎪
⎭
⎪
⎪
⎬⎫⎪
⎪⎭⎪⎪⎬⎫
易知此矩阵的任何一个m+n 阶子方阵对应的行列式等于零,所以系数矩阵的秩≤m+n-1,并可证明运输问题的约束方程组系数矩阵的秩为m+n-1.
由此可知运输问题只有m+n-1个独立的约束方程,即其基本可行解中基变量个数为m+n-1,其余均为非基变量。
由于运输问题的以上特征,可用更简便的方法进行计算,即表上作业法。 表上作业法原理同于单纯形法,首先给出一个初始的调运方案(实际上是初始基本可行解),求出各非基变量的检验数去判定当前解是否为最优解,若不是则进行方案调整(即从一个基本可行解转换成另一个基本可行解),再判定是否为最优解,重复以上步骤,直到获得最优解为止。这些步骤在表上进行十分方便。 操作过程在表上进行,具体的表如下: 表2
初始调运方案如下表:
若令λ
ij =d
ij
-(u
i
+v
j
)(d
ij
为非基变量所在的空格处的运费),称λ
ij
为空格检
验数。可以证明λ
ij
就是单纯形法中的检验数。所以用判定最优解的原则也同于
单纯形法中的判定定理。当λ
ij >0时,即可得到最优解,若λ
ij
≯0,则返回上一
级操作。直到得到最优解。
(二)运输问题课程设计源程序代码// #include "stdafx.h"
#include
#include
#include
#include
using namespace std;
#define a(j) (* (C+(M-1)*N+j)) // 销量数组
#define b(i) (* (C+i*N+N-1)) // 产量数组
#define c(i,j) (* (C+i*N+j)) // 运价数组
#define x(i,j) (* (X+i*(N-1)+j)) // 运量数组
const double BIG_NUM = 1.0E15; // 任意大数// ( < BIG_NUM: 基本解, >= BIG_NUM : 运量为0 )
#define s(i,j) (*(S+i*(N-1)+j)) // 检验数数组Sij */
#define u(i) (*(U+i)) // 位势数组Ui #define v(i) (*(V+i)) // 位势数组Vi #define cpi(k) ((CP+k)->i) // 闭回路点i 标#define cpj(k) ((CP+k)->j) // 闭回路点j 标#define cpf(k) ((CP+k)->f) // 闭回路点 f 标
/*
f = 0: j++;
f = 1: i--;
f = 2: j--;
f = 3: i++;
*/
void TP(int M,int N,double *C,double *X);
int main()
{
int M, N, i, j;
double* C; // 存储运价, 产量及销量
double* X; // 存储运量分配方案
double z;
ifstream infile;
char fn[80];
double sum;
cout.setf(ios_base::left,ios_base::adjustfield);
cout.setf(ios_base::fixed,ios_base::floatfield);
cout.precision(3);
cout<<"请输入数据文件名: ";
cin>>fn;
infile.open(fn);
if (!infile)
{