最近在学 JavaScript , 为了尽快熟悉语法,决定移植以前写的盖尔-沙普利算法。

c# 下的代码:https://www.cnblogs.com/aitong/p/10973774.html

在测试面向对象的继承特性时出现bug,也不知道怎么修改。所以这次就直接抛弃继承了。

<!DOCTYPE html>
<html> <head>
<meta charset="utf-8">
<title>盖尔-沙普利算法</title>
</head> <body>
<script>
function GetMaxPoint() {
return 1000;
};
function GetMinPoint() {
return 200;
};
function GetEstimatePoint(point)//估分
{
var mul = 0.8 + Math.random() * 0.4;
return point * mul;
}
//请求对象
function RequestObj(id, estimatePoint) {
this.ID = id;// 对象编号
this.EstimatePoint = estimatePoint;// 对象在自己心目中的估分
}; function Male(id) {
this.PartnerID = -1;//配偶id
this.ID = id;
this.Point = Math.random() * (GetMaxPoint() - GetMinPoint()) + GetMaxPoint();
this.MyEstimatePoint = GetEstimatePoint(this.Point);
this.PartnerEstimatePoint = 0;//配偶估分
this.RequestList = [];
}
Male.prototype.InitRequestList = function (femaleDic) {
this.RequestList = [];
for (var i = 0; i < femaleDic.length; i++) {
var female = femaleDic[i];
// var num = Math.floor(Math.random() * 10 + 1)//控制此人可以接触到的女性人数
// if (num != 1) {
// continue;
// }
var point = GetEstimatePoint(female.Point);//对对方评分
if (point > this.MyEstimatePoint) {
var mul = (point - this.MyEstimatePoint) / this.MyEstimatePoint;
if (mul < 0.2) {
this.RequestList.push(new RequestObj(female.ID, point));
}
}
else {
var mul = (this.MyEstimatePoint - point) / this.MyEstimatePoint;
if (mul < 0.2) {
this.RequestList.push(new RequestObj(female.ID, point));
}
}
}
this.RequestList.sort(RequestListSort);
}
Male.prototype.IfMarried = function () {
if (this.PartnerID < 0) {
return false;
}
else {
return true;
}
}
Male.prototype.GetSatisfaction = function ()//满意度
{
var satis = 0;
if (this.IfMarried()) {
satis = 0;
}
var mul = Math.abs(this.MyEstimatePoint - this.PartnerEstimatePoint) / GetMaxPoint() / 2;
if (this.MyEstimatePoint > this.PartnerEstimatePoint) {
satis = 50.0 * (1 - mul);
}
else {
satis = 50.0 * (1 + mul);
}
return satis;
}
RequestListSort = function (x, y)//降序
{
if (x.EstimatePoint < y.EstimatePoint) {
return 1;
}
if (x.EstimatePoint > y.EstimatePoint) {
return -1;
}
return 0;
}
Male.prototype.Request = function (maleDic, femaleDic)//求婚
{
if (this.IfMarried()) {
return;
}
if (this.RequestList.length == 0) {
return;
}
var female = femaleDic[this.RequestList[0].ID];
if (female.BeRequest(this, maleDic)) {
this.PartnerID = female.ID;
this.PartnerEstimatePoint = this.RequestList[0].EstimatePoint;
}
this.RequestList.splice(0, 1);
}
Male.prototype.Divorce = function ()//离婚
{
this.PartnerID = -1;
this.PartnerEstimatePoint = 0;
}
function Female(id) {
this.PartnerID = -1;//配偶id
this.ID = id;
this.Point = Math.random() * (GetMaxPoint() - GetMinPoint()) + GetMaxPoint();
this.MyEstimatePoint = GetEstimatePoint(this.Point);
this.PartnerEstimatePoint = 0;//配偶估分
this.RequestList = [];
}
Female.prototype.BeRequest = function (male, maleDic) {
var estimatePoint = GetEstimatePoint(male.Point);//先评分
if (this.IfMarried()) {
if (this.PartnerEstimatePoint < estimatePoint) {
var difference = estimatePoint / this.PartnerEstimatePoint;
if (difference > 1.5) {
maleDic[this.PartnerID].Divorce();
this.PartnerID = male.ID;
this.PartnerEstimatePoint = estimatePoint;
return true;
}
}
return false;
}
else//未婚
{
if (estimatePoint > (this.MyEstimatePoint * 0.8)) {
this.PartnerID = male.ID;
this.PartnerEstimatePoint = estimatePoint;
return true;
}
return false;
}
}
Female.prototype.IfMarried = function () {
if (this.PartnerID < 0) {
return false;
}
else {
return true;
}
}
Female.prototype.GetSatisfaction = function ()//满意度
{
var satis = 0;
if (this.IfMarried()) {
satis = 0;
}
var mul = Math.abs(this.MyEstimatePoint - this.PartnerEstimatePoint) / GetMaxPoint() / 2;
if (this.MyEstimatePoint > this.PartnerEstimatePoint) {
satis = 50.0 * (1 - mul);
}
else {
satis = 50.0 * (1 + mul);
}
return satis;
}
function Marry(maleNumber, femaleNumber) {
this.MaleDic = [];
this.FemaleDic = [];
for (var i = 0; i < maleNumber; i++) {
this.MaleDic.push(new Male(i));
}
for (var i = 0; i < femaleNumber; i++) {
this.FemaleDic.push(new Female(i));
}
for (var i = 0; i < this.MaleDic.length; i++) {
var male = this.MaleDic[i];
male.InitRequestList(this.FemaleDic);
}
}
Marry.prototype.GetMarriageCount = function () {
var count = 0;
for (var i = 0; i < this.MaleDic.length; i++) {
if (this.MaleDic[i].IfMarried()) {
count++;
}
}
return count;
}
Marry.prototype.GetSingleCount = function () {
return this.MaleDic.length + this.FemaleDic.length - this.GetMarriageCount() * 2;
}
Marry.prototype.GetMaleSatisfaction = function () {
var satisfaction = 0;
for (var i = 0; i < this.MaleDic.length; i++) {
var male = this.MaleDic[i];
var mySatis = male.GetSatisfaction();
satisfaction += mySatis
}
return satisfaction / this.MaleDic.length;
}
Marry.prototype.GetFemaleSatisfaction = function () {
var satisfaction = 0;
for (var i = 0; i < this.FemaleDic.length; i++) {
var female = this.FemaleDic[i];
satisfaction += female.GetSatisfaction();
}
return satisfaction / this.FemaleDic.length;
}
Marry.prototype.NeedMatch = function () {
for (var i = 0; i < this.MaleDic.length; i++) {
if ((this.MaleDic[i].RequestList.length > 0) && !this.MaleDic[i].IfMarried()) {
return true;
}
}
return false;
}
Marry.prototype.Start = function () {
var count = 0;
while (this.NeedMatch()) {
//console.log(count);
count++;
for (var i = 0; i < this.MaleDic.length; i++) {
this.MaleDic[i].Request(this.MaleDic, this.FemaleDic);
}
}
}
var marry = new Marry(100, 100);
marry.Start();
document.write("MaleSatisfaction: " + marry.GetMaleSatisfaction() + "<br>");
document.write("FemaleSatisfaction: " + marry.GetFemaleSatisfaction() + "<br>");
</script>
</body>
</html>

