最近在学 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 基础 —— Get API

    Get API get API允许根据其id从索引中获取指定类型的JSON文档.以下示例从名为twitter的索引获取JSON文档,该索引类型名为_doc,id值为0: GET twitter/_do ...

  2. 【记录】ajax 设置请求header的Content-Type 为 application/json;charset=utf8

    具体案例如下 $.ajax({ url: context.state.IpccSendIm, method: 'POST', data: JSON.stringify(val), headers:{' ...

  3. shell判断用户是否已经在系统中登录

  4. Kvm --01 虚拟化基础概念

    目录 1. 虚拟化基础概念 01. 什么是虚拟化? 02. 为什么要用虚拟化? 03. 虚拟化在企业中的应用场景? 04. 虚拟化软件介绍 05. Kvm介绍 2. 安装部署Kvm 3. Kvm虚拟机 ...

  5. [BJOI2006]狼抓兔子(网络流)

    题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...

  6. CS184.1X 计算机图形学导论(第三讲)

    第一单元(介绍关于变换的数学知识) :基本二维变换 模型坐标系,世界坐标系 1.缩放 Scale(规模,比例) Sx表示在x方向上放大的倍数,Sy表示在y方向上放大的倍数,因此X坐标乘以Sx,Y坐标乘 ...

  7. vim/vi编辑工具实现多行注释和取消注释

    转载声明:本文为转载文章 原文地址:https://blog.51cto.com/3332935/2106143 多行注释: 进入命令行模式--> 将光标移动到要注释的第一行位置--> 按 ...

  8. vue-葵花宝典

    router-view 中包含 router-view 这种情况就可以 使用嵌套路由了 变化的视图中包含变化的视图 代码层面 router-view 中 包含router-view 路由childre ...

  9. 【8.0.0_r4】AMS架构与流程分析

    AMS主要用来管理应用程序的生命周期,以及其核心组件,包括Activity,Service,Provider,Broadcast,Task等 之前整体架构如下图(O上已经废弃) 新的架构比较直接,简化 ...

  10. ConcurrentHashMap1.7源码分析

    参考:https://www.cnblogs.com/liuyun1995/p/8631264.html HashMap不是线程安全的,其所有的方法都未同步,虽然可以使用Collections的syn ...