Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对集合进行拆分,每个子集都要考虑其项属性的概率 对于一个小游戏(我有点被迫使用C++,所以基于STL的解决方案在这里很有趣),我遇到了下面的问题。我想知道是否有任何关于这个主题的文献我可以阅读,或者聪明的实现_C++_Algorithm - Fatal编程技术网

对集合进行拆分,每个子集都要考虑其项属性的概率 对于一个小游戏(我有点被迫使用C++,所以基于STL的解决方案在这里很有趣),我遇到了下面的问题。我想知道是否有任何关于这个主题的文献我可以阅读,或者聪明的实现

对集合进行拆分,每个子集都要考虑其项属性的概率 对于一个小游戏(我有点被迫使用C++,所以基于STL的解决方案在这里很有趣),我遇到了下面的问题。我想知道是否有任何关于这个主题的文献我可以阅读,或者聪明的实现,c++,algorithm,C++,Algorithm,唯一项{E1,E2,E3}的集合,每个项E具有一组属性,{P1,P2,P3…} 该集合应分为S1、S2、S3、S4。定义了S1..4的确切大小。我们可以假设,对于问题的其余部分,集合可以正确地按这些大小分割 现在,对于S1,可以出现许多约束,{C1,C2..},这些约束指定,例如,属性P1的项不能出现在其中。另一个约束可能是,它应该有利于属性P2的项,其系数为0.8(我们可以假设这些类型的约束对于每个属性的所有子集都是标准化的) “权重”并不难实现。我只是用候选数字填充一些数组,在这个数组中,权

唯一项{E1,E2,E3}的集合,每个项E具有一组属性,{P1,P2,P3…}
该集合应分为S1、S2、S3、S4。定义了S1..4的确切大小。我们可以假设,对于问题的其余部分,集合可以正确地按这些大小分割

现在,对于S1,可以出现许多约束,{C1,C2..},这些约束指定,例如,属性P1的项不能出现在其中。另一个约束可能是,它应该有利于属性P2的项,其系数为0.8(我们可以假设这些类型的约束对于每个属性的所有子集都是标准化的)

“权重”并不难实现。我只是用候选数字填充一些数组,在这个数组中,权重越高的数字代表的越多。然后我选择数组中的一个随机元素。数组的大小决定精度/粒度(在我的例子中,一个小数组就足够了)

问题是禁止某些项目出现。这很容易导致S中的一个项目需要放置在子集S1、S2、S3或S4中的一个中的情况,但这不会再发生,因为子集全部满,或者未满的子集具有特定约束,该项目不能出现在集合中。所以你必须回溯位置。这样做太频繁可能会太多地违反加权概率

这个问题如何命名,或者它是否容易映射到另一个(可能是NP)问题

编辑:示例:

S={A,B,C,D,E,F,G,H,I,J,K,L,M}

S1=[0.8有元音的概率,不能有I或K,大小=6]
S2=[0.2有元音的概率,不能有M、B、E,大小=7]

现在,假设我们开始填写FOR(S中的字母):

字母A,基于属性约束创建填充数组(0.8 vs 0.2):
[1,1,1,1,1,1,1,1,2]。
从该数组中选择一个随机元素:1

现在,在S1中加入A

例如,对于字母I,唯一的候选字母是2,因为S1有一个约束条件,我不能出现在其中

继续这样做,最终你可能会得到:
C={M}//还要分发一封信

S1=A、B、D、E、F、G
S2=C,F,G,I,K,L

现在,在哪里放置M?I t不能放在S1中,因为该值已满,而不能放在S2中,因为它有一个M不能放在其中的约束。
唯一的方法是回溯一些位置,但是我们可能会过多地干扰加权分布(f.i.,给S2一个S1元音,它会翻转自然分布)


请注意,当更多的子集在起作用时,而不是仅仅2个子集时,这会变得稍微复杂一些(在需要更多回溯的意义上)。这类似于具有硬约束和软约束的约束满足问题(CSP)。有两种标准算法可以实现这一点,但您必须检查它们是否适用于您的特定问题实例


检查初学者。

这个启发式方法怎么样:

1考虑到约束和完整集合的限制,找到仅满足单个集合标准的任何元素,并将其放置在那里。如果在任何时候,其中一个插入导致集合变满,请重新评估元素,以仅满足单个集合的条件

2现在只看可以恰好容纳两个集合的元素。对于每个元素,如果添加该元素,则计算每个集合所需概率的差异,如果未添加该元素,则计算所需概率的差异。将元素插入到集合中,插入将产生最佳短期结果(first fit/贪婪算法)。如果插入填充了一个集合,请重新评估元素,使其仅满足两个集合的条件

3对于适合3组、4组的元素,请继续。。。n套


此时,所有元素将被放入满足所有约束的集合中,但概率可能不是最优的。您可以继续在集合之间交换元素(仅允许不违反约束的交换),在描述满足所有概率的程度的函数上使用梯度下降或随机重新启动希尔剪辑算法。这将趋向于收敛到最优解,但不能保证满足它。继续,直到您的要求在可接受的范围内,或者直到达到固定的时间限制,或者直到可能的改进低于设定的阈值。

您能更好地解释一下“权重”吗?也许通过提供一个小例子?我编辑了一个例子,希望它现在更清楚这是什么样的问题。是的,这是一个非常好的技术。我到了1号。但没有想到通过检查更多子集的连续交点来简化回溯空间。这似乎是向量打包或向量调度问题的一种变体,其中维度是属性,每个元素是1和0的向量,它满足这些属性,以及根据每个维度中的binSize*probabilityForElement确定大小的箱子。如果你搜索研究论文,你可能会发现一个比我上面推荐的交换和爬山更有效的算法。