表上作业法的源代码
表上作业法
调整:找到新的调运方案
方法:闭回路法
➢闭回路法
基本思想:确定换入、换出变量。在闭回路上 采用“奇加偶减”调整运量xij,闭回路以外xij
不变。
方法要点:
换入变量:最小负检验数对应的非基变量; 换出变量:以换入变量为起点找到相应的闭回路,回路 上其它顶点为基变量,偶数顶点上最小的xij所对应的基变 量就是换出变量,这个最小的xij的值就是调整量; 调整方法:闭回路上,奇数顶点上xij加上调整量,偶数顶 点上xij减去调整量;闭回路以外的点对应的xij不变。
产地 销 地 B 1
A1
-4
2
3
A2
13
A3
78
销量
3
B2 95
3 -1
43
8
B3 3 10 1 4
24 4
B4
产量
7 41 9
2 25 5
35
7
6
产地
销地
A1 A2 A3 销量
B1
23
1
8
3
B2 95 3
43
8
B3 10 4 24 4
B4
71
25
5
6
产量 9 5 7
4.2 表上作业法
▪算法思想
与单纯形法一样,最优解在基本可行解中产生。 但基于模型的特征,初始基本可行解是通过分析单位运价表, 首先满足局部最优,然后通过调整(迭代)使整体达到最优。
-------单纯形法的简化方法
▪算法流程及要点
初始调运方案
检验数ij0 ? N
Y 最优解
调整:找到新的调运方案
B3 3 10 24
24 4
物流 表上作业法与图上作业法
1
A13 5
(3)
(1)
1
4
B1
2
(1)
4
B2
3
该是收点数+发点数-1。图上作 1 业法要求在流向图上的箭头数( 有调运量的边数)也应为收点数 +发点数-1。这一要求也可以等 (1) 2 价地表述为:在去线破圈后得到 的不成圈的交通图上,要求每边 都应该有流向。 (2) 3 A2
B3
3
• 因此,某一边无流向时,必须在这一边上添上调运量为0的虚流 向,和其它流向同样对待。按照这一要求,应在A3边上添上虚 流向。于是,再补上去掉的边,得下图:
工地800需求量t2503003504005001800工地800需求量t250300350400500180030025050300运费21001300240022005250420075083006500工地300200400100200250503002131工地300200400100300250502001工地30040020010030025050200运费31001300240022005250430075072006000课后作业销地产地657075销量50455560210无分支不闭合运输回路60303025有分支不闭合运输回路101518022070607590806513011010016017015010080b4b3b2b1a4a2a3a128018031711811816516525234953525520302020有某物资7t由发出点a1a2a3发出发量分别为331t运往收点b1b2b3b4收量分别为2311t收发量平衡交通图如下图问应如何调动才使tkm最小
• 四个销售地,每天的 需求量为:B1:3吨, B2:6吨,B3:5吨, B4:6吨。运价表如 图所示
表上作业法
运输问题的求解方法——表上作业法产销平衡表与单位运价表表上作业法一、产销平衡表与单位运价表运输问题还可用产销平衡表与单位运价表进行描述。
假设某种物资有m个生产地点Ai(i=1,2,…,m),其产量(供应量)分别为ai(i=1,2,…,m),有n个销地Bj(j=1,2,…,n),其销量(需求量)分别为bj(j=1,2,…,n)。
从Ai到Bj运输单位物资的运价(单价)为Cij。
将这些数据汇总可以得到产销平衡表和单位运价表5.3.1。
表5.3.1 产销平衡表与单位运价表二、表上作业法运输这一类特殊问题可用更加简便的求解方法———表上作业法求解,实质仍是单纯形法,步骤如下:(1)确定初始调运方案,即找出初始基可行解,在产销平衡表上给出m+n-1个数字格。
(2)求非基变量的检验数,即在表上计算空格的检验数,判别是否达到最优解:是否存在负的检验数?如果存在负的检验数,则初始调运方案不是最优方案;如果所有检验数都非负,则初始调运方案已经是最优方案了。
如果已经得到最优调运方案,则停止计算,否则转入下一步。
(3)确定换入变量和换出变量,找出新的调运方案(新的基可行解),即在表上用闭回路法进行调整。
(4)重复(1)~(2),直到求出最优解为止。
(一)确定初始可行基的方法⏹最小元素法从单位运价表中最小的运价开始确定供销关系,然后考虑运价次小的,一直到给出初始基可行解为止。
⏹伏格尔法采用最小元素法可能造成其他处的更多浪费,伏格尔法考虑最小运费与次小运费之间的差额,差额越大,就按次小运费调运。
(二)最优解的判别计算非基变量(空格)的检验数,当所有的检验数时,为最优解。
求空格检验数的方法有:⏹闭回路法以某一空格为起点找一条闭回路,用水平或垂直线向前划,每碰到一数字格转900后,继续前进,直到回到起始空格为止。
闭回路如图5.3.1的(a)、(b)、(c)等所示。
从每一个空格出发一定存在并且可以找到唯一的闭回路。
因为,m+n-1个数字格(基变量)对应的系数向量是一个基,任一空格(非基变量)对应的系数向量是这个基的线性组合。
[物流管理]表上作业法
表上作业法什么是表上作业法表上作业法是指用列表的方法求解线性规划问题中运输模型的计算方法。
是线性规划一种求解方法。
当某些线性规划问题采用图上作业法难以进行直观求解时,就可以将各元素列成相关表,作为初始方案,然后采用检验数来验证这个方案,否则就要采用闭合回路法、位势法等方法进行调整,直至得到满意的结果。
这种列表求解方法就是表上作业法。
表上作业法的步骤1、找出初始基本可行解(初始调运方案,一般m+n-1个数字格),用西北角法、最小元素法;(1)西北角法:从西北角(左上角)格开始,在格内的右下角标上允许取得的最大数。
然后按行(列)标下一格的数。
若某行(列)的产量(销量)已满足,则把该行(列)的其他格划去。
如此进行下去,直至得到一个基本可行解。
(2)最小元素法:从运价最小的格开始,在格内的右下角标上允许取得的最大数。
然后按运价从小到大顺序填数。
若某行(列)的产量(销量)已满足,则把该行(列)的其他格划去。
如此进行下去,直至得到一个基本可行解。
注:应用西北角法和最小元素法,每次填完数,都只划去一行或一列,只有最后一个元例外(同时划去一行和一列)。
当填上一个数后行、列同时饱和时,也应任意划去一行(列),在保留的列(行)中没被划去的格内标一个0。
2、求出各非基变量的检验数,判别是否达到最优解。
如果是停止计算,否则转入下一步,用位势法计算;运输问题的约束条件共有m+n个,其中:m是产地产量的限制;n是销地销量的限制。
其对偶问题也应有m+n个变量,据此:σij = c ij− (u i + v j) ,其中前m个计为,前n个计为由单纯形法可知,基变量的σij = 0c ij− (u i + v j) = 0因此u i,v j可以求出。
3、改进当前的基本可行解(确定换入、换出变量),用闭合回路法调整;(因为目标函数要求最小化)表格中有调运量的地方为基变量,空格处为非基变量。
基变量的检验数σij = 0,非基变量的检验数。
表上作业法中初始方案均为
表上作业法中初始方案均为哎呀,说起表上作业法,这可真是个让人又爱又恨的家伙!咱今天就好好聊聊这其中初始方案的事儿。
表上作业法呀,就像是我们解决运输问题的一把神奇钥匙。
而初始方案呢,那就是打开这扇神奇大门的第一步。
你想想,就好比你要去一个陌生的地方探险,出发的第一步是不是特别关键?这初始方案也是一样的道理。
在实际生活中,我曾经碰到过这么一件事儿。
有一家小工厂,要把生产的货物运到各个销售点去。
老板愁眉苦脸地找到我,说运输成本太高啦,快撑不住啦!我一看他们的运输计划,好家伙,这哪有什么合理的方案呀,完全是瞎搞。
我就决定用表上作业法来帮帮他。
一开始的初始方案,那真是乱得像一团麻。
比如说,从工厂 A 到销售点 B 的运输量,居然是随意定的,一点依据都没有。
这就像是闭着眼睛走路,能不栽跟头嘛!咱们来说说这初始方案到底为啥这么重要。
初始方案就像是盖房子的地基,如果地基打得歪歪扭扭,那这房子能牢固吗?同样的道理,如果初始方案不合理,后面的调整优化那可就费劲啦,甚至可能越搞越糟糕。
那初始方案都有哪些类型呢?常见的有西北角法、最小元素法等等。
就拿西北角法来说吧,先从表格的西北角开始填数,听起来是不是有点神奇?其实就是按照一定的规则,先从最开始的位置入手,逐步填满整个表格。
比如说,还是那个小工厂的例子。
用西北角法来制定初始方案,先从工厂 A 和销售点 D 的交叉位置开始,看看能运多少货物。
然后再按照顺序,一步一步来,这样就能得到一个初步的方案。
虽然这个方案不一定是最优的,但至少是一个有章可循的开始。
再说说最小元素法。
这个方法呢,是先找出运价最小的单元格,优先满足它的运输需求。
这就像是先解决最容易解决的问题,把简单的搞定了,再去攻克那些难的。
还回到那个小工厂,用最小元素法的时候,先找到运价最低的那个运输路径,比如说从工厂 C 到销售点 B,然后根据需求确定运输量。
这样一轮一轮下来,初始方案也就有了个模样。
但是要注意哦,不管用哪种方法得到的初始方案,都只是一个开头,后面还需要不断地检验、调整,才能找到最优方案。
《表上作业法》
《表上作业法》《表上作业法》是一种求解指派问题的优化算法。
这种算法通过在表格中进行标记和计算,找出最优解或可行解,使得分配问题得到最优质的解决方案。
以下是关于《表上作业法》的详细介绍。
1.背景和目的《表上作业法》是一种针对指派问题的优化算法,旨在寻找最优解或可行解,使得分配问题得到最优质的解决方案。
它是一种常见的数学优化方法,适用于各种类型的分配问题,如任务分配、资源分配和决策制定等。
通过使用《表上作业法》,可以在给定的一组选项中,为每个任务或资源选择最佳的分配方案,以达到最优的效果或目标。
2.方法和步骤《表上作业法》的核心思想是将指派问题转化为表格形式,通过在表格中进行标记和计算,找出最优解或可行解。
《表上作业法》可以在一个给定的任务集合中选择一个任务来完成,使得选择的每个任务的综合评估值最大。
它包括以下步骤:(1)定义问题:首先,要明确指派问题的具体目标、任务集合、每个任务的评估值和约束条件等。
(2)建立表格:根据指派问题的任务集合和评估值,建立一个合适的表格。
表格的行代表各个任务,列代表可用的资源或选择方案。
在表格中,每个单元格表示某个任务在某个资源或选择方案下的评估值。
(3)填表:根据问题的约束条件和每个任务的评估值,填写表格中的各个单元格。
填表过程中要确保表格的可行性,即满足所有约束条件。
(4)寻找最优解:在填好表格后,通过一定的搜索策略,找出使得综合评估值最大的任务分配方案。
(5)输出结果:输出找到的最优解或可行解,分析每个任务被分配的情况以及对应的评估值。
3.应用和优势《表上作业法》适用于各种类型的指派问题,如任务分配、资源分配和决策制定等。
它具有以下优势:(1)直观易懂:《表上作业法》通过表格形式展示问题,使得问题更加直观易懂。
(2)容易实现:《表上作业法》算法流程清晰明了,容易实现,不需要太多的编程技巧。
(3)可扩展性强:《表上作业法》可以扩展到处理大型复杂的问题,可以有效地处理大规模问题。
第二节运输问题求解表上作业法-精品文档
应用西北角法、最小元素法和 Vogel法,每次填完数,都只划去一 行或一列,只有最后一个元例外(同 时划去一行和一列)。当填上一个数 后行、列同时饱和时,也应任意划去 一行(列),在保留的列(行)中没 被划去的格内标一个0。
11
[例 3-2] 某食品公司下属的 A1、A2、 A3 ,3 个厂生产方便食品,要运输到 B1、 B2、B3、B4 ,4 个销售点,数据如下: 表1 B1 B2 A1 3 11 A2 1 9 A3 7 4 销量 bj 3 6 求最优运输方案。 B3 3 2 10 5 B4 产量 ai 10 7 8 4 5 9 6 20(产销平衡)
(1)西 北 角 法 B3 B4 10
产量 ai 7
8 2 5 3 6 6
4
9
销量 bj
3
6
5
20
14
( 2) 最 小 元 素 法 B1 B2 A1 3 11
B3 3 4 10
B4
产 量 ai 7 3
A2
1 3
9
2 1
8
4
A3
7
4 6
10
5 3 5 6
9
销 量 bj
3
6
2015
( 2) 最 小 元 素 法 B1 B2 A1 3 11
(4)若运输平衡表中所有的行与列均被 划去,则得到了一个初始基本可行解。否 则在剩下的运输平衡表中选下一个变量, 转(4)。
4
上述计算过程可用流程图描述如下
取未划去的单元格xij ,令 xij = min { ai , bj }
ai’ = ai - xij bj’ = bj - xij
否
ai’ = 0?
第二节 运输问题求解 —表上作业法
北邮运筹学ch33 表上作业法.ppt
Transportation Simplex Method
2020/1/31
Page 12 of 36
【解】 求行差额 ui, i=1,2,3及列差额vj,j=1,2,3,4.计算公式为 ui= i行次小运价—i行最小运价 vj= j列次小运价—j例最小运价
销地
B1
B2
B3
B4
ai ui
产地
A1
5
×
这里λ34<0,说明这组基本可行解不是最优解。
只要求得的基变量是正确的且数目为m+n-1,则某个非基变量的闭 回路存在且唯一,因而检验数唯一。
北京邮电大学 运筹学
§3.3 表上作业法 Ch3 Transportation Problem
Transportation Simplex Method
2020/1/31
Page 5 of 36
产地 销地
A1
A2
A3 未满足
量
B1
B2
B3
可发量
20 8
15 4
25 7
642005
6 30
3
4 30 0
10
7
320 0
5
410 5
8
20 5
100
100
北京邮电大学 运筹学
§3.3 表上作业法 Ch3 Transportation Problem
810 5 10
C
25
115
20
15 15
8 C 215
15
510 10
15
20
15
前一种按最小元素法求得,总运费是Z1=10×8+5×2+15×1=105, 后一种方案考虑到C11与C21之间的差额是8-2=6,如果不先调运x21, 到后来就有可能x11≠0,这样会使总运费增加较大,从而先调运x21, 再是x22,其次是x12这时总运北费京邮Z电2=大1学0×运筹5学+15×2+5×1=85<Z1。
第二节运输问题求解表上作业法
即从 Ai 向 Bj 运最大量(使行或列在 允许的范围内尽量饱和,即使一个约 束方程得以满足),填入 xij 的相应位 置; (2) 从 ai 或 bj 中分别减去 xij 的值,即调整 Ai 的拥有量及 Bj 的需 求量;
3
(3) 若 ai = 0 ,则划去对应的行(把 拥有的量全部运走),若 bj = 0 则划去 对应的列(把需要的量全部运来),且每 次只划去一行或一列(即每次要去掉且只 去掉一个约束);
—表上作业法
我们已经介绍过,可以通过增加虚 设产地或销地(加、减松弛变量)把问 题转换成产销平衡问题。
1.产量大于销量的情况
考虑 si > dj 的运输问题,得到的数学模 型为
i=1 j=1
39
m
n
2.运输问题求解
—表上作业法
Min f =
n m i=1 j=1
n
cij xij
s.t. xij si i = 1,2,…,m
10
应用西北角法、最小元素法和 Vogel法,每次填完数,都只划去一 行或一列,只有最后一个元例外(同 时划去一行和一列)。当填上一个数 后行、列同时饱和时,也应任意划去 一行(列),在保留的列(行)中没 被划去的格内标一个0。
11
表1
12
13
14
15
16
二、基本可行解的最优性检验
最优性检验就是检查所得到的方 案是不是最优方案。 检查的方法----计算检验数 由于目标要求极小,因此,当所 有的检验数都大于或等于零时该调运 方案就是最优方案;否则就不是最优, 需要进行调整。
第二节 运输问题求解 —表上作业法
运输问题的方法 —— 表上作业法: 1、确定一个初始基本可行解; 2 、根据最优性判别准则来检查这 个基本可行解是不是最优的。如果 是则计算结束;如果不是,则至3 3、换基,直至求出最优解为止。
表上作业法中初始方案均为
表上作业法中初始方案均为关键信息项:1、表上作业法的定义和适用范围2、初始方案的生成方式3、初始方案的优化原则4、优化过程中的约束条件5、结果评估与验证方法1、引言表上作业法是一种用于解决运输问题、分配问题等线性规划问题的有效方法。
在运用表上作业法时,初始方案的确定至关重要,它直接影响到后续的优化过程和最终的解决方案。
11 表上作业法的基本概念表上作业法是通过在表格上进行运算和调整,以求得最优解的一种方法。
它将实际问题转化为表格形式,便于直观分析和操作。
111 适用场景适用于物资调运、生产任务分配、人员安排等多种资源分配问题。
2、初始方案的生成21 最小元素法优先满足单位运价最小的供销关系,逐步填充运量,从而得到初始方案。
211 操作步骤依次选择单位运价最小的单元格,确定其运量,同时要满足供应和需求的限制条件。
22 西北角法从表格的西北角开始分配运量,逐行或逐列进行,直至满足所有的供应和需求。
221 具体流程先从表格的左上角开始分配,按照先列后行或先行后列的顺序进行。
23 伏格尔法通过计算每行和每列的罚数,选择罚数最大的行或列进行运量分配,以得到更接近最优解的初始方案。
231 罚数的计算方法罚数等于次小运价与最小运价之差。
3、初始方案的优化原则31 闭回路调整法通过构建闭回路,对运量进行调整,以降低运输总成本。
311 闭回路的构建规则从一个空格出发,沿水平或垂直方向前进,遇到有数字的格转向,最终回到起始空格。
32 调整运量的原则选择调整量为闭回路上偶数顶点运量的最小值。
321 调整后的检验调整后需要重新计算总运输成本,判断是否达到更优的方案。
4、优化过程中的约束条件41 供应约束各供应点的供应量必须得到满足,不能超额供应。
411 需求约束各需求点的需求量必须得到满足,不能出现缺货情况。
42 非负约束运量必须为非负数。
421 整数约束在某些实际问题中,运量可能要求为整数。
5、结果评估与验证51 目标函数值计算总运输成本,作为评估方案优劣的主要指标。
作业调度算法源代码
作业调度算法源代码#include <stdio.h>#include <stdlib.h>#define ReadyLimit 5typedef struct job{int id;int needtime;int arrivetime;int starttime;int finishtime;int remainder;float priority;struct job *next;} jobnode,*jobnodeptr;jobnodeptr joblist,readylist,runlist,collectlist; int systime;void init(void){joblist=(jobnodeptr)malloc(sizeof(jobnode)); joblist->id=-1;joblist->next=NULL;readylist=(jobnodeptr)malloc(sizeof(jobnode)); readylist->id=-1;readylist->next=NULL;collectlist=(jobnodeptr)malloc(sizeof(jobnode));collectlist->id=-1;collectlist->next=NULL;runlist=NULL;systime=-1;}void file2joblist(void){FILE *fp;jobnodeptr p,q;int i,j;fp=fopen("input.txt","rt");if (!fp){printf("Can't open file");exit(1);}p=joblist;fscanf(fp,"%d",&i);for (j=0;j<i;j++){q=(jobnodeptr)malloc(sizeof(jobnode));fscanf(fp,"%d%d%d",&q->id,&q->needtime,&q->arrivetime); q->starttime=0;q->finishtime=0;q->remainder=q->needtime;q->priority=-1.0;p->next=q;p=q;}p->next=NULL;fclose(fp);}void jobdispatch(void)/*作业调度*/{jobnodeptr p,q;int count=0;float maxpri;p=readylist;/*计算readylist中进程的个数*/while (p->next){count++;p=p->next;}if (count>=ReadyLimit) return;p=joblist->next;/*计算已到达作业的响应比*/while (p){if (p->arrivetime<=systime)p->priority=(systime-p->arrivetime)/(float)p->needtime; p=p->next;}while (count<ReadyLimit){maxpri=-1.0;p=joblist;q=NULL;while (p->next){if (p->next->priority > maxpri){maxpri = p->next->priority; q = p;}p=p->next;}if (q){p=q->next;q->next=p->next;p->next=NULL;q=readylist;while (q->next)q=q->next;q->next=p;p->starttime=systime;count++;}else break;}}void processdispatch(void)/*进程调度*/{runlist=readylist->next;if (runlist) {readylist->next=runlist->next;runlist->next=NULL;}}void running(void)/*模拟运行*/{jobnodeptr p;if (runlist){printf("%4d:%-4d ",systime,runlist->id);runlist->remainder--;if (runlist->remainder){p=readylist;while (p->next)p=p->next;p->next=runlist;}else{runlist->finishtime=systime;p=collectlist;while (p->next&& (p->next->starttime < runlist->starttime) /*&& (p->next->id < runlist->id)*/)p=p->next;runlist->next=p->next;p->next=runlist;}runlist=NULL;}else printf("%4d:idle ",systime);}void display(void)/*显示信息*/{jobnodeptr p;printf("id----- need--- arrive- start-- finish-\n");p=collectlist->next;while (p){printf("%-7d %-7d %-7d %-7d %-7d\n",p->id,\p->needtime,p->arrivetime,p->starttime,p->finishtime); p=p->next;}}void freeall(void){jobnodeptr p,q;p=collectlist;while (p){q=p;p=p->next;free(q);}free(joblist);free(readylist);}int main(void){init();file2joblist();while (1){systime++;jobdispatch();processdispatch();running();if (joblist->next==NULL && readylist->next==NULL)break;}printf("\n\n"); display();freeall();getchar();return 0;}。
关于表上作业法
至 从
生产、运输总费用表(万元) P1 P2 P3 8.00 7.65 7.15 7.08 4000 7.80 7.50 7.05 7.20 8000 7.70 7.35 7.18 7.50 7000
P4 7.80 7.15 7.65 7.45 6000
年产量(台) 7000 5500 12500 12500
7.35
7.50
7000
同样可得设厂于F4处的全部费用至少是 C4=7000×7.70+5500×7.15+4000×7.08+8000×7.20+500×7.45 =182870(万元) 两方案比较C4>C3,所以选F3设厂为优,可节省生产运费: C4 - C3=182870 - 181865=1005(万元)
设厂于F4处的产量分配
从 F1 F2 F4 需求量(台) 至 P1 8.00 7.65 7.08 ① 4000 4000 P2 7.80 7.50 7.20 ③ 8000 8000 P3 ⑤ 7000
7.70
P4 7.80 0 7.15 ② 5500 7.45 ④ 500 6000
年产量(台) 7000 5500 12500 25000
例题:已有两个工厂F1和F2,供应4 例题:已有两个工厂F1和F2,供应4个销售点 P1、P2、P3、P4。由于需求量不断增加,须 P1、P2、P3、P4。由于需求量不断增加,须 再设一个工厂。可供选择的地点是F3和F4。 再设一个工厂。可供选择的地点是F3和F4。 试求:在其中选择一最佳厂址。根据资料分 析,各厂单位产品生产和运输费用的总费用, 如表所示。约束条件是工厂不能超过其生产 能力;销售点不能超过其需求量。
mn j =1 ຫໍສະໝຸດ j目标函数: 目标函数:Min
调运问题---表上作业法
调运问题---表上作业法基本思路:1.建立供需平衡运价表2.用最小元素法求出初始调运方案3.用位势法检验初始调运方案4.用闭合回路法调整初始调运方案5.重复步骤3~4,直到出现最优调运方案6.计算最少总运费在供销不平衡的情况下,可用以下办法进行解决:1〉供大于求---引入虚拟需求点,其需求量等于实际供应量与需求量之差,该点运价为零。
2〉供小于求---引入虚拟供应点,其供应量等于实际需求量与供应量之差,该点运价为零。
例题:设有5个产地A1、A2、A3、A4、A5和4个销地B1、B2、B3、B4的运输问题,他们的供应量和需求量及单位运费如下表,试计算其最小运输成本。
解:1〉该案例属于供需平衡,下面直接用最小元素法求出初始调运方案。
①在所有运价中,找出最小运价为0,该运价对应的需求量为10,供应量为40,即需求量可以得到全部满足。
将调运数量和A4、B4的剩余供需数量在表上做出记号,同时由于B4的需求已经满足,可以划去该列其他的各个运价。
结果如下:③在剩下的运价中,最小运价为3,调运结果如下:⑧在剩下的运价中,最小运价为20,调运结果如下:2〉用位势法检验初始方案是否为最优。
①设有调运数量的运价Dij=Ui+Vj,i为行数,j为列数。
可以列出如下方程组:20=U1+V29=U2+V24=U3+V115=U3+V27=U4+V21=U4+V30=U4+V43=U5+V1设U4=0,分别求出U1~U5和V1~V4,如下表所示②设没有调运量的运价为Cij,如果Cij不小于Ui+Vj,检验通过;否则在该运价上做记号,等待下一步调整。
最终检验结果如下:③第一次调整。
对C13调整。
为其寻找另外三个有调运量的价格元素,使这四个元素在表中形成矩形,即闭合回路。
然后按照“最小运量,加减加减”的原则进行调整,过程如下:20/10 57/10 1/20调整为20 5/107/20 1/10第一次调整后的调运方案和新的U、V如下:对该方案进行检验,结果如下:④第二次调整。
4-02运输问题表上作业法
例 设m=3,n=4,决策变量xij表示从产地Ai 到销地Bj的调运量,列表如下,给出闭回路
{x1,1x1,3x3,3x3,4x2,4x2}1 在表中的表示法——
用折线连接起来的顶点变量。
B1
B2
B3
B4
A1
X11
X12
A2
X21
X22
A3
X31
X32
X13
运输问题的计算机求解
牢; (满足产量划去“行”,修改“列销”要记 牢) 划去列(行)对《运价》, 修改“行产(列销)”在《产销》; 余表再来找最小,方案很快就找到。
用西北角法确定例3-2初始调运方案
调 销地
运 量
B1
B2
B3
产量
产地
100 90 100 70
100 200 100
A1
X11
X12
X13
80 50 65 200 75 250 200
4-02运输问题表上作业法
单击此处添加副标题内容
运输问题的表上作业法
1、单纯形法(为什麽?) 2、表上作业法
由于问题的特殊形式而采用的更简洁、更方 便的方法
一、表上作业法的基本思想
先设法给出一个初始方案,然后根据确定 的判别准则对初始方案进行检查、调整、改 进,直至求出最优方案,如图3-1所示。
的公式
σij=cij-(ui+vj)
(3-8)
在 式 ( 3-7 ) 中 , 令 u1=0 , 则 可 解 得 v1=90 , v3=100,u2=-25,v2=90,于是
σ12=c12-(u1+v2)=70-(0+90)=-20
表上作业法
1
2
ij = C ij - ( U i + V j)
2
空格
令U1=0
3
3
11 12 22 24 31 33
3 (U 1 V 1 ) 1 1 (U 1 V 2 ) 9 (U 8 (U 7 (U
初始调运方案调整过程
表上作业法
(3)初始调运方案的调整
初始调运方案检验系数表
检验数都非负,则调整方案是最优方案。 最优方案的运费为85(千元),节约了2(千元)。
2
V2 ) V4 ) (U
V3 )
检验数小于0,说明该方案不是最优方案,需做 进一步调整。
表上作业法
•
(3)初始调运方案的调整
调整对象
对于表上作业法的初始调运方案来说,从调运方案表上的 一个空格出发,存在一条且仅存在一条以该空格为起点,以 其他填有数字的点为其他顶点的闭合回路,简称闭回路。 具体调整办法是:
4 3 1
3
6
3
初始调运方案的运费为87(千元).
表上作业法
(2)初始调运方案的最优性检验—位势法
第一步,设定行位势ui;列位势vj。满足: 方案中的每一个数字格(基变量)Xij都有运价 Cij= ui+vj; 任意空格(非基变量) Xij的检验数为 λij = Cij-(ui+vj)。
第二步,求解非基变量的检验数λij
•
调整的出发点
从一个检验数为负数且最小的空格出发,找到其所处的闭 回路,在转角点依次标上(+)、(-)号。 怎么调整
•
将所有标有(-)转角格中的最小运量作为调整数,将标 有(+)的转角格中的运量加上这个调整数,标有(-)转角 格中的运量减去这个调整数,得到新的调运方案。
第五章 第三节 表上作业法
3、改进的方法
——闭合回路调整法(原理同单纯形法一样) 闭合回路调整法(原理同单纯形法一样) 闭合回路调整法 接上例: 接上例: B1 A1 A2 A3 销量 3 3 6 6 5 B2 B3
(+1) (+ ) (-1) (- )
B4 4 1
(-1) (- ) (+1) (+ )
产量 3 7 4 9
B1 A1 A2 A3 销量 3 1 ) (+1) (+
(-1) (- 3 )
① ③
B2
B3
③
B4 3
产量 7 4
(-1) (- ) 4
②
(+1) (+ ) 1
6 6 5
3 6
9
计算如下:空格处( 计算如下:空格处( A1 B1 )= (1×3)+{ (-1)×3 }+(1×2)+{ (-1)×1 }=1 此数即为该空格处的检验数。 此数即为该空格处的检验数。
特征: 特征: 平衡运输问题必有可行解, 1、平衡运输问题必有可行解,也 必有最优解; 必有最优解; 2、运输问题的基本可行解中应包 括 m+n-1 个基变量。 - 个基变量。
二、表上作业法
步骤: 步骤: 找出初始基本可行解(初始调运方案, ⑴.找出初始基本可行解(初始调运方案,一 m+n- 个数字格),用西北角法、最小元素法; ),用西北角法 般m+n-1个数字格),用西北角法、最小元素法; ⑵.求出各非基变量的检验数,判别是否达到 求出各非基变量的检验数, 最优解。如果是停止计算,否则转入下一步, 最优解。如果是停止计算,否则转入下一步,用 位势法计算; 位势法计算; 改进当前的基本可行解(确定换入、 ⑶.改进当前的基本可行解(确定换入、换 出变量),用闭合回路法调整; ),用闭合回路法调整 出变量),用闭合回路法调整; ⑷.重复⑵. ⑶,直到找到最优解为止。 重复⑵ 直到找到最优解为止。
土石方调配-表上作业法
土石方调配--表上作业法一、土方调配原理土方调配是场地平整施工设计的一个重要内容。
土方调配的目的是在使土方总运输量最小或土方运输成本最小的条件下,确定填挖方区土方的调配方向和数量,从而达到缩短工期和降低成本的目的。
(一)土方调配区的划分,平均运距和土方施工单价的确定1、调配区的划分原则进行土方调配时,首先要划分调配区。
划分调配区应注意下列几点:(1)调配区的划分应该与工程建(构)筑物的平面位置相协调,并考虑它们的开工顺序、工程的分期施工顺序;(2)调配区的大小应该满足土方施工主导机械(铲运机、挖土机等)的技术要求;(3)调配区的范围应该和土方工程量计算用的方格网协调,通常可由若干方格组成一个调配区;(4)当土方运距较大或场地范围内土方不平衡时,可根据附近地形,考虑就近取土或就近弃土,这时一个取土区或弃土区都可作为一个独立的调配区。
2、平均运距的确定调配区的大小和位置确定之后,便可计算各填、挖方调配区之间的平均运距。
当用铲运机或推土机平土时,挖土调配区和填方调配区土方重心之间的距离,通常就是该填、挖方调配区之间的平均运距。
当填、挖方调配区之伺距离较远,采用汽车、自行式铲运机或其他运土工具沿工地道路或规定线路运土时,其运距应按实际情况进行计算。
3、土方施工单价的确定如果采用汽车或其他专用运土工具运土时,调配区之间的运土单价,可根据预算定额确定。
当采用多种机械施工时,确定土方的施工单价就比较复杂,因为不仅是单机核算问题,还要考虑运、填配套机械的施工单价,确定一个综合单价。
(二)用“线性规划”方法进行土方调配时的数学模型表是土方平衡与施工运距(单价)表。
此表格说明了整个场地划分为个挖方区,,…,,其挖方量应为,,…,;有个填方区,,,…,,其填方量相应为,,…,;用表示由挖方区到填方区的土方调配数,由填挖方平衡,即:(1-1-6)若从到的价格系数(平均运距,或单位土方运价、或单位土方施工费用)为,一般地,从到的价格系数为,于是土方调配问题可以用下列数学模型表达:求一组的值、使目标函数:(1-l-7)为最小值,并满足下列约束条件:(=1,2,…,)(=1,2,…,)据约束条件知道,未知量有X个,而方程数为+个。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* 表上作业法的源代码 */#include ""#include ""#include ""/* #define debug */#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)) /*运量数组 *//*(<:基本解,>=:运量为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) /*闭回路点i标*/#define cpf(k) ((CP+k)->f) /*闭回路点i标*//* f=0:j++; f=2:j--;f=1;i--; f=3:i++; *//*void TP(int M,int N,double *C,double *X); */10 6 300 20 30 40 50 6012 7 14 16 9 10 9 13 8 14183 185 119 162 137 102 179 118 114189 107 169 161 179 169 140 135 112184 149 128 106 165 178 199 183 194127 184 173 124 125 151 127 178 160162 105 150 185 179 153 174 121 142108 163 157 138 189 171 114 131 165150 159 131 155 135 165 124 167 107109 107 149 175 162 108 182 135 181106 136 183 134 179 188 136 131 189166 158 159 180 162 104 116 159 111void main(){int M,N,i,j;double *C; /*存储运价,产量及销量 */double *X; /*存储运量分配方案 */float z;FILE *fp;char fn[80];double sum;void TP(int M,int N,double *C,double *X);printf("please input the data file name: ");scanf("%s",fn);if((fp=fopen(fn,"r"))==NULL){printf("Cannot open the data file!");}fscanf(fp,"%d%d",&M,&N);M++; N++;X=(double *)malloc(sizeof(double)*(M-1)*(N-1));C=(double *)malloc(sizeof(double)*M*N);/* 把运价,供应量和需求量的数据读入到数组c(i,j); *//*---高太光:这里可以直接定义固定的数组c(i,j),也可以从文件读取for(i=0;i<M;i++){for(j=0;j<N;j++){fscanf(fp,"%f",&z);c(i,j)=z;}printf("\n");}fclose(fp);/* output c(i,j); */printf("\n=============Data File================\n");for(i=0;i<M;i++){for(j=0;j<N;j++){printf("%10.3f",c(i,j));}printf("\n");}getch();TP(M,N,C,X);/* 输出产销分配方案; */printf("\n=============Best Solution===================\n"); sum=0;for(i=0;i<M-1;i++){for(j=0;j<N-1;j++){if(x(i,j)>=printf("%10s","******");else{printf("%10.3f",x(i,j));sum+=(x(i,j)*c(i,j));}}printf("\n");}printf("\n\n\tThe min Cost is: %-10.4f\n",sum);getch();}struct PATH{int i,j,f;}; /*记录闭回路点结构*/void TP(int M,int N, double *C,double *X){double *U,*V,*S;int MN1,m,n;struct PATH *CP;int k,i,j,l,k1,l1,ip;double Cmin,sum;int I0,J0,Imin,Jmin;int fi,fj,fc,f;MN1=(M-1)+(N-1)-1;m=M-1;n=N-1;S=(double *)malloc(sizeof(double)*(M-1)*(N-1));U=(double *)malloc(sizeof(double)*M);V=(double *)malloc(sizeof(double)*N);CP=(struct PATH *)malloc(sizeof(struct PATH)*(MN1+1)); #ifdef debugprintf("\nM=%d,N=%d,m=%d,n=%d\n",M,N,m,n);printf("\nb(i)is following:\n");for(i=0;i<m;i++)printf("%8.4f\t",b(i));printf("\na(j)is folowing:\n");for(j=0;j<n;j++)printf("%8.4f\t",a(j));printf("\n");getch();#endif/*解初始化Xij=; */for(i=0;i<m;i++)for(j=0;j<n;j++)x(i,j)=;/*最小元素法求初始可行解 */for(k=0;k<MN1;k++){Cmin=;for(i=0;i<m;i++){fi=0;for(l=0;l<k;l++){/* 去除已经用过的行; */if(i==cpi(l)){fi=1;break;}}if(fi==1)continue;for(j=0;j<n;j++){fj=0;for(l=0;l<k;l++){/* 去除已经用过的列; */if(j==cpj(l)){fj=1;break;}}if(fj==1) continue;if(Cmin>c(i,j)){Cmin=c(i,j);I0=i;J0=j;#ifdef debugprintf("\n now c(i,j)=%8.4f\n",c(i,j));#endif}} /*end for j */}/* end for i *//*得到了未划去的最小运价所在格的坐标(I0,J0)和最小运价Cmin */if(k>0){if(Cmin==&&cpi(k-1)==0){for(l1=0;l1<m;l1++)if(x(l1,cpj(k-1))=={x(l1,cpj(k-1))=0;}}else if(Cmin==&&cpi(k-1)!=0){for(l1=0;l1<n;l1++)if(x(cpi(k-1),l1)=={x(cpi(k-1),l1)=0;}}}if(b(I0)<a(J0)){cpi(k)=I0;cpj(k)=-1;x(I0,J0)=b(I0);#ifdef debugprintf("I0=%d,J0=%d,x(I0,J0)=%8.4f,k=%d,cpi(k)=%d,cpj(k)=%d\n",I0,J0,x(I0,J0),k,cpi(k),cpj(k)); #endifa(J0)-=b(I0);b(I0)=0;}else{cpi(k)=-1;cpj(k)=J0;x(I0,J0)=a(J0);#ifdef debugprintf("I0=%d,J0=%d,x(I0,J0)=%8.4f,k=%d,cpi(k)=%d,cpj(k)=%d\n",I0,J0,x(I0,J0),k,cpi(k),cpj(k)); #endifb(I0)-=a(J0);a(J0)=0;}} /*END FOR K 用最小元素法求得了初使可行解*//*输出初始可行解*/printf("\n=============init Solution===================\n");sum=0;for(i=0;i<M-1;i++){for(j=0;j<N-1;j++){if(x(i,j)>=printf("%10s","******");else{printf("%10.3f",x(i,j));sum+=(x(i,j)*c(i,j));}}printf("\n");}printf("\n\n\tThe Cost is: %-10.4f\n",sum);getch();/***************循环换入换出,直到检验数为非负数*****************************//*循环决定换入变量 */while(1){/*位势置初值Ui,Vi= */for(i=0;i<m;i++)u(i)=;for(j=0;j<n;j++)v(j)=;/*求位势*/l=0;u(0)=0;for(i=0;i<m;i++){for(j=0;j<n;j++){if(u(i)>=&&v(j)>=&&x(i,j)<{cpi(l)=i;cpj(l)=j;l++; /*记录未求过位势的位置*/}else if(x(i,j)<&&u(i)<{v(j)=c(i,j)-u(i);}else if(x(i,j)<&&v(j)<{u(i)=c(i,j)-v(j);}}/*end for j */}/*end for i *//*按记录位置求其余位势*/if(l>0){while(1){ip=0;for(k=0;k<l;k++){i=cpi(k);j=cpj(k);if((u(i)>=&&(v(j)>=&&(x(i,j)<){cpi(ip)=i;cpj(ip)=j;ip++; /*记录未求过位势的位置*/ }else if(x(i,j)<&&u(i)<{v(j)=c(i,j)-u(i);}else if(x(i,j)<&&v(j)<{u(i)=c(i,j)-v(j);}}/*end for k */if(ip==0)break;l=ip;}/*end for while */} /*end if l */#ifdef debugprintf("\nU(i):");for(i=0;i<m;i++){printf("%10.2f",u(i));}printf("\nV(j):");for(j=0;j<n;j++){printf("%10.2f",v(j));}printf("\n");#endif/*求检验数*/for(i=0;i<m;i++){for(j=0;j<n;j++){ s(i,j)=;if(x(i,j)>= s(i,j)=c(i,j)-u(i)-v(j);}}/*求最小检验数*/Cmin=;for(i=0;i<m;i++){for(j=0;j<n;j++){if(Cmin>s(i,j)){Cmin=s(i,j);I0=i;J0=j;}}}#ifdef debugprintf("\ncheck number:\n");for(i=0;i<m;i++){for(j=0;j<n;j++){printf("s(%d,%d)=%-10.2f\n",i,j,s(i,j));}printf("\n");}printf("Smin=%-10.2f",Cmin);getch();#endifif(Cmin>=0) return; /*已经得到最优解,返回主程序*/ /*此时找到了入基变量X(I0,J0) *//*求闭回路*/for(k=0;k<MN1;k++){cpf(k)=-1;}/*end for k */cpi(0)=I0;cpj(0)=J0;k=0;while(1){f=cpf(k);/*设置闭回路搜索方向*/while(1){i=cpi(k);j=cpj(k);fc=0;f++;cpf(k)=f;if(f>=4)break;/*避免反向搜索*/if(k>0){if(f==0&&cpf(k-1)==2) continue;else if(f==1&&cpf(k-1)==3)continue;else if(f==2&&cpf(k-1)==0)continue;else if(f==3&&cpf(k-1)==1)continue;}if(f==0){/*沿J+方向搜索*/while(1){j++;if(j>=n){fc=2;break;}if((i==I0)&&(j==J0)){fc=1;break;}if(s(i,j)>={fc=3;break;}}}/*end j+ */else if(f==1){ /*沿i-方向搜索*/while(1){ i--;if(i<0){fc=2;break;}if((i==I0)&&(j==J0)){fc=1;break;} if(s(i,j)>={fc=3;break;}}}/*end if=1 */else if(f==2){/*沿J-方向搜索*/while(1){j--;if(j<0){fc=2;break;}if((i==I0)&&(j==J0)){fc=1;break;} if(s(i,j)>={fc=3;break;}}} /*end f==2 */else if(f==3){/*沿I+方向搜索*/while(1){i++;if(i>=m){fc=2;break;}if((i==I0)&&(j==J0)){fc=1;break;} if(s(i,j)>={fc=3;break;}}}/*end f==3 */if((fc==1)||(fc==3))break;}/*end while flag 2 */if(fc==0){/*沿些方向搜索失败,退回回到前一点*/ k--;}else if(fc==1)break; /*搜索完成*/else if(fc==3){/*沿此方向搜索成功,前进一点*/k++;cpi(k)=i;cpj(k)=j;#ifdef debugprintf("\n");printf("k=%d,cpi(k)=%d,cpj(k)=%d,cpf(k)=%d,x(i,j)=%8.4f\n",k,cpi(k),cpj(k),cpf(k),x(cpi(k),cpj(k))); getch();#endifcpf(k)=-1;}}/*end while *//*去除闭回路中的非转折点*/l=0;while(l<k-1){ i=l+1;while(i<=k){if(cpf(l)==cpf(i)) i++;else break;}if(i>(l+1)){j=l+1;k1=k-(i-j);/*如果某些点前进方向相同,则去除中间各点*/while(i<=k){cpi(j)=cpi(i);cpj(j)=cpj(i);cpf(j)=cpf(i);i++;j++;}l+=2;k=k1;}else l++;}/*end while l<k-1 *//*查找闭回路上基本解的最小值*/Cmin=x(cpi(1),cpj(1));Imin=cpi(1);Jmin=cpj(1);for(i=3;i<=k;i+=2){if(Cmin>x(cpi(i),cpj(i))){Cmin=x(cpi(i),cpj(i));Imin=cpi(i);Jmin=cpj(i);}}/*换入基变量*/x(I0,J0)=Cmin;for(i=1;i<=k;i+=2){x(cpi(i),cpj(i))-=Cmin;if((i+1)<=k) x(cpi(i+1),cpj(i+1))+=Cmin;}x(Imin,Jmin)=;}free(CP);free(V);free(U);free(S);QUIT: return;}================END====================。