演算法 穩定匹配 C 版

2021-08-09 19:43:20 字數 3164 閱讀 5405

由於學習需要,然後花費將近兩天時間研究這個問題,然後用c++描述出來,具體內容看下面:

為了解決穩定匹配問題(stable matching problem),前輩們提出了gs演算法。

下面就是博主使用gs演算法完成的本題,同時在研究過程中發現了乙個新的匹配思路,將會在下面發出來(不知道前輩們有沒有提出過),大家可以積極提出寶貴意見:

問題分析:

1.首先輸入男士(女士)人數,這裡男士,女士人數相同並且要求最後每個人都有物件。

2.初始化所有男士,女士追求過物件人數better=0,對異性喜歡排名陣列rank,當前是否在約會狀態yuehui,以及現任為-1;

3.既然男的需要主動,那就讓所有單身狀態的男士向自己最喜歡的女士表白,不管結局成功與否,該男士追求過的人數都加1;

4.如果女士單身,那麼兩個人就暫時在一起先處著,更改兩個人是否約狀態為true,設定對方為自己的現任;

5.如果女士不是單身,此時就出現了小三,那麼主動權就交給女士了,此時女士比較現任小三,如果更喜歡現任。跳過當前追求者;如果更喜歡小三,拋棄現任,此時小三終於揚眉吐氣成功上位,並與當前追求者結合成暫時情侶去約會。

6.判斷是否全部找到物件,都找到了結束查詢,否則重複步驟:2-5,直到全部由物件;

7.結束,輸出;

程式設計

這裡使用歷史人物,(得到的最終匹配結果可能不與現實相同),男女各5名,對其進行編號。由編號代替其姓名。

各男士喜歡排名表:

(僅供實驗參考,最終資料為自行輸入)

各女士喜歡排名表:

(僅供實驗參考,最終資料為自行輸入)

定義人類(是人):

//人類

class people

void setrank(int mrank, int i);

int getrank(int i) ;

void setyuehui(bool myuehui);

bool getyuehui() ;

void setbetter(int mbetter);

int getbetter() ;

void setpresent(int mpressent);

int getpressent() ;

};

完整**:

#include

#include

using

namespace

std;

const

int num = 5;

int flag = 0;

//人類

class people

void setrank(int mrank, int i);

int getrank(int i) ;

void setyuehui(bool myuehui);

bool getyuehui() ;

void setbetter(int mbetter);

int getbetter() ;

void setpresent(int mpressent);

int getpressent() ;

};void people::setrank(int mrank, int i)

void people::setyuehui(bool myuehui)

void people::setbetter(int mbetter)

void people::setpresent(int mpressent)

int main()

}cout

<< "男士初始化完畢"

<< endl;

for (int i = 0; i < num; i++)

}cout

<< "女士初始化完畢"

<< endl;

while (true)

if (lady[girl].getyuehui() == true) //喜歡的女士不單身

if (lady[girl].getrank(j) == lady[girl].getpressent())

}//如果女士喜歡現任

if (before < now)

//女士喜歡

else

if (before>now)}}

}if (flag == 1)

}//輸出

for (int i = 0; i < num; i++)

}

最後,看下結果吧~~

最最後,畫了張圖並結合上面三張表述我的新思路:

最最最後,感謝你的訪問,有問題歡迎提出。

tony-chen

2017.10.25

心的強大因為鑑定!

穩定匹配婚姻 c 版GS演算法

給出乙個 n 個男性的集合 m和 n 個女性的集合 w,找到乙個 穩定 匹配。每位男性根據對女性的心儀程度從高至低進行排名 每位女性根據對男性的心儀程度從高至低進行排名。初始讓所有男孩女孩處於空閒狀態 while 存在任意男孩m是空閒的,且沒有對每個女孩求過婚 選擇這個男孩m 假設w是男孩m還沒求過...

GS穩定匹配演算法的實現C

演算法導論課的課程作業 include using namespace std 是否有單身的男人的判斷函式 bool man free bool man state,int n,int index return false 該男人是否和所有女人求過婚 bool man no date bool ma...

穩定婚姻匹配演算法

問題概述 n名男青年和n名女青年參加乙個相親會。經過了解,每名男青年在心目中都對所有女青年作了乙個排序,而每名女青年同樣也對男青年作了排序。問這些男女青年之間怎樣才能進行理想的配對。給出男青年和女青年的偏好矩陣 演算法求解過程 演算法設計 1 根據男性的偏好矩陣來進行遍歷 2 在男性的偏好矩陣中依次...