Gale Shapley偏好生成

时间:2015-11-24 17:26:02

标签: c++

我有一个我正在研究的c ++代码,这让我很难过。我写了一个Gale Shapley算法。我现在正在尝试创建一个生成所有可能的首选项组的函数。我会尝试尽可能清楚。

说我有3个男人和3个女人。

每个男人或女人都会有3个男人或3个女人的偏好列表。

每个人可以有6个不同的名单。

因此可以有6 * 5 * 4 = 120个不同的3组来测试一组男性或女性。现在有3名男性和3名女性,共有120 ^ 2个不同的分组进行测试。我需要生成所有14440这些选项,所以我可以将它们传递给我的算法来测试我是否可以打破它。

我一直在努力弄清楚如何做到这一点。有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

您的问题听起来像是需要弄清楚每个男女都可以拥有的偏好列表的所有可能排列。嵌套循环中的std::next_permutation似乎是处理此问题的好方法。

类似的东西:

// initialize men's preferences
std::vector<int> menPreferences(numMen*numWomen); 
for (int i = 0; i < numMen; ++i) {
    resetPermutation(menPreferences, i, numWomen);
}

// intialize women's preferences
std::vector<int> womenPreferences(numWomen*numMen);
for (int j = 0; j < numWomen; ++j) {
    resetPermutation(womenPreferences, j, numMen);
}

// note that each individual preference list is currently sorted (pre-req of std::next_permutation)
// nested loops to consider all the possible permutations

// First handle men
for (int i = 0; i < numMen; ++i) {
    std::vector<int>::iterator manIt = menPreferences.begin() + (i*numWomen);
    do {

        // Now handle women
        for (int j = 0; j < numWomen; ++j) {
            std::vector<int>::iterator womanIt = womenPreferences.begin() + (j*numMen);
            do {

                // Actually test algorithm with current preference lists
                testGaleShapely(menPreferences, womenPreferences);

            } while ( std::next_permutation(womanIt, womanIt+numMen) );

            // Reset permutation for next iteration
            resetPermutation(womenPreferences, j, numMen);
        }
    } while ( std::next_permutation(manIt, manIt+numWomen) );

    // Reset permutation for next iteration
    resetPermutation(menPreferences, i, numWomen);
}

然后简单的resetPermutation函数将被定义为:

// Reset the permutation for an individual's preference list 
void resetPermutation(std::vector<int>& preferences, int index, int size) {
    for (int i = 0; i < size; ++i) {
        preferences[index*size + i] = i;
    }
}

免责声明:我已经动态地写了这个并且没有测试过它。它肯定有错误(任何人都可以自由地告诉我,所以我可以修复)。但是,我希望它为您提供如何处理此问题的好主意。