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)