(5)表上作业法求解运输问题——解的改进
(6)产销不平衡的运输问题
(7)有转运的运输问题
3、案例分析1——沃格尔法(寻找初始基可行解)
(1)案例分析
(2)Python实现
#运输问题求解:使用Vogel逼近法寻找初始基本可行解
import numpy as np
import copy
import pandas as pd
def main():
mat=pd.read_csv(‘表上作业法求解运输问题.csv’,header=None).values
#mat = pd.read_excel(‘表上作业法求解运输问题.xlsx’, header=None).values
#c=np.array([[4,12,4,11],[2,10,3,9],[8,5,11,6]]) #成本矩阵
#a=np.array([16,10,22]) #供给量
#b=np.array([8,14,12,14]) #需求量
[c,x]=TP_vogel(mat)
#[c,x]=TP_vogel([c,a,b])
def TP_split_matrix(mat): #运输分割矩阵
c=mat[:-1,:-1]
a=mat[:-1,-1]
b=mat[-1,:-1]
return (c,a,b)
def TP_vogel(var): #Vogel法代码,变量var可以是以numpy.ndarray保存的运输表,或以tuple或list保存的(成本矩阵,供给向量,需求向量)
import numpy
typevar1=type(var)==numpy.ndarray
typevar2=type(var)==tuple
typevar3=type(var)==list
if typevar1False and typevar2False and typevar3==False:
print(‘>>>非法变量<<<’)
(cost,x)=(None,None)
else:
if typevar1==True:
[c,a,b]=TP_split_matrix(var)
elif typevar2True or typevar3True:
[c,a,b]=var
cost=copy.deepcopy©
x=np.zeros(c.shape)
M=pow(10,9)
for factor in c.reshape(1,-1)[0]:
while int(factor)!=M:
if np.all(c==M):
break
else:
print(‘c:\n’,c)
#获取行/列最小值数组
row_mini1=[]
row_mini2=[]
for row in range(c.shape[0]):
Row=list(c[row,:])
row_min=min(Row)
row_mini1.append(row_min)
Row.remove(row_min)
row_2nd_min=min(Row)
row_mini2.append(row_2nd_min)
#print(row_mini1,‘\n’,row_mini2)
r_pun=[row_mini2[i]-row_mini1[i] for i in range(len(row_mini1))]
print(‘行罚数:’,r_pun)
#计算列罚数
col_mini1=[]
col_mini2=[]
for col in range(c.shape[1]):
Col=list(c