题目:

建立一个模型,来模拟推导社会男女择偶过程。

为了模型简化,一个人的特性指标有三个,这里假设为财富、样貌、品格,每个指标均可取值1-100之间任意数字。同样也对这3项指标有自己的需求。这3个需求值取值范围都在1-98间,当然三者的和必须为100.所以任意一个人可以用以下数组来表述:

G(A、B、C、A1、B1、C1)G代表男,M代表女。

举例G11(80、50、40、10、30、60),表示男11号,拥有财富80、样貌50、品格40,对异性品格的偏好为:财富在乎程度百分之10、样貌在乎程度百分之30、品格在乎程度百分之60。

同样为了模型简化,假设信息是完全对称的,即是说,每个人都能一眼就能看清楚任意一个人的财富、样貌、品格。

还是为了模型简化,我建模所用样本为男女各100个,即男女人数相同。

每个人对异性的满意度将如下定义:每个偏好指标与异性的对应的禀赋指标相乘,三个指标的乘积再相加,即他(她)对某个异性的满意度。

举例G11(80、50、40、10、30、60)对M(50、60、80、40、10、50)的满意度为:

(10*50+30*60+60*80)= 7100分

相对的 MM 对 GG的满意度则为:

(40*80+10*50+50*40) = 5700分

好了,配对活动开始,设计的配对法则如下:

1、100个男方,顺序,轮流从0号到99号女方中挑选自己最满意的一位,然后向她发出配对邀请。

2、接受邀请最多的女方开始行动,对这些邀请的男性中,选择最满意的一位。

3、那么这两位配对成功,剔除出样本,剩下的99对继续这样配对。

4、循环该配对法则,直到最后一对男女配对成功。

Person类

/**
* 类说明
* 描述:person类拥有共同属性
* @author erke
*/public class Person {/*** 匹配人ID*/private Integer id;/*** 性别*/private Integer  sex;/*** 个人财富*/private Integer  rich;/*** 个人外貌*/private Integer appearance;/*** 个人品格*/private Integer character;/*** 对异性财富在乎程度*/private Integer experich;/*** 对异性外貌在乎程度*/private Integer expeappearance;/*** 对异性品格在乎程度*/private Integer expecharacter;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getSex() {return sex;}public void setSex(Integer sex) {this.sex = sex;}public Integer getAppearance() {return appearance;}public void setAppearance(Integer appearance) {this.appearance = appearance;}public Integer getCharacter() {return character;}public void setCharacter(Integer character) {this.character = character;}public Integer getRich() {return rich;}public void setRich(Integer rich) {this.rich = rich;}public Integer getExpeappearance() {return expeappearance;}public void setExpeappearance(Integer expeappearance) {this.expeappearance = expeappearance;}public Integer getExpecharacter() {return expecharacter;}public void setExpecharacter(Integer expecharacter) {this.expecharacter = expecharacter;}public Integer getExperich() {return experich;}public void setExperich(Integer experich) {this.experich = experich;}public Person(Integer id, Integer appearance, Integer character, Integer rich, Integer expeappearance,Integer expecharacter, Integer experich) {super();this.id = id;this.sex = sex;this.appearance = appearance;this.character = character;this.rich = rich;this.expeappearance = expeappearance;this.expecharacter = expecharacter;this.experich = experich;}
}

FilechangeList类

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;/**
* 类说明
* 描述:转化类,把文件转化成集合
* @author erke
*/public class FilechangeList {/*** 男生文件*/String malePath = "D:\\demo\\erke\\male.txt";/*** 女生文件*/String femalePath = "D:\\demo\\erke\\female.txt";/*** 主角文件*/String playerPath = "D:\\demo\\erke\\players.txt";public ArrayList<Person> relay(String path){/*** 存储 Person 的集合*/ArrayList<Person> list = new ArrayList<Person>();try {BufferedReader br = new BufferedReader(new FileReader(path));String str = "";String tmp[] = null;while((str = br.readLine()) != null){tmp = str.split(",");list.add(new Person(Integer.parseInt(tmp[0]),Integer.parseInt(tmp[1]),Integer.parseInt(tmp[2]),               Integer.parseInt(tmp[3]),       Integer.parseInt(tmp[4]),Integer.parseInt(tmp[5]),Integer.parseInt(tmp[6])));}} catch (Exception e) {e.printStackTrace();}return list;}public static void show(ArrayList<Person> p){for(int i = 0;i < p.size();i++){Person per = p.get(i);System.out.println(per.getId()+","+per.getSex()+","+per.getAppearance()+","+per.getCharacter()+","+per.getRich()+","+per.getExpeappearance()+","+per.getExpecharacter()+","+per.getExperich());}}}