JavaScript 盖尔-沙普利算法的更多相关文章

  1. c# 盖尔-沙普利算法的改进

    盖尔-沙普利算法 “盖尔-沙普利算法”(the Gale-Shapley algorithm),也被称为“延迟接受算法”(deferred-acceptance algorithm),简称“GS算法” ...

  2. javascript数据结构与算法--高级排序算法

    javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...

  3. javascript数据结构与算法-- 二叉树

    javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...

  4. javascript数据结构与算法--散列

    一:javascript数据结构与算法--散列  一:什么是哈希表? 哈希表也叫散列表,是根据关键码值(key,value)而直接进行访问的数据结构,它是通过键码值映射到表中一个位置来访问记录的,散列 ...

  5. javascript数据结构与算法---队列

    javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...

  6. javascript数据结构与算法---栈

    javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...

  7. javascript数据结构与算法---列表

    javascript数据结构与算法---列表 前言:在日常生活中,人们经常要使用列表,比如我们有时候要去购物时,为了购物时东西要买全,我们可以在去之前,列下要买的东西,这就要用的列表了,或者我们小时候 ...

  8. javascript数组去重算法-----3

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. javascript数组去重算法-----2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. mod_jk是Apache服务器的一个可插入模块

    mod_jk简称JK,是Apache服务器的一个可插入模块,用以为Apache或IIS服务器提供处理JSP/Servlet的能力. Apache作为一款强大的Web服务器,本身缺乏处理JSP/Serv ...

  2. pylint在pycharm的使用及pylint的配置

    pylint作为python代码风格检查工具,接近 PEP8风格,在使用此方法的过程中,发现不仅能让代码更加规范,优雅,更能 发现 隐藏的bug. pylint在Pycharm中的2种安装方式: 第一 ...

  3. Sass Maps的函数-map-keys($map)

    map-keys($map) 函数将会返回 $map 中的所有 key.这些值赋予给一个变量,那他就是一个列表.如: map-keys($social-colors); 其返回的值为: "d ...

  4. Sass-数据类型

    Sass和JavaScript语言类似,也具有自己的数据类型,在Sass中包含一下几种数据类型 数字:如,1,2,13,10px; 字符串: 有引号字符串或无引号字符串,如,“foo”,"b ...

  5. zookeeper与kafka安装搭建

    1.2181:对cline端提供服务 2.3888:选举leader使用 3.2888:集群内机器通讯使用(Leader监听此端口)

  6. C++ KMP文本匹配

    代码如下: 环境为VC #include <iostream> #include <algorithm> #include <string> #include &l ...

  7. k8s-calico【转载】

    环境 系统:centos7.3192.168.40.50 local-master192.168.40.51 local-node1192.168.40.52 local-node2 master: ...

  8. Autoit脚本调用pscp上传小程序

    linux上传文件用pscp上传相对麻烦,如下写了个脚本方便上传 代码如下: $fileURL=@ScriptDir & "pscp.ini" If (FileExists ...

  9. SpringBoot---概述

    1.概述 1.1.SpringBoot解决什么问题? 1.1.1.配置---> 自动化配置 1.1.2.依赖---> SpringBoot提供了一系列的Start POM,整合各项功能的时 ...

  10. onkeyup的使用(将输入值为非数字的字符替换为空)

    onkeyup:当输入值的键盘抬起时触发这个事件. 例如: onkeyup="this.value=this.value.replace(/\D/g,'') 这是个正则式验证,用来验证输入值 ...