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

Optimization 如何使粒子群在速度更新后在每个粒子中都有唯一的值,其中有些值必须是整数,有些值必须是浮点,optimization,integer,particles,Optimization,Integer,Particles,我试图解决PSO(粒子群优化)问题,使粒子中的某些值必须是整数且必须是唯一的,而某些值是浮动的(可能不是唯一的) e、 g.每次速度更新后,都需要这样的解决方案: {0,2,1,5,4,6,8,7,0.087,0.345} 前八个值必须是唯一的整数,后两个值可以定期更新。 我遇到的问题是,在velocity更新之后,前八个值趋于重复,例如:{0,0,1,2,3,4,5,6,7,0.76,0.345}。如何做到这一点? 非常感谢你的帮助。 谢谢在单个粒子的速度(和位置)更新之后,我假设您对8个(位

我试图解决PSO(粒子群优化)问题,使粒子中的某些值必须是整数且必须是唯一的,而某些值是浮动的(可能不是唯一的) e、 g.每次速度更新后,都需要这样的解决方案: {0,2,1,5,4,6,8,7,0.087,0.345} 前八个值必须是唯一的整数,后两个值可以定期更新。 我遇到的问题是,在velocity更新之后,前八个值趋于重复,例如:{0,0,1,2,3,4,5,6,7,0.76,0.345}。如何做到这一点? 非常感谢你的帮助。 谢谢

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

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

如果我们把这些数字四舍五入,我们将得到整数

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开始,确定舍入值不等于先前的舍入值。在一些伪/混合代码中

// 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(particle i) = {1, 0, 2, 6, 4, 3}.
然而,请注意,最好建立一个更复杂的“秩->整数”函数,该函数考虑了目标函数的群最佳值或粒子最佳值


如果您使用此方法来寻找某些具有混合连续和整数值(决策)变量的优化问题的最优解,请注意,此类问题是非凸的。通过四舍五入,从一个“好”的连续松弛变量向量到一个在非松弛问题中可行的(整数)向量,在后者中不一定产生一个“好”的解决方案。因此,如果您决定在这样的上下文中使用PSO,“rank->integer”方法可能包含一些巧妙的启发式方法,这些方法是根据要解决的实际问题构造的。根据我的经验,这本身就是使用粒子群优化算法的一种不同寻常的方法,因为粒子群优化算法通常可以被认为是解决连续变量非线性/非凸优化问题的一种“蛮力”方法。

嗨,谢谢你提供了详细的答案。整数的顺序也很重要。所以我认为给他们排名不是一个好办法。我想知道你是否能对此发表意见,如果从可用整数数组中移除并用数字替换重复数,这是一个好的解决方案吗?例如,在移除重复数partcile[I]之后,可用数={0,1,2,3,4,5}和粒子[I]=[0,1,1,2,3,4}=[0,1,5,2,3,4}如果不知道PSO问题的具体应用,很难说,但是请注意,我上面描述的简单舍入方法将在一定程度上保持整数的顺序(取决于它们之间的间隔),但这应该只被视为一个“骨架”,您可以自己进一步工作,“…构建更复杂的“rank->integer”函数可能更好。。。“。但是,对于给出的简单答案,将在我的答案中添加生成的posvectoring数组。关于您的建议,这同样取决于您试图解决的具体问题。您的方法将在您的PSO中插入一个额外的随机段(因为第二、第三等实例的重复数将在您的范围内随机),但这可能是有意的。鉴于您所陈述的信息,很难更彻底地回答。如果您对答案感到满意,请将您的问题标记为已回答,或编辑您的问题以包含更多细节,可能允许更具体的答案。
posVectorInt(particle i) = {1, 0, 2, 6, 4, 3}.