鱼C论坛

 找回密码
 立即注册
查看: 81|回复: 1

怎么求蚁群算法极小值

[复制链接]
发表于 2024-6-4 15:00:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import numpy as np
import matplotlib.pyplot as plt


class ACO:
    #函数1
    def fitness(self, x):
        total=0
        for i in range(0,len(x)):
            total = total+x[i]
        y=np.floor((total*100)/100)
        return y
   
    #函数2
    # def fitness(self, x):
    #     sun=0
    #     for i in range(0,len(x)):
    #         if i<len(x)-1:
    #             sun+=100*(x[i+1]-x[i]**2)**2+(x[i]-1)**2
    #     return sun
   
    #函数3
    # def fitness(self,x):  
    #     sun=0
    #     for i in range(0,len(x)):
    #         sun+=(x[i]**2-10*np.cos(2*np.pi*x[i])+10)
    #     sun=sun+10*len(x)
    #     return sun
   
    #函数4
    # def fitness(self,x):  
    #     sun1=0
    #     sun2=1
    #     sun=0
    #     for i in range(0,len(x)):
    #         sun1+=x[i]**2
    #         sun2*=np.cos(x[i]/np.sqrt(i))
    #     sun=(1/400)*sun1-sun2+1
    #     return sun
    def __init__(self, parameters):
        """
        Ant Colony Optimization
        parameter: a list type, like [NGEN, pop_size, var_num_min, var_num_max]
        """
        # 初始化
        self.NGEN = parameters[0]  # 迭代的代数
        self.pop_size = parameters[1]  # 种群大小
        self.var_num = len(parameters[2])  # 变量个数
        self.bound = []  # 变量的约束范围
        self.bound.append(parameters[2])
        self.bound.append(parameters[3])

        self.pop_x = np.zeros((self.pop_size, self.var_num))  # 所有蚂蚁的位置
        self.g_best = np.zeros((1, self.var_num))  # 全局蚂蚁最优的位置

        # 初始化第0代初始全局最优解
        temp = 100000000000000000
        for i in range(self.pop_size):
            for j in range(self.var_num):
                self.pop_x[i][j] = np.random.uniform(self.bound[0][j], self.bound[1][j])
            fit = self.fitness(self.pop_x[i])
            print(fit)
            if fit < temp:
                self.g_best = self.pop_x[i]
                temp = fit
   

    def update_operator(self, gen, t, t_max):
        """
        更新算子:根据概率更新下一时刻的位置
        """
        rou = 0.8   # 信息素挥发系数
        Q = 1       # 信息释放总量
        lamda = 1 / gen
        pi = np.zeros(self.pop_size)
        for i in range(self.pop_size):
            for j in range(self.var_num):
                pi[i] = (t_max - t[i]) / t_max
                # 更新位置
                if pi[i] < np.random.uniform(0, 1):
                    self.pop_x[i][j] = self.pop_x[i][j] + np.random.uniform(-1, 1) * lamda
                else:
                    self.pop_x[i][j] = self.pop_x[i][j] + np.random.uniform(-1, 1) * (
                                self.bound[1][j] - self.bound[0][j]) / 2
                # 越界保护
                if self.pop_x[i][j] < self.bound[0][j]:
                    self.pop_x[i][j] = self.bound[0][j]
                if self.pop_x[i][j] > self.bound[1][j]:
                    self.pop_x[i][j] = self.bound[1][j]
            # 更新t值
            t[i] = (1 - rou) * t[i] + Q * self.fitness(self.pop_x[i])
            # 更新全局最优值
            if self.fitness(self.pop_x[i]) < self.fitness(self.g_best):
                self.g_best = self.pop_x[i]
        t_max = np.min(t)
        return t_max, t

    def main(self):
        popobj = []
        best = np.zeros((1, self.var_num))[0]
        for gen in range(1, self.NGEN + 1):
            if gen == 1:
                tmax, t = self.update_operator(gen, np.array(list(map(self.fitness, self.pop_x))),
                                     np.min(np.array(list(map(self.fitness, self.pop_x)))))
            else:
               tmax, t = self.update_operator(gen, t, tmax)
            popobj.append(self.fitness(self.g_best))
            # print('############ Generation {} ############'.format(str(gen)))
            # print(self.g_best)
            # print(self.fitness(self.g_best))
            if self.fitness(self.g_best) > self.fitness(best):
                best = self.g_best.copy()
            print('最好的位置:{}'.format(best))
            print('最大的函数值:{}'.format(self.fitness(best)))
        print("---- End of (successful) Searching ----")

        plt.figure()
        plt.title("Figure1")
        plt.xlabel("iterators", size=14)
        plt.ylabel("fitness", size=14)
        t = [t for t in range(1, self.NGEN + 1)]
        plt.plot(t, popobj, color='b', linewidth=2)
        plt.show()


