2020MathorCup数学建模挑战赛C题 仓内拣货优化问题
仓内拣货优化问题
问题一
下面是计算
3000
×
3000
3000\times 3000
3000×3000矩阵(货格与货格距离)的
P
y
t
h
o
n
Python
Python代码
输出为3000个
1
×
3000
1\times3000
1×3000列表,需自己存入
E
x
c
e
l
表
格
Excel表格
Excel表格
import pandas as pd # 导入数据分析库Pandas
import xlsxwriter
workbook = xlsxwriter.Workbook('sheet.xlsx')
worksheet = workbook.add_worksheet(u'sheet1')
inputfile = '附件1:仓库数据.xlsx' # 销量数据路径
data = pd.read_excel(inputfile, sheet_name='货格') # 读入数据
a = data[u'坐标 x,毫米']
b = data[u'坐标 y,毫米']
x_store = [] # 货格横坐标
y_store = [] # 货格纵坐标
# 将横坐标导入x(1:3000)数组中 将纵坐标导入y(1:3000)数组中
for i in range(len(a)):
x_store.append(a[i])
y_store.append(b[i])
inputfile = '附件1:仓库数据.xlsx' # 销量数据路径
date = pd.read_excel(inputfile, sheet_name='复核台') # 读入数据
c = date[u'坐标 x,毫米']
d = date[u'坐标 y,毫米']
x_easter = [] # 复核台横坐标
y_easter = [] # 复核台纵坐标
for i in range(len(c)):
x_easter.append(c[i])
y_easter.append(d[i])
offset = 750 # 偏移量750mm
# 下面写入3000X3000矩阵
for i in range(3000):
d = [] # 1X3000矩阵
x_posi = x_store[i] # 遍历每个点x横坐标
y_posi = y_store[i] # 遍历每个点y横坐标
for j in range(3000):
x_point = x_store[j]
y_point = y_store[j]
if x_posi == x_point and y_posi == y_point: # 第一种距离计算方式 自身到自身的距离为0
d1 = 0
d.append(d1)
elif x_posi == x_point and y_posi != y_point: # 第二种距离计算方式 横坐标相同,纵坐标不同
d2 = abs(y_point - y_posi) + 2 * offset
d.append(d2)
elif x_posi != x_point and y_posi == y_point: # 第三种距离计算方式 横坐标不同,纵坐标相同
if abs(x_posi - x_point) == 2300: # 相邻格子
d3 = abs(x_posi - x_point) - 800
d.append(d3)
elif (x_posi - 3000) % 3100 == 0 and (x_point - 3000) % 3100 == 0 or (x_posi - 3000) % 3900 == 0 and (
x_point - 3000) % 3900 == 0: # 左→左,右→右
d4_1 = (y_posi - 3000 + 400) % 14000 + (y_point - 3000 + 400) % 14000 + abs(
x_posi - x_point) + 4 * offset # 从下面走路线
d4_2 = (15000 - y_posi - 400) % 14000 + (15000 - y_point - 400) % 14000 + abs(
x_posi - x_point) + 4 * offset # 从上面走路线
d4 = min(d4_1, d4_2) # 选择最小的路线
d.append(d4)
elif (x_posi - 3000) % 3100 == 0 and (x_point - 3000) % 3900 == 0: # 左→右
if x_posi < x_point: # 左<右
d5_1 = (y_posi - 3000 + 400) % 14000 + (y_point - 3000 + 400) % 14000 + abs(
x_posi - x_point) + 6 * offset + 800 # 从下面走路线
d5_2 = (15000 - y_posi - 400) % 14000 + (15000 - y_point - 400) % 14000 + abs(
x_posi - x_point) + 6 * offset + 800 # 从上面走路线
d5 = min(d5_1, d5_2) # 选择最小的路线
d.append(d5)
else:
d5_1 = (y_posi - 3000 + 400) % 14000 + (y_point - 3000 + 400) % 14000 + abs(
x_posi - x_point) + 2 * offset - 800 # 从下面走路线
d5_2 = (15000 - y_posi - 400) % 14000 + (15000 - y_point - 400) % 14000 + abs(
x_posi - x_point) + 2 * offset - 800 # 从上面走路线
d5 = min(d5_1, d5_2) # 选择最小的路线
d.append(d5)
else: # 右→左
if x_posi < x_point: # 右<左
d6_1 = (y_posi - 3000 + 400) % 14000 + (y_point - 3000 + 400) % 14000 + abs(
x_posi - x_point) + 2 * offset - 800 # 从下面走路线
d6_2 = (15000 - y_posi - 400) % 14000 + (15000 - y_point - 400) % 14000 + abs(
x_posi - x_point) + 2 * offset - 800 # 从上面走路线
d6 = min(d6_1, d6_2) # 选择最小的路线
d.append(d6)
else:
d6_1 = (y_posi - 3000 + 400) % 14000 + (y_point - 3000 + 400) % 14000 + abs(
x_posi - x_point) + 6 * offset + 800 # 从下面走路线
d6_2 = (15000 - y_posi - 400) % 14000 + (15000 - y_point - 400) % 14000 + abs(
x_posi - x_point) + 6 * offset + 800 # 从上面走路线
d6 = min(d6_1, d6_2) # 选择最小的路线
d.append(d6)
else: # 第四种距离计算方式不同行,不同列
if abs(x_posi - x_point) == 2300: # 相邻格子
d3 = abs(y_posi - y_point) + abs(x_posi - x_point) - 800 # 第三种距离计算方式 2300
d.append(d3)
elif (x_posi - 3000) % 3100 == 0 and (x_point - 3000) % 3100 == 0 or (x_posi - 3800) % 3100 == 0 and (
x_point - 3800) % 3100 == 0: # 左→左,右→右
if int((y_posi - 3000) / 14000) == int((y_point - 3000) / 14000): # 相同货架
d4_1 = (y_posi - 3000 + 400) % 14000 + (y_point - 3000 + 400) % 14000 + abs(
x_posi - x_point) + 4 * offset # 从下面走路线
d4_2 = (15000 - y_posi - 400) % 14000 + (15000 - y_point - 400) % 14000 + abs(
x_posi - x_point) + 4 * offset # 从上面走路线
d4 = min(d4_1, d4_2) # 选择最小的路线
d.append(d4)
else: # 不同货架
d4 = abs(y_posi - y_point) + abs(x_posi - x_point) + 2 * offset
d.append(d4)
elif (x_posi - 3000) % 3100 == 0 and (x_point - 3800) % 3100 == 0: # 左→右
if int((y_posi - 3000) / 14000) == int((y_point - 3000) / 14000): # 相同货架
d5_1 = (y_posi - 3000 + 400) % 14000 + (y_point - 3000 + 400) % 14000 + abs(
x_posi - x_point) + 6 * offset + 800 # 从下面走路线
d5_2 = (15000 - y_posi - 400) % 14000 + (15000 - y_point - 400) % 14000 + abs(
x_posi - x_point) + 6 * offset + 800 # 从上面走路线
d5 = min(d5_1, d5_2) # 选择最小的路线
d.append(d5)
else: # 不同货架
if x_posi < x_point: # 左比右小
d5 = abs(y_posi - y_point) + abs(x_posi - x_point) + 4 * offset + 800
d.append(d5)
else: # 左比右大
d5 = abs(y_posi - y_point) + abs(x_posi - x_point) - 800
d.append(d5)
else: # 右→左
if int((y_posi - 3000) / 14000) == int((y_point - 3000) / 14000):
if x_posi < x_point: # 右<左
d6_1 = (y_posi - 3000 + 400) % 14000 + (y_point - 3000 + 400) % 14000 + abs(
x_posi - x_point) + 2 * offset - 800 # 从下面走路线
d6_2 = (15000 - y_posi - 400) % 14000 + (15000 - y_point - 400) % 14000 + abs(
x_posi - x_point) + 2 * offset - 800 # 从上面走路线
d6 = min(d6_1, d6_2) # 选择最小的路线
d.append(d6)
else:
d6_1 = (y_posi - 3000 + 400) % 14000 + (y_point - 3000 + 400) % 14000 + abs(
x_posi - x_point) + 6 * offset + 800 # 从下面走路线
d6_2 = (15000 - y_posi - 400) % 14000 + (15000 - y_point - 400) % 14000 + abs(
x_posi - x_point) + 6 * offset + 800 # 从上面走路线
d6 = min(d6_1, d6_2) # 选择最小的路线
d.append(d6)
else: # 不同货格
if x_posi < x_point:
d6 = abs(y_posi - y_point) + abs(x_posi - x_point) - 800
d.append(d6)
else:
d6 = abs(y_posi - y_point) + abs(x_posi - x_point) + 6 * offset + 800
d.append(d6)
print(d)