c++ - 如何将 ampl 中的集合表示为 C++ 中的向量?
问题描述
我有两个要在 c++ 中实现的 ampl 集合,集合 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”结构。任何人都可以帮助我理解集 S 的生成并将其转换为 c++ 中的向量吗?
谢谢!
解决方案
我不熟悉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);
}
}
推荐阅读
- arrays - Bash:数组变量在for循环中返回空输出
- java - Java程序可以并行运行而JVM作为单个进程运行吗?
- javascript - 反应选择无法从状态数组中删除项目
- java - 使比较器与等于一致
- python - 彩色图像到灰度之间的平滑转换
- image - 维基百科没有在现代浏览器上加载图像
- node.js - 在节点应用程序中显示来自 Dialogflow 的丰富响应
- powershell - AzureAd 模块的 VS Code PowerShell Intellisense
- go - 如果没有 EOF 错误,go ssh 会话将不会关闭
- javascript - 在数组中查找最大值,其中项目可能是数字或数组