# -*- coding: utf-8 -*-
import numpy as np
import geatpy as ea
from MyProblem import MyProblem

def train(dim, maxIter):
	problem = MyProblem() # 生成问题对象
	NIND = dim             # 种群规模

	# 创建区域描述器，这里需要创建两个， 前2个变量用RI编码，剩余变量用排列编码
	Encodings = ['RI', 'P']
	Field1 = ea.crtfld(Encodings[0], problem.varTypes[:2], problem.ranges[:,:2], problem.borders[:,:2])
	Field2 = ea.crtfld(Encodings[1], problem.varTypes[2:], problem.ranges[:,2:], problem.borders[:,2:])
	Fields = [Field1, Field2]
	
	population = ea.PsyPopulation(Encodings, Fields, NIND) # 实例化种群对象（此时种群还没被初始化，仅仅是完成种群对象的实例化）
	myAlgorithm = ea.soea_psy_SEGA_templet(problem, population) # 实例化一个算法模板对象
	myAlgorithm.MAXGEN = maxIter # 最大进化代数
	[population, obj_trace, var_trace] = myAlgorithm.run() # 执行算法模板
	population.save() # 把最后一代种群的信息保存到文件中

	# 输出结果
	best_gen = np.argmin(problem.maxormins * obj_trace[:, 1]) # 记录最优种群个体是在哪一代
	best_ObjV = obj_trace[best_gen, 1]
	print('最优的目标函数值为：%s'%(best_ObjV))
	print('最优的控制变量值为：')
	for i in range(var_trace.shape[1]):
	    print(var_trace[best_gen, i])
	print('有效进化代数：%s'%(obj_trace.shape[0]))
	print('最优的一代是第 %s 代'%(best_gen + 1))
	print('评价次数：%s'%(myAlgorithm.evalsNum))
	print('时间已过 %s 秒'%(myAlgorithm.passTime))

def main():
	dim = 500
	maxIter = 500
	train(dim, maxIter)

if __name__ == '__main__':
	main()