提示:本文主要是关于python的实现,不纠结于原理部分
目录
前言
运输问题是一种线性规划模型,如果使用单纯形法,那么对每个约束都需要引入一个人工变量,因此为更好的求解运输问题,需要有一种新方法。
表上作业法是求解运输问题的一种简便而有效的方法,其整体的迭代步骤为:得到初始解;对解进行判定,若不是最优解,则改进;再判定;直到得到运输问题的最优解为止。
提示:以下是本篇文章正文内容,下面案例可供参考
一、理论部分
得到初始可行解有两种常用的方法:最小元素法和沃格尔(Vogel)法。
1.最小元素法
最小元素法是基于优先满足单位运价最小的供销业务,是一种贪心思想。
2.沃格尔(Vogel)法
沃格尔法可以简单总结为找到最大罚数的行(列),在该行(列)种找到最小的运价,满足该运价对应的供销关系,不断迭代。
上面只是简单介绍一下两个方法的思想,要想明白可以找找相关资料,个人感觉原理很简单。下面就直接进入正题。Coding!!!
二、最小元素法实现
1.数据准备
产量、销量、产地和销地间的成本矩阵、设置一个极大数、初始化初始解。
import numpy as np
import copy
supplyNum=3 #供应商数量
demandNum=4 #需求商数量
A=np.array([16,10,22]) #产量
B=np.array([8,14,12,14]) #销量
C=np.array([[4,12,4,11],[2,10,3,9],[8,5,11,6]]) #成本
X=np.zeros((supplyNum,demandNum)) #初始解
c=copy.deepcopy(C)
maxNumber=10000 #极大数
2.代码主体部分
这里的python实现思想是:
1、找到最小运价的索引;
2、判断该索引对应的产地的产量和销地的销量大小关系,以此确定该索引下的运输量;
3、将该索引对应的剩余产量、剩余销量数据更新,并且将已经满足运输条件的行(列)成本全部提高为一个极大数(该操作替换表上作业法里面的删除操作);
4、条件判定,若所有的成本都已经不小于这个极大数,则跳出循环,否则跳入步骤1。
代码如下:
def pivot(A,B,c,X):
index=np.where(c==np.min(c)) #寻找最小值的索引
minIndex=(index[0][0],index[1][0]) #确定最小值的索引
#确定应该优先分配的量,并且改变价格
if A[index[0][0]]>B[index[1][0]]:
X[minIndex]=B[index[1][0]]
c[:,index[1][0]]=maxNumber #改变价格
A[index[0][0