Gale Shapley偏好生成

Gale Shapley Preferences generation

本文关键字:Shapley Gale      更新时间:2023-10-16

我正在编写一个让我头疼的c++代码。我已经编写了一个Gale-Shapley算法。我现在正试图创建一个函数来生成所有可能的偏好组。我会尽量把这件事说清楚。

假设我有三个男人和三个女人。

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

每个人可以有6个不同的列表。

因此,可以有6*5*4=120个不同的3人组来测试一组男性或女性。现在,由于有3名男性和3名女性,总共有120^2个不同的分组需要测试。我需要生成所有14440个选项,这样我就可以将这些选项传递到我的算法中,以测试我是否可以破坏它

我几天来一直在想办法做到这一点。有什么想法吗?谢谢

你的问题听起来像是你需要找出每个男人和女人可能拥有的偏好列表的所有可能排列。嵌套循环中的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;
    }
}

免责声明:我已经写了这篇文章,但没有测试过。它肯定有错误(任何人都可以告诉我,所以我可以修复)。然而,我希望它能给你一个如何处理这个问题的好主意。