# -*- coding: utf-8 -*-
"""
aimfc.py - 目标函数demo
描述:
    Geatpy的目标函数遵循本案例的定义方法，
    若要改变目标函数的输入参数、输出参数的格式，则需要修改或自定义算法模板
警告:
    本demo展示了一个危险的设计方法：直接通过修改非可行解的目标函数值来实现对约束条件的控制，
    此时稍有不慎就会让算法陷入非可行解中。
    建议使用罚函数来求得非可行解，利用对其适应度的惩罚来实现精准地控制约束条件。
"""

import numpy as np

def aimfuc(Phen):
    x1 = Phen[:, [0]]
    x2 = Phen[:, [1]]
    x3 = Phen[:, [2]]
    x4 = Phen[:, [3]]
    f = 18 * x1 + 10 * x2 + 12 * x3 + 8 * x4
    # 约束条件
    f[np.where(12 * x1 + 6 * x2 + 10 * x3 + 4 * x4 > 20)[0]] = 0
    f[np.where(x3 + x4 > 1)[0]] = 0
    f[np.where(x3 - x1 > 0)[0]] = 0
    f[np.where(x4 - x2 > 0)[0]] = 0
    return f
