遗传算法之飞机巡航问题 Python 实现
一、问题描述
我方有一个基地,经度和纬度为(70,40)。假设我方飞机的速度为 1000 公里每小时。 我方派一架飞机从基地出发,侦察完敌方所有目标,再返回原来的基地。在敌方每一目标点的侦察时间不计,求该架飞机所花费的时间。(假设我方飞机巡航时间可以充分长;数据附文章末。)
二、代码实现
import codecs
import numpy as np
import random
import matplotlib.pyplot as plt
class Optimization:
def __init__(self, group_size, generic_times, crossover_probability, mutation_probability, data_num):
# 遗传算法参数
self.group_size = group_size # 种群大小
self.generic_times = generic_times # 遗传代数
self.crossover_probability = crossover_probability # 交叉概率
self.mutation_probability = mutation_probability # 变异概率
# self.gene_length = gene_length # 基因长度
# 系统参数
self.group = [] # 初始的种群(基因序列, 由 initializer() 初始化)
self.longtitude = None # 由 initializer() 初始化
self.latitude = None # 由 initializer() 初始化
self.data_num = data_num # 总数据条数
self.distance_matrix = np.zeros((self.data_num + 2, self.data_num + 2)) # 距离矩阵(各点之间的距离矩阵, 由 initializer() 初始化)
self.data_dir = r"./data.txt"
# 系统初始化
self.initializer()
def initializer(self):
"""
优化器初始化组件
:return: None
"""
print("加载坐标数据...")
data = self.import_data() # 获取坐标数据
# 初始化巡航坐标
self.longtitude = np.hstack(([70.0], data[:, 0], data[:, 2], data[:, 4], data[:, 6], [70.0])) # 偶数列为经度
self.latitude = np.hstack(([40.0], data[:, 1], data[:, 3], data[:, 5], data[:, 7], [40.0])) # 奇数列为纬度
# 初始化距离矩阵
# 将坐标角度转换为弧度制数据
print("初始化距离矩阵...")
long = self.longtitude * (np.pi / 180)
lat = self.latitude * (np.pi / 180)
# 计算每个点之间的距离,并存放于 dis_matrix 矩阵中
for i in range(102):
for j in range(102):
if i == j: # 自己与自己的距离为 0
continue
# 三维距离公式求解两点间距离
tmp = np.cos(long[i] -