最近在学 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. art-template补充

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

  2. wxstring与其他类型转换

    wxstring与其他类型转换 1.1 int to wxString: wxString str = wxString::Format(wxT("%i"),myInt); 1.2 ...

  3. tensorflow教程:tf.contrib.rnn.DropoutWrapper

    tf.contrib.rnn.DropoutWrapper Defined in tensorflow/python/ops/rnn_cell_impl.py. def __init__(self, ...

  4. 134-基于TMS320C6678、FPGA XC5VSX95T的一路Full模式Camera Link图像理平台

    基于TMS320C6678.FPGA XC5VSX95T的一路Full模式Camera Link图像理平台 一.板卡概述 该板卡采用TI公司新一代DSP TMS320C6678,结合FPGA,型号为X ...

  5. 微信小程序(11)--购物车

    今天记录一下购物车案例,实现购物车的全选,单选,数量加一减一,金额总数,以及清空购物车. <view class="main"> <!-- hasList 列表是 ...

  6. 关于springmvc 整合jackson报错问题

    spring mvc 在整合jackson中报错如下 Context initialization failed org.springframework.beans.factory.BeanCreat ...

  7. Java并发(基础知识)—— Java中断机制

    上文讲解了Java线程的创建.启动以及停止,在讲到停止线程时说到了Java中断,Java中断是停止线程的一种协作机制,本文打算对Java中断机制进行详细讲解. 在网上搜索Java中断机制,发现两篇好文 ...

  8. Angular JS - 8 - SeaJS与前端模块化

    一.前端模块化 关于前端模块化,参考以下链接 : https://github.com/seajs/seajs/issues/547 http://www.cnblogs.com/huiguo/cat ...

  9. POJ 2396 Budget (上下界网络流有源可行流)

    转载: http://blog.csdn.net/axuan_k/article/details/47297395 题目描述: 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表 ...

  10. 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

    洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...