1. 程式人生 > >geatpy庫模板sga_mps_real_templet簡單應用

geatpy庫模板sga_mps_real_templet簡單應用

sga_mps_real_templet
多種群獨立進化單目標程式設計模板(實值編碼)

問題

max=2*x1+3*x2;
x1+2*x2<=8;
4*x1<=16;
4*x2<=12;

程式碼(aimfuc)

import numpy as np


def aimfuc(Phen, LegV):
	x1 = Phen[:, [0]]
	x2 = Phen[:, [1]]
	f = 2 * x1 + 3 * x2
	# 約束條件
	idx1 = np.where(x1 + 2 * x2 > 8)[0]
	exIdx = np.unique(np.hstack([idx1])) # 得到非可行解在種群中的下標
	LegV[exIdx] = 0  # 對非可行解作出標記,使其在可行性列向量中對應的值為0
	return [f, LegV]

程式碼(main)

# -*- coding: utf-8 -*-
"""
執行指令碼main.py
描述:
    該demo是展示如何計算帶等式約束的單目標優化問題:
        max=2*x1+3*x2;
		x1+2*x2<=8;
		4*x1<=16;
		4*x2<=12;
    其中目標函式和約束條件寫在aimfuc.py檔案中,適應度罰函式寫在罰函式檔案punishing.py中
    本案例通過降維的方法,將等式約束化成了不等式約束,大大拓寬了可行解的空間,方便遺傳演算法求解
    此外,本案例展示了利用多種群競爭的進化演算法模板sga_mpc_real_templet瞭解決該問題。
"""

import numpy as np
import geatpy as ga

# 獲取函式介面地址
AIM_M = __import__('aimfuc')
PUN_M = __import__('punishing')
# 變數設定
x1 = [0, 4]  # 自變數1的範圍
x2 = [0, 3]  # 自變數2的範圍
b1 = [1, 1]  # 自變數1是否包含下界
b2 = [1, 1]  # 自變數2是否包含上界
ranges = np.vstack([x1, x2]).T  # 生成自變數的範圍矩陣
borders = np.vstack([b1, b2]).T  # 生成自變數的邊界矩陣
precisions = [4] * 2  # 在二進位制/格雷碼編碼中代表自變數的編碼精度,當控制變數是連續型時,根據crtfld參考資料,該變數只表示邊界精度,故設定為一定的正數即可
newRanges = ga.meshrng(ranges, gridnum=2)  # 對控制變數範圍進行網格化,網格邊長為2
# 生成網格化後的區域描述器集合
FieldDRs = []
for i in range(len(newRanges)):
	FieldDRs.append(ga.crtfld(newRanges[i], borders, precisions))
# 呼叫程式設計模板
[pop_trace, var_trace, times] = ga.sga_mpc_real_templet(AIM_M, 'aimfuc', PUN_M, 'punishing', FieldDRs, problem='R',
                                                        maxormin=-1, MAXGEN=100, NIND=50, SUBPOP=1, GGAP=0.9,
                                                        selectStyle='tour', recombinStyle='xovdprs', recopt=0.95,
                                                        pm=0.65, distribute=True, drawing=1)

結果

最優的目標函式值為:13.956462415814329
最優的控制變數值為:
4.0
1.98548747193811
有效進化代數:100
最優的一代是第 69 代
時間已過 3.666006326675415 秒

1