Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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++ 涉及向量(数组)的快速简单约束编程_C++_C++11_Constraints_Constraint Programming - Fatal编程技术网

C++ 涉及向量(数组)的快速简单约束编程

C++ 涉及向量(数组)的快速简单约束编程,c++,c++11,constraints,constraint-programming,C++,C++11,Constraints,Constraint Programming,我有很多很多向量,我需要用一些非常基本的一阶逻辑来检查数字的重复 我可以使用交叉路口,但事实证明这太慢了。我想我可以把这变成一个逐位的问题。完整的整数集是已知的,每个向量/数组可以表示为一个位集,但我只能找到半个解 我目前使用循环和向量求交,但对于我需要检查的问题数量来说,它太慢了 举一个简单的例子: E: 1 2 F: 2 4 M: 1 3 N: 4 5 A: 5 6 我试图确定的问题始终是一个更大的格式: (E || F) && (M || N) &&

我有很多很多向量,我需要用一些非常基本的一阶逻辑来检查数字的重复

我可以使用交叉路口,但事实证明这太慢了。我想我可以把这变成一个逐位的问题。完整的整数集是已知的,每个向量/数组可以表示为一个位集,但我只能找到半个解

我目前使用循环和向量求交,但对于我需要检查的问题数量来说,它太慢了

举一个简单的例子:

E: 1 2
F: 2 4
M: 1 3
N: 4 5  
A: 5 6
我试图确定的问题始终是一个更大的格式:

(E || F) && (M || N) && A -> which is proven as possible by selecting F,M,A.
我需要验证上述内容是否可以不重复

有没有一种检查向量/数组的方法比900万个循环更快? 约束库是唯一的选项吗

努力澄清:

容器是std::vector

向量包含任何整数

我需要逐一检查它们,以确定完整的整数集

使用指定的条件逻辑选择整个向量,是否会发生重复? 正在使用的条件运算符始终是“AND”和“OR”。我列出的问题是一个简化版本,但这就是它的全部内容。只是大小不同而已

我不太关心的输出。它可能是一个布尔值,另一个潜在重复向量,等等。我正在努力找到适合这项工作的工具,而不是挽救


