百科http://baike.baidu.com/subview/11804317/12175605.htm
婚姻的稳定性问题就是研究 N 对男女在允许自由组合的情况下最终稳定的结果。假设这 N 对男女中,一开始都是单身,所有单身男生开始追求自己心目中最优秀的女生,而女生则会选择其眼中最优秀的追求者,并拒绝其他男生。其他男生一旦被拒绝就不再追求该女生,而是转向去追求自己心目中次优的女生。当一个处于恋爱关系中的女生遇到一个更好的男生的追求时,她就会甩掉当前的男朋友,选择更好的男生作为新男朋友。以此类推,直到所有人都结成情侣为止。
本实验在此基础上进行改进,只有当新追求者比旧追求者得分高出一定值的时候才选择后者。
PHP实现:http://simplebymoming.applinzi.com/marriage.html(5对以内能在有限时间内跑出结果,3对一般都能很快得到结果)
事实证明,用PHP实现这个真的是很愚蠢的做法。当对数增加时,会使得复杂度变得很大,而得不到最终结果的时候网页无法完成加载,所以最后的结果就是跑死了。。。仅仅是为了好玩。
新增MATLAB代码:https://github.com/Momingcoder/Mathematical-Modeling/tree/master/Stable%20Marriage
function test_input($data) {//处理表单数据
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
//矩阵的初始化
$MaleScore = array();//男生对女生的评分
for($i = 0; $i < $couple; $i++) {
$tmpscore = array();
for($j = 0; $j < $couple; $j++) {
array_push($tmpscore, rand(0, 100));
}
arsort($tmpscore);
array_push($MaleScore, $tmpscore);
}
//列表的初始化
$MaleSingle = array();//单身男生列表
for($i = 0; $i < $couple; $i++) {
array_push($MaleSingle, 1);
}
while(max($MaleSingle) != 0) {}
function getManLover($score, $list) {//获取下一个表白的序号
$tmp = 0;
$pos = 0;
for($i = 0; $i < $GLOBALS['couple']; $i++) {
if($tmp < $score[$i] && $list[$i] == 0) {
$tmp = $score[$i];
$pos = $i;
}
}
return $pos;
}
function getWomanLover($score, $list, $single) {//获取最佳追求者序号
$tmp = 0;
$pos = -1;
for($i = 0; $i < $GLOBALS['couple']; $i++) {
if($tmp < $score[$i] && $list[$i] == 1 && $single[$i] == 1) {
$tmp = $score[$i];
$pos = $i;
}
}
return $pos;
}
if($FemaleCouple[$i] == -1) {//还没男朋友的
$FemaleCouple[$i] = $pos;
$MaleSingle[$pos] = 0;
}
elseif($FemaleScore[$i][$pos] - $FemaleScore[$i][$FemaleCouple[$i]] > $tolerate) {
$MaleList[$FemaleCouple[$i]][$i] = 1;
$MaleSingle[$pos] = 0;
$MaleSingle[$FemaleCouple[$i]] = 1;
$FemaleCouple[$i] = $pos;
}
function refuseExcept($pos, $list, $target) {//拒绝其他人
global $MaleList;
for($i = 0; $i < $GLOBALS['couple']; $i++) {
if($i != $pos && $list[$i] == 1) {
$MaleList[$i][$target] = 1;
}
}
}
echo "couple: $couple <br> tolerate: $tolerate <br>" ;
echo "Girls' score in boys' eyes( i 行 j 列的数值表示在第 i 个男生眼中第 j 个女生的得分)<br>";
for($i = 0; $i < $couple; $i++) {
for($j = 0; $j < $couple; $j++) {
echo $MaleScore[$i][$j], "\t";
}
echo "<br>";
}
echo "Boys' score in girls' eyes( i 行 j 列的数值表示在第 i 个女生眼中第 j 个男生的得分)<br>";
for($i = 0; $i < $couple; $i++) {
for($j = 0; $j < $couple; $j++) {
echo $FemaleScore[$i][$j], "\t";
}
echo "<br>";
}
echo "<br>---------------result----------------<br>";
for($i = 0; $i < $couple; $i++) {
echo "Couple".($i+1).": Girl's score in boy's eyes: ".$MaleScore[$FemaleCouple[$i]][$i]."------Boy's score in girl's eyes: ".$FemaleScore[$i][$FemaleCouple[$i]]."<br>";
}