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

在这里插入图片描述





一、最优解判别



在上两篇博客 【运筹学】表上作业法 ( 求初始基可行解 | 最小元素法 ) , 【运筹学】表上作业法 ( 最小元素法分析 | Vogel 方法 ) 中 , 分别给出了表上作业法如何找初始基可行解 , 两种方法 " 最小元素法 " 和 " Vogel 方法 ( 差额法 ) " , 其中 Vogel 方法 得到的初始基可行解更靠近最优解 ;


下面开始判断该 初始基可行解 是否是 最优解 ;


最优解判别 : 得到一组 基可行解 之后 , 使用 检验数 判定该解是否是最优解 ;

检验数符号 : 变量 x i j \rm x_{ij} xij 的检验数记作 λ i j \rm \lambda_{ij} λij ;

检验数判定原则 : 运输规划的 目标函数求最小值 时 , 所有的 非基变量检验数 λ i j \rm \lambda_{ij} λij 都非负 , 该基可行解就是最优解 , 该运输方案是最优方案 ;


求检验数的方法 : ① 闭回路法 , ② 位势法 ;





二、初始基可行解



在这里插入图片描述


使用最小元素法求得的初始基可行解 :

B 1 \rm B_1 B1 B 2 \rm B_2 B2 B 3 \rm B_3 B3 B 4 \rm B_4 B4产量
A 1 \rm A_1 A1 3 3 3 11 11 11 3 3 3 , 4 4 4 10 10 10 , 3 3 3 7 7 7
A 2 \rm A_2 A2 1 1 1 , 3 3 3 9 9 9 2 2 2 , 1 1 1 8 8 8 4 4 4
A 3 \rm A_3 A3 7 7 7 4 4 4 , 6 6 6 10 10 10 5 5 5 , 3 3 3 9 9 9
销量 3 3 3 6 6 6 5 5 5 6 6 6