if __name__ == '__main__':
    NGEN = 200
    popsize = 100
    low=[]
    up=[]
    demision=6
    for i in range(demision):
        low.append(1)
        up.append(40)
    parameters = [NGEN, popsize, low, up]
    aco = ACO(parameters)
    aco.main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-4 15:02:35 | 显示全部楼层
蚁群算法是一种模拟蚂蚁在寻找食物过程中的行为而发展起来的一种启发式优化算法。它通过模拟蚂蚁在环境中寻找最优路径的行为,来寻找最优解。

首先,让我们来解释一下你提供的代码。代码中的ACO类代表了蚁群算法的实现。fitness函数用于计算目标函数的值。update_operator函数用于更新每个蚂蚁的位置,并根据新位置计算总体最优解。main函数是蚁群算法的主要执行逻辑,包括循环迭代和绘制结果图。

现在让我们来看一下如何使用蚁群算法来求解一个极小值问题。我们需要按照以下步骤进行操作:

1. 初始化蚁群算法的参数,包括迭代次数(NGEN)、种群大小(popsize)、变量的上下限、问题的维度等。

2. 定义fitness函数,计算目标函数的值。在你提供的代码中,函数1是计算目标函数值的示例,你可以根据自己的问题定义相应的目标函数。

3. 在ACO类中的update_operator函数中编写更新位置和全局最优解的逻辑。

4. 在main函数中进行循环迭代,每次迭代都更新位置和全局最优解,并记录每次迭代的最优解和目标函数值。

5. 最后,在main函数中绘制迭代次数和目标函数值之间的关系图。

下面是一个修改过的代码示例,以帮助你更好地理解如何使用蚁群算法来求解极小值问题:
import numpy as np
import matplotlib.pyplot as plt
 
class ACO:
    def __init__(self, parameters):
        # 初始化蚁群算法的参数
        self.NGEN = parameters['NGEN']
        self.popsize = parameters['popsize']
        self.low = parameters['low']
        self.up = parameters['up']
        self.demension = parameters['demension']
        self.var_num = len(parameters['low'])
        self.g_best = None
 
    def fitness(self, x):
        # 计算目标函数的值
        total = 0
        for i in range(0, len(x)):
            total += x[i]
        y = np.floor((total * 100) / 100)
        return y
 
    def update_operator(self, gen, t, tmax):
        # 更新位置和全局最优解
        t = (1 - rou) * t + Q * self.fitness(self.pop_x)
        if self.fitness(self.pop_x) < self.fitness(self.g_best):
            self.g_best = self.pop_x
        tmax = np.min(t)
        return tmax, t
 
    def main(self):
        # 初始化种群
        self.pop_x = np.random.uniform(self.low, self.up, (self.popsize, self.var_num))
 
        popobj = []
        best = np.zeros((1, self.var_num))
        for gen in range(1, self.NGEN + 1):
            if gen == 1:
                tmax, t = self.update_operator(gen, np.array(list(map(self.fitness, self.pop_x))),
                                               np.min(np.array(list(map(self.fitness, self.pop_x))))))
            else:
                tmax, t = self.update_operator(gen, t, tmax)
                
            popobj.append(self.fitness(self.g_best))
            
            if self.fitness(self.g_best) > self.fitness(best):
                best = self.g_best.copy()
                
            print('最好的位置:{}'.format(best))
            print('最大的函数值:{}'.format(self.fitness(best)))
        
        print("---- End of (successful) Searching ----")
        
        plt.figure()
        plt.title("Figure1")
        plt.xlabel("iterators", size=14)
        plt.ylabel("fitness", size=14)
        t = np.arange(0, self.NGEN + 1)
        plt.plot(t, popobj, color='b', linewidth=2)
        plt.show()
 
 
if __name__ == '__main__':
    parameters = {
        'NGEN': 200,            # 迭代次数
        'popsize': 100,         # 种群大小
        'low': [1, 1, 1, 1, 1, 1],   # 每个变量的下限
        'up': [40, 40, 40, 40, 40, 40],   # 每个变量的上限
        'demension': 6          # 问题的维度
    }
    
    aco = ACO(parameters)
    aco.main()

注意:在你的代码中,存在一些问题,如未定义rou、Q、t等变量,以及pop_x和g_best的初始化等。你需要根据具体问题定义这些变量,并相应地修改代码。

希望这能帮到你!祝你成功解决问题,找到极小值!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-22 04:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表