在我目前的设置中,我将通过分析强制项(如A)并删除任何与之相交的项来解决此问题。。。(在这种情况下,N…然后我会再次循环,对M执行相同的过程,这现在是一个强制选择,删除E,留下F.

如果我正确理解这个问题,这是一个集合划分问题,其中来自某个“宇宙”的值(即集合中的所有值)应选择,以便一个值正好位于所选集合中的一个集合中。这是一个特定的条件,集合的可能组合是可能的

我已经在MiniZinc(一个非常高级的约束编程系统,请参阅我的MiniZinc页面以获取更多信息和更多链接:)中实现了上述(简单)问题

模型如下: 全文抄录如下:

include "globals.mzn"; int: n = 5; % number of sets array[1..n] of set of int: s = [ {1,2}, % E {2,4}, % F {1,3}, % M {4,5}, % N {5,6} % A ]; % All values (the "universe") set of int: values = {j | i in 1..n, j in s[i]}; % decision variables array[1..n] of var bool: x; % which set (in s) to select array[1..n] of var set of values: xs; % the selected sets solve satisfy; % Minimize the number of selected sets % solve minimize sum(i in 1..n) (bool2int(card(xs[i]) > 0)); constraint % The condition % (E || F) && (M || N) && A ((x[1] \/ x[2]) /\ (x[3] \/ x[4]) /\ x[5]) /\ forall(i in 1..n) ( % If this set is selected (in x[i]), put s[i] in xs[i] (x[i] xs[i] = s[i]) /\ % ensure not selected sets are represented as {} in xs (not(x[i]) card(xs[i]) = 0) ) /\ % make sure that a value is selected in exactly one set partition_set([xs[i] | i in 1..n], values) ; output [ "x: " ++ show(x) ++ "\n" ++ "xs: " ++ show(xs) ++ "\n" ]; 包括“globals.mzn”; int:n=5;%套数 整数集的数组[1..n]:s= [ {1,2},%E {2,4},%F {1,3},%M {4,5},%N {5,6}%A ]; %所有价值观(“宇宙”) int的集合:值={j|i in 1..n,j in s[i]}; %决策变量 var bool:x;%的数组[1..n],选择哪个集合(以s为单位) var值集的数组[1..n]:xs;%所选集 解决满足; %最小化所选集的数量 %求最小和(1..n中的i)(bool2int(card(xs[i])>0)); 约束 %状况 %(E | F)和&(M | N)和&&A ((x[1]\/x[2])/\(x[3]\/x[4])/\x[5]) /\ forall(1..n中的i)( %如果选择此集合(在x[i]中),则将s[i]放入xs[i] (x[i]xs[i]=s[i]) /\%确保未选择的集合在xs中表示为{} (非(x[i])卡(xs[i])=0) ) /\%确保仅在一个集合中选择了一个值 分区集([xs[i]| i in 1..n],值) ; 输出 [ “x:”++显示(x)+”\n“++” xs:“++显示(xs)++”\n” ]; 此问题有一个单一的解决方案:

x: [false, true, true, false, true] xs: [{}, {2, 4}, {1, 3}, {}, 5..6] x:[假,真,真,假,真] xs:[{},{2,4},{1,3},{},5..6] 其中,“x”是一个布尔数组,如果一个集合应该被选择或不被选择,“xs”包含被选择的集合(如果一个集合没有被选择,那么元素是{},即空的)。集合的划分是通过
partition\u set
函数完成的,该函数确保一个值在一个集合中,并且宇宙中的所有值(集合“值”)都在一个集合中他们在某个集合中

我不确定这个迷你锌模型是否有帮助,但如果没有其他东西的话,你可能会认为它是一种灵感。此外,这种情况的处理在这个模型中是硬编码的,所以这里不讨论

基于C++的CP系统Gecode()支持对设置变量和分区约束(称为“不相交”)在Gecode中,虽然我还没有对此问题进行过测试。


下面是一个如何在标准分区问题中使用“不相交”的示例:。

如果我正确理解该问题,这是一个集合分区问题,其中来自某个“宇宙”的值(即集合中的所有值)应选择,以便一个值正好位于所选集合中的一个集合中。这是一个特定的条件,集合的可能组合是可能的

我已经在MiniZinc(一个非常高级的约束编程系统,请参阅我的MiniZinc页面以获取更多信息和更多链接:)中实现了上述(简单)问题

模型如下: 全文抄录如下:

include "globals.mzn"; int: n = 5; % number of sets array[1..n] of set of int: s = [ {1,2}, % E {2,4}, % F {1,3}, % M {4,5}, % N {5,6} % A ]; % All values (the "universe") set of int: values = {j | i in 1..n, j in s[i]}; % decision variables array[1..n] of var bool: x; % which set (in s) to select array[1..n] of var set of values: xs; % the selected sets solve satisfy; % Minimize the number of selected sets % solve minimize sum(i in 1..n) (bool2int(card(xs[i]) > 0)); constraint % The condition % (E || F) && (M || N) && A ((x[1] \/ x[2]) /\ (x[3] \/ x[4]) /\ x[5]) /\ forall(i in 1..n) ( % If this set is selected (in x[i]), put s[i] in xs[i] (x[i] xs[i] = s[i]) /\ % ensure not selected sets are represented as {} in xs (not(x[i]) card(xs[i]) = 0) ) /\ % make sure that a value is selected in exactly one set partition_set([xs[i] | i in 1..n], values) ; output [ "x: " ++ show(x) ++ "\n" ++ "xs: " ++ show(xs) ++ "\n" ]; 包括“globals.mzn”; int:n=5;%套数 整数集的数组[1..n]:s= [ {1,2},%E {2,4},%F {1,3},%M {4,5},%N {5,6}%A ]; %所有价值观(“宇宙”) int的集合:值={j|i in 1..n,j in s[i]}; %决策变量 var bool:x;%的数组[1..n],选择哪个集合(以s为单位) var值集的数组[1..n]:xs;%所选集 解决满足; %最小化所选集的数量 %求最小和(1..n中的i)(bool2int(card(xs[i])>0)); 约束 %状况 %(E | F)和&(M | N)和&&A ((x[1]\/x[2])/\(x[3]\/x[4])/\x[5]) /\ forall(1..n中的i)( %如果选择此集合(在x[i]中),则将s[i]放入xs[i] (x[i]xs[i]=s[i]) /\%确保未选择的集合在xs中表示为{} (非(x[i])卡(xs[i])=0) ) /\%确保仅在一个集合中选择了一个值 分区集([xs[i]| i in 1..n],值) ; 输出 [ “x:”++显示(x)+”\n“++” xs:“++显示(xs)++”\n” ]; 此问题有一个单一的解决方案:

x: [false, true, true, false, true] xs: [{}, {2, 4}, {1, 3}, {}, 5..6] x:[假,真,真,假,真] xs:[{},{2,4},{1,3},{},5..6] 其中“x”