使用 最小元素法, 得到初始基可行解 : { x 13 = 4 x 14 = 3 x 21 = 3 x 23 = 1 x 32 = 6 x 34 = 3 \begin{cases} \rm x_{13} = 4 \\\\ \rm x_{14} = 3 \\\\ \rm x_{21} = 3 \\\\ \rm x_{23} = 1 \\\\ \rm x_{32} = 6 \\\\ \rm x_{34} = 3 \end{cases} x13=4x14=3x21=3x23=1x32=6x34=3



使用 Vogel 方法求得初始基可行解 :

B 1 \rm B_1 B1 B 2 \rm B_2 B2 B 3 \rm B_3 B3 B 4 \rm B_4 B4产量行差额
A 1 \rm A_1 A1 3 3 3 , 2 2 2 1̸1 \not 11 11 3 3 3 , 5 5 5 1̸0 \not 10 10 7 7 7 0 0 0
A 2 \rm A_2 A2 1̸ \not 1 1 , 1 1 1 9̸ \not 9 9 2̸ \not 2 2 8̸ \not 8 8 , 3 3 3 4 4 4 1̸ \not 1 1
A 3 \rm A_3 A3 7̸ \not 7 7 4̸ \not 4 4 , 6 6 6 1̸0 \not 10 10 5̸ \not 5 5 , 3 3 3 9 9 9 2̸ \not 2 2
销量 3 3 3 6 6 6 5 5 5 6 6 6
列差额 2 2 2 5̸ \not 5 5 1 1 1 2̸ \not 2 2

使用 Vogel 方法, 得到初始基可行解 : { x 11 = 2 x 13 = 5 x 21 = 1 x 24 = 3 x 32 = 6 x 34 = 3 \begin{cases} \rm x_{11} = 2 \\\\ \rm x_{13} = 5 \\\\ \rm x_{21} = 1 \\\\ \rm x_{24} = 3 \\\\ \rm x_{32} = 6 \\\\ \rm x_{34} = 3 \end{cases} x11=2x13=5x21=1x24=3x32=6x34=3


推荐使用 Vogel 方法计算初始基可行解 ;





三、运费修改可行性方案



以最小元素法获得的初始基可行解为例 :

B 1 \rm B_1 B1 B 2 \rm B_2 B2 B 3 \rm B_3 B3 B 4 \rm B_4 B4产量
A 1 \rm A_1 A1 3 3 3 11 11 11 3 3 3 , 4 4 4 10 10 10 , 3 3 3 7 7 7
A 2 \rm A_2 A2 1 1 1 , 3 3 3 9 9 9 2 2 2 , 1 1 1 8 8 8 4 4 4
A 3 \rm A_3 A3 7 7 7 4 4 4 , 6 6 6 10 10 10 5 5 5 , 3 3 3 9 9 9
销量 3 3 3 6 6 6 5 5 5 6 6 6

当前的初始基可行解的总运费计算如下 :

( 3 × 4 ) + ( 10 × 3 ) + ( 1 × 3 ) + ( 2 × 1 ) + ( 4 × 6 ) + ( 3 × 5 ) = 86 \rm ( 3 \times 4 ) + ( 10 \times 3 ) + ( 1 \times 3 ) + ( 2 \times 1 ) + ( 4 \times 6 ) + ( 3 \times 5 ) = 86 (3×4)+(10×3)+(1×3)+(2×1)+(4×6)+(3×5)=86


提出问题 :

在上述运输规划表格中 , A 2 \rm A_2 A2 没有向 B 4 \rm B_4 B4 运输产品 , 如果想要增加该项的运输 ;

A 2 \rm A_2 A2 的产量是固定的 , 不能凭空多出来 , 如果想要多给 B 4 \rm B_4 B4 运输一部分 , 一定要减少其它销地的运输 ;

这里 A 2 \rm A_2 A2 可以减少向 B 1 \rm B_1 B1 B 3 \rm B_3 B3 销地运输产品的个数 ;

假如想要减少 A 2 \rm A_2 A2 产地运往 B 1 \rm B_1 B1 销地的产品数量 , 但对于 B 1 \rm B_1 B1 销地来说 , 从 A 2 \rm A_2 A2 产地获取的产品少了 , 需要从其它产地获取更多产品 , 而此时其它的产地的产品运输都是饱和的 , 多不出来 ;


运量变化规则 :

单纯形法中每次迭代中 , 要选出一个 出基变量 , 和一个 入基变量 , 这两个成对出现 ;

同理在运输规划中 , 也有类似的概念 ; 增加某个方向的运量 , 需要立刻体现出 减少了某个方向的运量 , 增加一个 , 减少一个 ; 增加和减少交替出现 ;


不可行的修改方案 :

如果想要增加一个销地的运量 , 就需要减少另外一个销地的运量 , 但是注意 , 减少另外销地的运量不能影响其它的运输问题 , 上述情况下 增加 A 2 \rm A_2 A2 B 4 \rm B_4 B4 的运量 , 此时如果要 减少 A 2 \rm A_2 A2 B 1 \rm B_1 B1 的运量 , 会引起 B 1 \rm B_1 B1 销地供货不足 , 导致另外的连锁反应 , 需要增加另外产地的向 B 1 \rm B_1 B1 供货 , 但是 A 1 , A 3 \rm A_1 , A_3 A1,A3 都没有可以增加供货的空间 ;

这样无法形成一个闭合回路 ;


可行的修改方案 :

增加 A 2 \rm A_2 A2 B 4 \rm B_4 B4 的运量 , 如果 减小 A 2 \rm A_2 A2 B 3 \rm B_3 B3 运输的产品数 , B 3 \rm B_3 B3 得到的物资从 A 2 \rm A_2 A2 减少 , 那么相应 A 1 \rm A_1 A1 B 3 \rm B_3 B3 供货需要增加 , A 2 \rm A_2 A2 B 3 \rm B_3 B3 的运输量最多减少 1 1 1 个 , 对于 A 1 \rm A_1 A1 来说 , 向 A 3 \rm A_3 A3 运输增加了 , 一定需要减少运往某个销地的运量 , 只能 减少 A 1 \rm A_1 A1 B 4 \rm B_4 B4 的运量 , 此时发现产销又平衡了 ;

A 2 \rm A_2 A2 B 4 \rm B_4 B4 最多能增加 1 1 1 个单位 , 此时 A 2 \rm A_2 A2 B 3 \rm B_3 B3 减少 1 1 1 个单位 , A 1 \rm A_1 A1 B 3 \rm B_3 B3 增加 1 1 1 个单位 , A 1 \rm A_1 A1 B 4 \rm B_4 B4 减少 1 1 1 个单位 ;


是否采取上述可行的修改方案 , 要看修改后的总运费是否小于修改前的总运费 , 如果修改后总费用减小 , 则进行修改 , 反之则不修改 ;


经过上述计算后的运费表格如下 :

B 1 \rm B_1 B1 B 2 \rm B_2 B2 B 3 \rm B_3 B3 B 4 \rm B_4 B4产量
A 1 \rm A_1 A1 3 3 3 11 11 11 3 3 3 , 5 5 5 10 10 10 , 2 2 2 7 7 7
A 2 \rm A_2 A2 1 1 1 , 3 3 3 9 9 9 2 2 2 8 8 8 , 1 1 1 4 4 4
A 3 \rm A_3 A3 7 7 7 4 4 4 , 6 6 6 10 10 10 5 5 5 , 3 3 3 9 9 9
销量 3 3 3 6 6 6 5 5 5 6 6 6

计算当前的总运费 :

( 3 × 5 ) + ( 10 × 2 ) + ( 1 × 3 ) + ( 8 × 1 ) + ( 4 × 6 ) + ( 3 × 5 ) = 85 \rm ( 3 \times 5 ) + ( 10 \times 2 ) + ( 1 \times 3 ) + ( 8 \times 1 ) + ( 4 \times 6 ) + ( 3 \times 5 ) = 85 (3×5)+(10×2)+(1×3)+(8×1)+(4×6)+(3×5)=85


总费用确实减少了 , 比之前的减少了 1 1 1 的总费用 , 需要采取修改后的方案 ;


与之前的总运费表格对比 :

此时 x 24 \rm x_{24} x24 是新增加的基变量 , 这是 入基变量 , 由非基变量变为基变量 ;

原来的基变量 x 23 \rm x_{23} x23 变成了非基变量 , 这是 出基变量 ;





四、闭回路法



闭回路法 :

上述示例中找了一个 A 2 \rm A_2 A2 B 4 \rm B_4 B4 的格子对应的非基变量 x 24 \rm x_{24} x24 找闭回路 , 实际上任意一个非基变量都存在一个闭回路 ;

此时找到了针对最优解的判定方案 , 是针对 非基变量 进行判断 , 对于 任意一个非基变量 , 都可以找到这样的闭回路 ,

出发的格子中 增加运输量 , 然后某个格子需要 减少运输量 , 增加 与 减少 依次交替 , 最终能回到初始的格子, 达到产销平衡 ;

出发的格子使用加号 + + + , 第二个格子使用减号 − - , 之后的歌词依次使用 加号减号交替 + − +- + 符号 ;


让其运费做一个 " + − + − ⋯ +-+-\cdots ++ " 运算 , 最终看代数和 ;

如果代数和 大于等于 0 0 0 , 说明当前的非基变量格子取 0 0 0 就是 最优选择 ;

如果代数和 小于 0 0 0 , 说明当前的非基变量格子取 0 0 0 不是最优选择 ;

  • 1
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是利用最小元素求出运筹学运输问题的初始并用回路判断并调整为最优解的 Python 代码: ```python import numpy as np # 输入相关数据 supply = np.array([10, 20, 30]) # 供应商每个仓库的供应量 demand = np.array([20, 30, 10, 10]) # 需求方每个销售点的需求量 cost = np.array([[2, 3, 1, 4], [5, 4, 8, 1], [3, 6, 2, 5]]) # 运输成本矩阵 # 最小元素初始 allocation = np.zeros((3, 4)) while np.sum(supply) > 0 and np.sum(demand) > 0: # 找到成本最小的元素 min_cost = np.min(cost) min_cost_index = np.argwhere(cost == min_cost) row = min_cost_index[0][0] col = min_cost_index[0][1] # 分配货物 amount = min(supply[row], demand[col]) allocation[row, col] = amount supply[row] -= amount demand[col] -= amount # 将已分配的成本设为极大值 cost[row, col] = np.inf # 回路最优解 while True: # 计算各个销售点的运输量 sales_amount = np.sum(allocation, axis=0) # 计算各个供应商的运输量 supply_amount = np.sum(allocation, axis=1) # 找到存在缺货的销售点 shortage_index = np.argwhere(sales_amount < demand) if len(shortage_index) == 0: break # 找到缺货销售点的缺货量 shortage = demand[shortage_index[0][0]] - sales_amount[shortage_index[0][1]] # 找到从该销售点出发、经过未分配路径、返回该销售点的路径 for i in range(allocation.shape[0]): for j in range(allocation.shape[1]): if allocation[i, j] > 0: # 判断路径是否符合条件 if i in shortage_index and j not in shortage_index: path = [(i, j)] current_row = i current_col = j while current_col != shortage_index[0][1]: next_row, next_col = np.argwhere(allocation[current_row,:] > 0)[0] path.append((next_row, next_col)) current_row = next_row current_col = next_col # 找到回路中最小的分配量 min_amount = np.min([allocation[row, col] for row, col in path]) # 调整路径上的分配量 for row, col in path: allocation[row, col] -= min_amount elif i not in shortage_index and j in shortage_index: path = [(i, j)] current_row = i current_col = j while current_row != shortage_index[0][0]: next_row, next_col = np.argwhere(allocation[:,current_col] > 0)[0] path.append((next_row, next_col)) current_row = next_row current_col = next_col # 找到回路中最小的分配量 min_amount = np.min([allocation[row, col] for row, col in path]) # 调整路径上的分配量 for row, col in path: allocation[row, col] -= min_amount # 输出最优解 total_cost = np.sum(allocation * cost) print("最优解为:") print(allocation) print("总成本为:", total_cost) ``` 这段代码实现了利用最小元素求出运筹学运输问题的初始,并用回路判断并调整为最优解。你可以根据自己的需求进行修改

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值