JavaScript 盖尔-沙普利算法
最近在学 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 盖尔-沙普利算法的更多相关文章
- c# 盖尔-沙普利算法的改进
盖尔-沙普利算法 “盖尔-沙普利算法”(the Gale-Shapley algorithm),也被称为“延迟接受算法”(deferred-acceptance algorithm),简称“GS算法” ...
- javascript数据结构与算法--高级排序算法
javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...
- javascript数据结构与算法-- 二叉树
javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...
- javascript数据结构与算法--散列
一:javascript数据结构与算法--散列 一:什么是哈希表? 哈希表也叫散列表,是根据关键码值(key,value)而直接进行访问的数据结构,它是通过键码值映射到表中一个位置来访问记录的,散列 ...
- javascript数据结构与算法---队列
javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...
- javascript数据结构与算法---栈
javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...
- javascript数据结构与算法---列表
javascript数据结构与算法---列表 前言:在日常生活中,人们经常要使用列表,比如我们有时候要去购物时,为了购物时东西要买全,我们可以在去之前,列下要买的东西,这就要用的列表了,或者我们小时候 ...
- javascript数组去重算法-----3
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- javascript数组去重算法-----2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- javaScript--基础 选择结构
2.短路现象--扩展 当 true 遇到 || , true || 表达式不执行, 右侧的表达式不执行 当false 遇到 && , false && 表达式不 ...
- 使用WakeLock将Android应用程序保持后台唤醒
前言: 一些手机app(如微信.QQ等)有新消息来到达,手机屏幕即使在锁屏状态下也会亮起,并提示用户有新消息.但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会使 ...
- 在Intellij上开发项目发布到tomcat时,同一个局域网内的其他机子访问不到自己电脑上tomcat中的项目,只能本机访问
在Intellij上开发项目发布到tomcat时,同一个局域网内的其他机子访问不到自己电脑上tomcat中的项目,只能本机访问 问题描述:在Intellij上开发项目发布到tomcat时,同一个局域网 ...
- 【转载】windows 开启 nginx 监听80 端口 以及 禁用 http 服务后,无法重启 HTTP 服务,提示 系统错误 123,文件目录、卷标出错
https://www.cnblogs.com/TianyuSu/p/9509873.html location / { proxy_set_header Host $Host; proxy_set_ ...
- show all privileges from a user in oracle
SELECT * FROM USER_SYS_PRIVS; SELECT * FROM USER_TAB_PRIVS; SELECT * FROM USER_ROLE_PRIVS; SELECT * ...
- 第三节:MySQL的调控按钮——启动选项和系统变量
一.命令行上使用启动选项 启动选项的通用格式 --启动选项1[=值1] --启动选项2[=值2] ... --启动选项n[=值n] 禁止TCP/IP链接 略 修改MySQL服务的默认存储引 ...
- 分布式架构的CAP原理
CAP 定理的含义 一.分布式系统的三个指标 1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标. Consistency Availability Parti ...
- oracle中分页函数写法
1.常见的分页查询语句: 查询21到40条之间的数据:SELECT *FROM (select UI.*,ROWNUM RN FROM (select * from user_info) AWHERE ...
- VM安装OSX进度条一半时卡住不动,【附】OSX10.10 ISO镜像文件
安装OSX10.10真是一波多折,先是下载了一个5G多的原版dmg文件,转成ISO后在虚拟机上无法识别,后按网上的说的方法在提取出来的BaseSystem.dmg文件,再转成ISO文件,可以 ...
- SDUT 1266 出栈序列统计(卡特兰数)
这道题是回溯算法,网上一查是卡特兰数先占上代码,题解过两天会写. #include <bits/stdc++.h> using namespace std; int main() { // ...