Match类


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;/**
* 类说明
* 描述:匹配环节
* @author erke
*/public class Match {static  int x = 1;/*** 男女配对*/static HashMap<Person,Person> boyTogirl = new HashMap<Person,Person>();static HashMap<Person,Person> girlToboy = new HashMap<Person,Person>();/*** * @param male  男生集合* @param female 女生集合* @param player 主角集合*/public static void match(ArrayList<Person> male,ArrayList<Person> female,Person player){/*** 女生被选择的情况*/HashMap<Person,ArrayList<Person>> maleFemale;   /*** 增加主角*/addPlayer(male,female,player);for(int i = 0;i < 100;i++){/*** 男生选女生*/maleFemale = maleInvite(male,female);/*** 统计被邀请最多的女生*/Person girl = getMaxFemale(maleFemale);/*** 女生反选*/Person boy = femaleAgree(girl,maleFemale.get(girl));/*** 剔除匹配成功的*/ male.remove(boy);female.remove(girl);boyTogirl.put(boy, girl);girlToboy.put(girl, boy);   //maleFemale.clear();}if(boyTogirl.containsKey(player)){System.out.println("第" + (x++) +"组player加入:"+"-1"+":"+boyTogirl.get(player).getId());   }else if(girlToboy.containsKey(player)){System.out.println("第" + (x++) +"组player加入:"+girlToboy.get(player).getId()+":"+"-1");       }else{System.out.println("第" + (x++) +"组player加入:"+"无结果");}}/*** 获得两个人的匹配度*/public  static int getScore(Person one,Person two){ return one.getExpeappearance()*two.getAppearance()+one.getExpecharacter()*two.getCharacter()+one.getExperich()*two.getRich();}/*** 获得两个人的优先级*/public static boolean prority(Person one,Person two){int num1 = one.getAppearance() + one.getCharacter() + one.getRich();int num2 = two.getAppearance() + two.getCharacter() + two.getRich();if(num1 > num2){return true;}if(num1 == num2){return one.getId() < two.getId();}return false;}/*** 加入主角*/public static void addPlayer(ArrayList<Person> male,ArrayList<Person> female,Person player){int id = player.getId();//获得主角的性别if(id == 0){//女生player.setId(-1);//将ID设为-1female.add(player);//加入女生的集合}else{player.setId(-1);male.add(player);}}/*** 男生选择满意的女生* @return 匹配度最高的女生*/public static  Person oneSelect(ArrayList<Person> female,Person boy){int femaleSie = female.size();Person Maxgirl = null;int maxScorer = 0;for(int i = 0;i < femaleSie;i++){Person girl  = female.get(i);int value = getScore(boy,girl);if(value > maxScorer){maxScorer = value;Maxgirl = girl;}else if(value == maxScorer){if(prority(girl,Maxgirl)){maxScorer = value;Maxgirl = girl;}}}return Maxgirl;}/*** 所有男生选择最满意的女生* @return 返回一个HashMap<Person,ArrayList<Person>>的集合* person 女生,* ArrayList<Person> 选择这个女生的男生*/ public static HashMap<Person,ArrayList<Person>> maleInvite(ArrayList<Person> male,ArrayList<Person> female){HashMap<Person,ArrayList<Person>> maleinvite = new HashMap<Person,ArrayList<Person>>();int maleSize = male.size();int femaleSie = female.size();for(int i = 0;i < maleSize;i++){Person boy = male.get(i);Person girl = oneSelect(female,boy);if(maleinvite.containsKey(girl)){ArrayList<Person> boys = maleinvite.get(girl);boys.add(boy);maleinvite.put(girl, boys);}else{ArrayList<Person> boys = new ArrayList<Person>();boys.add(boy);maleinvite.put(girl, boys);}}return maleinvite;}/*** 获得最受欢迎的女生* @param map  男生选择女生的集合* @return 最受欢迎的女生*/public static Person getMaxFemale(HashMap<Person,ArrayList<Person>> map){Person Maxgirl = null;int max = 0;Iterator<Map.Entry<Person, ArrayList<Person>>> iterator = map.entrySet().iterator();while(iterator.hasNext()){Map.Entry<Person,ArrayList<Person>> next = iterator.next();Person girl = next.getKey();int size = next.getValue().size();if(size > max){max = size;Maxgirl = girl;}else if(size == max){if(prority(girl,Maxgirl)){max = size;Maxgirl = girl;}}}return Maxgirl;}/*** 女生反选男生* @param girl  最受欢迎的女生* @param boys 选择这个女生的男生的集合* @return 匹配的男生*/public static Person femaleAgree(Person girl,ArrayList<Person> boys){int size = boys.size();Person Maxboy = null;int max = 0;for(int i = 0;i < size;i++){Person boy = boys.get(i);int value = getScore(girl,boy);if(value > max){max = value;Maxboy = boy;}else if(value == max){if(prority(boy,Maxboy)){max = value;Maxboy = boy;}}}return Maxboy;}public static void main(String[] args){FilechangeList filech = new FilechangeList();ArrayList<Person> male = filech.relay(filech.malePath);//初始化男生ArrayList<Person> female = filech.relay(filech.femalePath);//初始化女生ArrayList<Person> player = filech.relay(filech.playerPath);//初始化主角for(int i = 0;i < 100;i++){Person play =  player.get(i);match((ArrayList<Person>)male.clone(),(ArrayList<Person>)female.clone(),play);}}
}

中兴捧月——婚姻匹配问题相关推荐

  1. 谈谈中兴捧月大赛决赛以及总结

    前言 四月份,在师兄的推荐下,报名参加了中兴捧月大赛.一开始只是为了混一个面笔试的资格(因为提交有效成绩即可免笔试),然后为了找一个简单的赛道,注册了几个号看了两三个赛道的题目.发现自己每个都不熟悉, ...

  2. 2023第十三届“中兴捧月”全球精英挑战赛今日正式启动

    3月31日,第十三届"中兴捧月"全球精英挑战赛正式启动! 由中兴通讯主办的"中兴捧月"大赛,自2009年首次举办至今,已走过13个年头,是广大高校师生的重点关注 ...

  3. 2020中兴捧月算法大赛-阿尔法(MOT)赛道--赛后总结

    比赛结束了,很荣幸拿到了中兴捧月算法大赛 MOT赛道 全国总决赛第二名的亚军奖杯,这估计也是我找到工作前最后一个比赛了,收获满满,下面算是自己给自己写的一个简单的赛后总结,做的比较粗糙,细节也就不多赘 ...

  4. Deepsort_V2 2020中兴捧月阿尔法赛道多目标检测和跟踪初赛第一名

    2020中兴捧月阿尔法赛道多目标检测和跟踪初赛第一名方案 初赛:多目标跟踪:指标MOTA和MOTP, 后期的大量实验证明检测算法相对于跟踪更重要. 数据集分析: 1.人群密集稀疏场景: 2.场景(白天 ...

  5. “中兴捧月”报文监视器的实现

    前一段时间和几个好友组队参加了中兴举办的"中兴捧月杯"程序设计大赛,跌跌撞撞竟然进了复赛,不过最终还是没能入围区域决赛,还是感觉很遗憾.这里把当时复赛的题目以及我们被Out的代码拿 ...

  6. 中兴捧月大赛之方案探讨

    昨天参加完中兴捧月的决赛,感觉特别的糟糕.说实话,感觉中兴这次比赛搞得真的很奇葩!一是比赛搞得让我觉得公司对整个比赛的态度有点随意,有点不正式.二是比赛的赛题要求每天都在变,感觉不天天关注活动交流区, ...

  7. 2020年中兴捧月算法大赛---埃德加考特派赛题解析及代码

    写在前面 三月份疫情期间在家闲来无事, 各大公司举办了很多的算法比赛, 但是大多是人工智能相关, 而我这个菜鸡又不会这方面的, 这时发现了中兴捧月的埃德加考特派赛道, 也就是数据库相关本科课设, 恰好 ...

  8. 2020中兴捧月算法赛道傅里叶派赛题菜鸡回顾

    最近抱着试水的心理参加了2020中兴捧月算法大赛傅里叶派赛题.从4.19号由旁观者转变为参赛者,到5.8号提交完成最后的文档和代码,前后算起来也有20天了.虽然自己比较菜,但毕竟是第一次参加这种比较正 ...

  9. “中兴捧月”杯 校园赛事嘉年华 | 程序设计大赛(初赛) | 数字化婚姻尝试配对

    一.标题:     数字化婚姻配对尝试 二.题目: 建立一个模型,来模拟推导社会男女择偶过程. 为了模型简化,一个人的特性指标有三个,这里假设为财富.样貌.品格,每个指标均可取值1-100之间任意数字 ...

  10. 2019中兴捧月算法大赛历程

    1.初赛 题目是网络流量均衡.再带宽限制的图中求不同请求带宽的各条业务的最短路径使总成本最小. 解题思路: 对业务进行排序,优先级高的业务去走热点链路,优先级低的业务发现热点链路已经达到带宽上限就绕路 ...

最新文章

  1. linux校时写入硬件,手动校正 Linux 系统时间并把时间写入硬件,系统启动时自动校正时间并把时间写入硬件。...
  2. python导入txt为dataframe-python读取文本中数据并转化为DataFrame的实例
  3. 安装配置RocketMQ,并配置Console
  4. 编程方法学21:监听器和迭代器回顾
  5. docker --- 梳理 Dockerfile docker-compose.yml
  6. http 请求默认时间_JMeter接口测试之HTTP请求默认值
  7. 4025-数组的正负排序(C++,双指针法,附思路)
  8. ROC曲线与AUC以及LIFT
  9. 日本「AI 鱼脸识别」项目,每分钟识别 100 条,有望让渔民不再“摸鱼”
  10. JavaScript中实现深浅拷贝
  11. 计算机打字题目200字,拼音打字考试标准练习题200字
  12. 改文件777的php,服务器文件目录权限777修改方法
  13. 一个心理学教授关于“挣钱”的看法!
  14. 搭建FTP服务器后访问时出现“FTP文件夹错误 无法与服务器建立连接”的解决办法
  15. iOS开发人员必看的精品资料(100个)
  16. Mathematics for Computer Science 2
  17. c#中在一个窗体中触发另一个窗体的事件
  18. 2020,开启我人生的新篇章。
  19. Fluke Ti401 PRO,TI400+ 热像仪替代老型号FLUKETI400,TI300.TI200
  20. 【论文笔记_目标检测_2022】Proper Reuse of Image Classification Features Improves Object Detection

热门文章

  1. 3脚送话器内部电路图_电话机维修送话电路故障
  2. OPPO VOOC快充电路和协议
  3. Pspice轨迹命令
  4. 基于opencv的手指静脉识别(附源码)
  5. day10、1 - 扫描与爆破
  6. 联想l430主板图纸_L430开箱+拆机+换内存+换U+评测+拷机15小时,图多杀猫
  7. 计算机操作技能节,第十届知识技能节 网线制作竞赛方案
  8. 计算机辅助制造camppt,CADCAM课件计算机辅助制造 (2).ppt
  9. linux进入终端tty3,Linux中终端界面与图形界面之间的切换关系
  10. RBAC权限系统设计