如何在A ++中将Ampl中的集合表示为向量?

时间:2018-11-02 13:29:35

标签: c++ vector ampl

我有两个要在c ++中实现的放大器集,分别是NS和S。 但是我对集合S不太了解。

set N ordered := {1..n};
set NS ordered := 1..(2**n-1);
set S {s in NS} := {i in N: (s div 2**(ord(i)-1)) mod 2 = 1};

如果n = 4,我将拥有:

set N := 1 2 3 4

set NS := 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15;

set S[1] := 1;
set S[2] := 2;
set S[3] := 1 2;
set S[4] := 3;
set S[5] := 1 3;
set S[6] := 2 3;
set S[7] := 1 2 3;
set S[8] := 4;
set S[9] := 1 4;
set S[10] := 2 4;
set S[11] := 1 2 4;
set S[12] := 3 4;
set S[13] := 1 3 4;
set S[14] := 2 3 4;
set S[15] := 1 2 3 4;

可以轻松创建第一组。

vector <int> NS;
int auxMax = pow(2,n)-1;
for (int i = 0; i < auxMax; i++) {
    NS.push_back(i);
}

尽管我知道运算符div(将左操作数除以右操作数时返回截断的商),mod(计算余数)和ord(返回[i]在集合N中的数字位置)是如何工作的,我无法为进给集S设置“ for”结构。 谁能帮助我理解set S的生成并将其转换为c ++中的向量?

谢谢!

1 个答案:

答案 0 :(得分:0)

我对ampl不熟悉,但我会尝试一下: 假设我理解{}转换为某种形式的向量类型。

结果如下:

int main()
{
  const int n = 4;
  int NS = pow(2, n) - 1;

  std::vector< std::vector<int> > S;
  for (int s = 1; s <= NS; s++) // {s in NS}                                    
    {
      std::vector<int> iN;
      for (int ord_i = 1; ord_i <= n; ord_i++) // {i in N}                      
        {
          if ((s / (int)pow(2, ord_i - 1)) % 2 == 1)
            iN.push_back(ord_i);
        }
      S.push_back(iN);
    }
 }