先看一下tsp_test文件
# -*- coding: utf-8 -*-
因为python里不支持中文,注释也不得行,所以加这行代码之后源文件里有中文也可以了
import numpy as np
import geatpy as ea
导入numpy和geatpy库
class TestProblem(ea.Problem):
继承geatpy里面的problem类
def __init__(self, testName):
定义初始化函数
name = testName
在函数里初始化name
self.places = np.loadtxt("data/" + testName + ".csv", delimiter=",", usecols=(0, 1))
这一行代码调用了np.loadtxt函数去读取cvs文件,这个函数的格式为
np.loadtxt(filepath,delimiter,usecols,unpack)
filepath:文件的路径
delimiter:加载文件分隔符
usecols: 加载文件中列索引
unpack: 当加载多列数据时是否需要将数据进行解耦赋值给不同的变量
M = 1
初始化目标维度,就是你有几个y值需要求,这里只有一个
Dim = self.places.shape[0]
决策变量的维数,就是有几个x
maxormins = [1] * M
是求最大值还是最小值,1是最小,-1是最大,这里是求最短距离所以是1
varTypes = [0] * Dim
决策变量的类型,0表示实数,1表示整数,这里是实数
lb = [0] * Dim # 决策变量下界
决策变量的下界,就是x的最小值范围是从0开始
ub = [Dim - 1] * Dim
决策变量的上界
lbin = [1] * Dim # 决策变量下边界(0表示不包含该变量的下边界,1表示包含)
ubin = [1] * Dim # 决策变量上边界(0表示不包含该变量的上边界,1表示包含)
决策变量上下界都包含
ea.Problem.__init__(self, name, M, maxormins, Dim, varTypes, lb, ub, lbin, ubin)
调用父类problem去实例化
def aimFunc(self, pop): # 目标函数
基本套路,初始化问题之后把目标函数放进去
x = pop.Phen.copy() # 得到决策变量矩阵
基本套路2,得到决策变量的矩阵,pop是population的类,调用此类中的Phen函数去得到矩阵
X = np.hstack([x, x[:, [0]]]).astype(int)
hstack,水平方向上平铺,astype,转换数组类型
ObjV = []
存储所有种群个体对应的路程
for i in range(pop.sizes):
journey = self.places[X[i], :] # 按既定顺序到达的地点坐标
distance = np.sum(np.sqrt(np.sum(np.diff(journey.T) ** 2, 0))) # 计算总路程
ObjV.append(distance)
pop.ObjV = np.array([ObjV]).T