航天工业与人工智能(论文+代码) A Two-step Heuristic to Build Flight and Maintenance Planning in a Rolling-horizon

文章提出了一个解决航空公司飞机维护计划的问题,旨在通过有效安排以最大化飞机利用率。问题涉及识别关键飞机、时间窗口和飞行路径。解决方案包括将飞机分为关键和非关键两类,使用贪心算法为关键飞机找寻最长飞行路径,并借助遗传算法优化非关键飞机的飞行负荷。代码部分展示了数据处理和算法实现。讨论中提到了贪心算法的优缺点以及如何应对飞机剩余时间跨过维护窗口的情况。
摘要由CSDN通过智能技术生成

目录

Introduction of problem 背景介绍

Problem definition 定义说明

Problem modelling 问题建模

ER diagram

决解方案 Solution method

Sub-problem 1

Sub problem 2

Code

Code Architecture

Code for sub problem 1

getData.py

getCritical.py

getLongestPath.py

Data set 数据集说明

Discussion 讨论


Introduction of problem 背景介绍

重要性:
● 航空公司应定期检查飞机中的零部件以确保安全。
● 维护检查费用高昂。
→ 如果我们能够有效地安排维护活动,我们将节省时间和金钱。
目标:
● 最大化飞机利用率

Problem definition 定义说明

Aircraft 飞行器:能够飞行并运载货物或乘客的飞机

Flight 飞行任务:进行特定飞行的飞机

Sliding time window 时间滑动窗口:一周

Critical aircraft :必须在本周(时间窗口)内进行维护检查的飞机。

● 两个子问题
a、 确定第一周的路线/维护计划
b、 提供未来几周的潜在飞行计划。
原因:由于航空业的随机性,最终航线无法在几周前确定。

● Hub and spoke structure (轮毂和轮辐结构,如图1)
○ Takeoff flight for aircraft X: “hub-spoke”
○ Return flight for aircraft X: “spoke-hub”
-->将center city 视为维护基地

图1

 

Problem modelling 问题建模

ER diagram

ER diagram

 解释说明:aircraft 分为 critical aircraft 和 non-critical aircraft。critical aircraft 需要被尽快安排maintenance。所有的aircraft都可以被分配flight。

决解方案 Solution method

step 1:将所有飞机分为两组:关键飞机和非关键飞机。
step 2:在关键飞机的剩余飞行时间内找到最长的路径。
step 3:使用遗传算法(genetic algorithm )平滑非关键飞行的飞行负荷(flight)。

Sub-problem 1

Pseudo-code for sub-problem 1

Sub problem 2

Explaination for sub-problem 2

 

Code

Code Architecture

图 2

 

Code for sub problem 1

import numpy as np
import xlrd

import getData
import getLongestPath
import getCritical

if __name__ == '__main__':
    maintenance_capacity = 4
    All_aircraft = getData.excel2m("aircraft.xls")
    critical_aircraft = getCritical.criticalAircraft(All_aircraft,maintenance_capacity)

    flights = getData.excel2Class("flight.xls")
    g = getLongestPath.Greedy()

    for i in range(0,maintenance_capacity):
        remind_time = critical_aircraft[i,2]
        result, sum_duration, total_distance= g.greedy(flights, remind_time)
        print("Remind time before maintenance: "+ str(remind_time))
        print("Flight time can be allocated: " + str(sum_duration))
        print("Max distance can be allocated: " + str(total_distance))
        print("the sequence of selected flights: " + str(result))
        print("")

getData.py


import xlrd
import numpy as np

class flight():
    def __init__(self, number=0, duration=0, mileage=0, status=0):
        self.number = number
        self.duration = duration
        self.mileage = mileage
        self.status = status  # 0是未分配aircraft,1是已经分配aircraft

def excel2m(path):  # 读excel数据转为矩阵函数
    data = xlrd.open_workbook(path)
    table = data.sheets()[0]  # 获取excel中第一个sheet表
    nrows = table.nrows  # 行数
    ncols = table.ncols  # 列数
    datamatrix = np.zeros((nrows, ncols))
    for x in range(ncols):
        cols = table.col_values(x)  # 依次提取excel table中,每一列的所有数据。放入一整个list中
        cols1 = np.matrix(cols)  # 把list转换为矩阵进行矩阵操作:变成[[cols]]
        datamatrix[:, x] = cols1  # 放入矩阵
    return datamatrix

def excel2Class(path):
    data = xlrd.open_workbook(path)
    table = data.sheets()[0]
    nrows = table.nrows  # 行数
    number = []
    duration = []
    mileage = []
    for i in range(0, nrows):
        number.append(table.cell_value(i, 0))
        duration.append(table.cell_value(i, 1))
        mileage.append(table.cell_value(i, 2))
    flights = []  # 创建列表,以将类通过append加入其中,避免覆盖
    for i in range(1, nrows):
        flights.append(flight())
    for i in range(0, nrows - 1):
        flights[i].number = number[i]
        flights[i].duration = duration[i]
        flights[i].mileage = mileage[i]
    return flights

getCritical.py

import numpy as np


def criticalAircraft(data_matrix, capacity):
    parameter_m1 = np.lexsort(data_matrix.T[:3, :])  # 对a做转置,按照第二行升序(相当于第二列升序)
    Ascending_remind_time = data_matrix[parameter_m1, :]
    return Ascending_remind_time[:capacity,:]

getLongestPath.py

# 贪价格
class Greedy(object):
    def greedy(self, flights, remind_time):  # flights是未分配的航班集合,remind time是aircraft的剩余使用时间
        result = []
        sum_duration = 0
        total_distance=0
        flights.sort(key=lambda obj: obj.mileage/obj.duration,reverse=True)
        for i in flights:
            if sum_duration + i.duration <= remind_time :
                sum_duration = sum_duration + i.duration
                total_distance = total_distance + i.mileage
                result.append(i.number)
                flights.remove(i)

        return result, sum_duration, total_distance

Data set 数据集说明

Data set explaination

 

Discussion 讨论

Why using greedy algorithm?

- It can not always bring out the best solution

- Its result has lower risk of error in run time and faster execution speed in general compared with dynamic programming

How to react in the situation if the plane with the same remaining time crosses the boundary?

- Add more attributes (e.g., ’aircraft conditions’) in the aircraft entities to do the comprehensive judgment in sort.

- Determined by checking history records from Technical Log (defects, abnormalities etc.)

- Counting number of detects

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值