最近在学 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. elasticsearch 深入 —— 全文检索

    全文搜索 我们已经介绍了搜索结构化数据的简单应用示例,现在来探寻 全文搜索(full-text search) :怎样在全文字段中搜索到最相关的文档. 全文搜索两个最重要的方面是: 相关性(Relev ...

  2. Linux ssh黄金参数

    Linux ssh黄金参数 命令: -o ConnectionAttempts= -o PasswordAuthentication=no -o StrictHostKeyChecking=no cp ...

  3. Vue-列表渲染 非变异方法

    变异方法 (mutation method),顾名思义,会改变被这些方法调用的原始数组.相比之下,也有非变异 (non-mutating method) 方法,例如:filter(), concat( ...

  4. golang-练习3

    题目:将输入的字母变成其下一个字母,并且元音字母大写 package main import "fmt" func LetterChanges(str string) string ...

  5. 高手教您编写简单的JSON解析器

    编写JSON解析器是熟悉解析技术的最简单方法之一.格式非常简单.它是递归定义的,所以与解析Brainfuck相比,你会遇到轻微的挑战 ; 你可能已经使用JSON.除了最后一点之外,解析 Scheme的 ...

  6. [BZOJ5428][九省联考2018]双木棋

    去年觉得高不可攀的题啊... 貌似就很沙茶了QAQ 直接状压每一行是多少然后合法状态是LIS状态数极少所以随便dp一下就好了啊... 注意初值啥的得赋对才行QAQ 我菜死了 //Love and Fr ...

  7. struts2中的Action实现的三种方式

    Action类创建方式有哪些? 方式一:直接创建一个类,可以是POJO,即原生Java类,没有继承任何类,也没有实现任何接口 这种方式使得strust2框架的代码侵入性更低,但是这种方式是理想状态,开 ...

  8. 18.Vim基础指令(自用)——2019年12月13日

    title: vim study date: "2018-12-26 20:17:16" tags: 指令学习 categories: 技术驿站 vim study 2018年12 ...

  9. git基础常用命令

    常用命令 git init //初始化本地git环境 git clone XXX//克隆一份代码到本地仓库 git pull //把远程库的代码更新到工作台 git pull --rebase ori ...

  10. oracle常用sql汇总(随时更新)

    1.wm_concat:将返回的多行数据汇总为一列,用,分割,数据类型默认为CLOB类型 2. 递归查询(树状结构数据查询,如菜单,部门等等) SELECT [LEVEL],* FEOM table_ ...