如何在速度更新后让粒子群在每个粒子中具有唯一值,其中一些值必须是整数而一些是浮点数

How to teak Particle swarm to have unique values in every particle after velocity update, where some value must be integer and some float

我正在尝试解决 PSO(粒子群优化)以获得一个粒子,其中一些值必须是整数并且必须是唯一的,而一些是浮点数(可能不是唯一的) 例如每次速度更新后都需要这样的解决方案: {0,2,1,5,4,6,8,7,0.087,0.345} 前八个值必须是唯一的整数,后两个可以是定期更新。 我遇到的问题是,在速度更新后,前八个值往往会重复,例如:{0,0,1,2,3,4,5,6,7,0.76,0.345}。如何实现? 非常感谢您的帮助。 谢谢

在单个粒子的速度(和位置)更新之后,我假设您对 8 个(位置?)值中的前 6 个执行一些离散化,以将它们从浮点数转换为整数。这一步需要定义一个measure来保证整数的唯一性。

假设,对于某些粒子 i,我们在速度更新后有以下位置矩阵(省略第 7 和第 8 个条目)

posVector(particle i) = {0.1, -0.2, 1.3, 6.2, 2.4, 1.6}.

如果我们只是四舍五入这些数字,我们最终会得到整数

posVectorInt(particle i) = {0, 0, 1, 6, 2, 2},

其中的条目是非唯一的。解决此问题的一种简单方法是,在转换 float->int 之前,对位置 1 到 6 中的数字进行排序,例如 w.r.t。增加价值,因为

posVectorRank(particle i) = {2, 1, 3, 6, 5, 4}.

接下来,我们可以开始舍入粒子,从等级 1 开始,但是,从等级 2 开始,确定舍入值不等于之前舍入的值。在一些 pseudo/mixed-code,

// Rank 1 rounding
for entry in posVectorRank where posVectorRank(entry) = 1 
    posVector(entry) = round(posVector(entry)) 

// Rank 2->6 rounding
for entry in posVectorRank where posVectorRank(entry) = 2 to 6
    previousInteger = posVector(entry-1)
    if round(posVector(entry-1)) equals previousInteger
        posVector(entry) = round(posVector(entry))+1
    else
        posVector(entry) = round(posVector(entry))

这将导致最终的 posVectorInt 为

posVectorInt(particle i) = {1, 0, 2, 6, 4, 3}.

但是请注意,构建一个更复杂的 "rank -> integer" 函数可能会更好,该函数考虑了例如群体最佳或粒子最佳值 w.r.t。 objective 函数。

如果您使用此方法为某些具有混合连续和整数值(决策)变量的优化问题找到最优解,请注意此类问题是非凸的。通过四舍五入,从 "good" 连续松弛变量向量到在非松弛问题中可行的(整数)向量不一定会在后者中产生 "good" 解。因此,如果您决定在这种情况下使用 PSO,"rank -> integer" 方法可能应该包含一些聪明的启发式方法,构建时考虑到要解决的实际问题。这本身就是——根据我的经验——使用 PSO 的一种不寻常的方法,因为 PSO 通常被认为是一种 "brute-force" 解决 nonlinear/nonconvex 优化问题的方法 连续 个变量。