题目:一、标题:
数字化婚姻配对尝试
二、题目:
建立一个模型,来模拟推导社会男女择偶过程。
为了模型简化,一个人的特性指标有三个,这里假设为财富、样貌、品格,每个指标均可取值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、循环该配对法则,直到最后一对男女配对成功。
三、初赛阶段要求:
1、编程语言为java,C++或C语言任意一种;运行环境windows。
2、能让用户输入自己的参数以及对各项数值的偏好,然后随机生成100位男性100位女性(包括用户在内。如果用为男性则为99男100女),数值全部随机但需满足题设限制。按照上述规则给出一个匹配结果呈现给用户。
3、若采用c/c++,要输出可执行程序;若采用java,给出jar和bat。
4、在匹配时,如果发现有多个满意度相同的对象,要求自身三个属性(财富,外貌,品格)总和大的优先,如果再相同则id小的优先。如果有2位女士的选票相同,优先级规则同上。请把主角的id置为最小值,以便在前2个条件相同情况下,主角可以优先选择。
5、程序读取指定的配置文件,获取样本,然后根据指定的输入,输出结果。同时会给出一组源数据和标准答案给学生自测。最后再让学生根据不同的,指定的输入,给出考试答案。
请点击下载配置文件附件。附件中,male.txt,female.txt,players.txt 分别是男士样本、女士样本和主角样本各 100位。 男女样本中,每行都代表一位男士或女士的基本属性,从左到右依次是ID, 样貌,品格,财富 , 期望样貌,期望品格,期望财富,没有加入性别,需要在解析时手动添加,每个txt文本的性别都是一样的,请注意。另外,主角样本中没有ID属性,换成了性别属性,其中 0表示女性,1表示男性,其余属性依次为样貌,品格,财富,期望样貌 ,期望品格,期望财富。建议把主角的id都设置为 -1,以便满足优先选择的条件。
给出标准答案2组,用于考生自测:
1号主角(文本第一行),选择的对象属性为(6,18,82,87,3,10)
2号主角(文本第二行),选择的对象属性为(27,74,22,22,58,20)
同时要求考生输出9号主角(0,72,55,53,8,87,5),19号主角(0,11,4,63,22,60,18),47号主角(1,19,8,21,1,53,46),83号主角(1,23,11,17,58,31,11),99号主角(1,26,66,1,78,11,11)以及100号主角(0,68,28,19,43,11,46)的选择结果。


package io20180720;import java.util.ArrayList;/*** 主函数* @author Cue*/
public class Main {/*** 进行计数*///x 计数private static int x = 1;//couple为多少组数据private static int couple = 100;public static void main(String[] args) throws CloneNotSupportedException {//男士的文件路径String malePath = "C:\\Users\\小玉沉香\\Desktop\\作业\\male.txt";//进行转换,将文件字符串转换成对象ArrayList<Person> males = Until.FIleTrasPersonClassList(malePath,1);//女士的文件路径String famalPath="C:\\Users\\小玉沉香\\Desktop\\作业\\female.txt";//进行转换ArrayList<Person> females = Until.FIleTrasPersonClassList(famalPath,0);//主角文件路径String playerPath="C:\\Users\\小玉沉香\\Desktop\\作业\\players.txt";//进行转换ArrayList<Person> players = Until.FIleTrasPlayerClassList(playerPath);//逐个加入主角进行匹配int size = players.size();long l = System.currentTimeMillis();for (int i = 0; i < size; i++) {Person player = players.get(i);//匹配Mate((ArrayList<Person> )males.clone(), (ArrayList<Person> )females.clone(), player);}System.out.println(System.currentTimeMillis()-l);System.out.println(sum);}public  static void CLear(ArrayList<Person> female){int femaleSize = female.size();//遍历女士文件for (int i = 0; i < femaleSize; i++) {female.get(i).Clear();}}int MaxFemaleScore;//比叫 a 和 bprivate static  boolean Compare(Person a,Person b){return a.wealth > b.wealth && a.character > b.character && a.apperance > b.apperance ? true:false;}private static int sum = 0;/*** 匹配* @param males     男性数组* @param females   女性数组* @param player    主角*/public static void Mate(ArrayList<Person> males,ArrayList<Person> females,Person player) {// coup 是女士的大小int coup = males.size();int sex = player.sex;//根据性别不同放入到不同的集合中,1为男,0为女if (sex == 0) {females.add(player);} else {males.add(player);}//进行couple次配对int p;int maleSize ;int femaleSize ;for (p = 0; p < coup; p++) {long l = System.currentTimeMillis();CLear(females);sum+=System.currentTimeMillis()-l;maleSize = males.size();femaleSize = females.size();//统计每个女生的追求者//让每个男的都选择自己喜欢的女生,并且统计每个女生被喜欢的数for (int i = 0; i < maleSize; i++) {Person male = males.get(i);int max = Integer.MIN_VALUE;Person Maxfamale = null;for (int i1 = 0; i1 < femaleSize; i1++) {Person female = females.get(i1);int score = GetScore(male, female);if ((score > max)||(score==max && Select(female,Maxfamale))) {max = score;Maxfamale = female;}}Maxfamale.List.add(male);}int maxFemaleNum = -1;ArrayList<Person> maxFemaleList = null;Person maxFemale = null;//找到最受欢迎的女生for (int i = 0; i < femaleSize; i++) {Person person = females.get(i);ArrayList<Person> people = person.List;if (people != null) {int peopleSize = people.size();if ((peopleSize > maxFemaleNum)||(people.size() == maxFemaleNum&&Select(person, maxFemale))) {maxFemaleNum = peopleSize;maxFemale = person;maxFemaleList = people;}}}//最喜欢的女生挑选男生int maxFemaleListSize = maxFemaleNum;int maxScore = 0;Person maxMale = null;for (int i = 0; i < maxFemaleListSize; i++) {Person person = maxFemaleList.get(i);//获取满意度int score = GetScore(maxFemale, person);if ((score > maxScore)||(score == maxScore&&Select(person, maxMale))) {maxScore = score;maxMale = person;}}//根据主角的性别进行判断输出if (sex == 0&&maxFemale.id==-1) {System.out.println("第" + (x++) + "组player加入" + maxMale.id + ": " + player.id);break;} else if(maxMale.id==-1){System.out.println("第" + (x++) + "组player加入" + player.id + ": " + maxFemale.id);break;}males.remove(maxMale);females.remove(maxFemale);}if(p==coup){System.out.println("第" + (x++) + "组player加入  无结果");}}/*** One对Two的分数* @param  one* @param  two* @return 分数*/public static int  GetScore(Person one ,Person two){return one.expectApperance*two.apperance+one.expectCharacter*two.character+one.expectWealth*two.wealth;}/*** one比two优先* @param one* @param two* @return 如果one比two大返回ture*/private static boolean Select(Person one, Person two){int sumOne = one.apperance+one.character+one.wealth;int sumTwo = two.apperance+two.character+two.wealth;if(sumOne>sumTwo) {return true;}else if(sumOne<sumTwo) {return false;}else {return one.id <= two.id;}}}

package io20180720;import java.util.ArrayList;/*** Person 类* @author Cue*/
public class Person implements Cloneable,Comparable<Person>{public int id;public int apperance;//样貌public int character;//品格public int wealth;//财富public int expectApperance;//期望样貌public int expectCharacter;//期望品格public int expectWealth;//期望财富public int sex;//性别public ArrayList<Person> List;//Person类型的集合public Person(int id, int apperance, int character, int wealth, int expectApperance, int expectCharacter, int expectWealth,int sex) {//属性初始化this.id = id;this.apperance = apperance;this.character = character;this.wealth = wealth;this.expectApperance = expectApperance;this.expectCharacter = expectCharacter;this.expectWealth = expectWealth;this.sex = sex;this.List = new ArrayList<Person>();}// 剔除public void Clear(){this.List.clear();}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getApperance() {return apperance;}public void setApperance(int apperance) {this.apperance = apperance;}public int getCharacter() {return character;}public void setCharacter(int character) {this.character = character;}public int getWealth() {return wealth;}public void setWealth(int wealth) {this.wealth = wealth;}public int getExpectApperance() {return expectApperance;}public void setExpectApperance(int expectApperance) {this.expectApperance = expectApperance;}public int getExpectCharacter() {return expectCharacter;}public void setExpectCharacter(int expectCharacter) {this.expectCharacter = expectCharacter;}public int getExpectWealth() {return expectWealth;}public void setExpectWealth(int expectWealth) {this.expectWealth = expectWealth;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}@Overridepublic String toString() {return "Person{" +"id=" + id +", apperance=" + apperance +", character=" + character +", wealth=" + wealth +", expectApperance=" + expectApperance +", expectCharacter=" + expectCharacter +", expectWealth=" + expectWealth +", sex=" + sex +'}';}public int compareTo(Person o) {return (o.wealth+o.getCharacter()+o.getApperance())-(this.getWealth()+this.getCharacter()+this.getApperance());}@Overrideprotected Object clone() throws CloneNotSupportedException {Person a = new Person(this.id,this.apperance,this.character,this.wealth,this.expectApperance,this.expectCharacter,this.expectWealth,this.sex);return a;}
}

package io20180720;import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;/*** * @author Cue*/
public class Until {/*** 将Person文件转换为一个集合* @param filePath  文件路径* @param sex          性别* @return          ArrayList集合*/public static ArrayList<Person> FIleTrasPersonClassList(String filePath,int sex){   Scanner in = null;ArrayList<Person> people = new ArrayList<Person>();try {in = new Scanner(new File(filePath));} catch (FileNotFoundException e) {e.printStackTrace();}while (in.hasNextLine()) {String i = in.nextLine();String[] split = i.split(",");people.add(new Person(Integer.parseInt(split[0]),Integer.parseInt(split[1]),Integer.parseInt(split[2]),Integer.parseInt(split[3]),Integer.parseInt(split[4]),Integer.parseInt(split[5]),Integer.parseInt(split[6]),sex));}return people;}/*** 将主角文件转化为 ArrayLis* @param filePath 文件路径* @return ArrayList集合*/public static ArrayList<Person> FIleTrasPlayerClassList(String filePath){Scanner in = null;ArrayList<Person> people = new ArrayList<Person>();try {in = new Scanner(new File(filePath));} catch (FileNotFoundException e) {e.printStackTrace();}while (in.hasNextLine()) {String i = in.nextLine();String[] split = i.split(",");people.add(new Person(-1,Integer.parseInt(split[1]),Integer.parseInt(split[2]),Integer.parseInt(split[3]),Integer.parseInt(split[4]),Integer.parseInt(split[5]),Integer.parseInt(split[6]),Integer.parseInt(split[0])));}return people;}
}

结果:
第1组player加入-1: 28
第2组player加入33: -1
第3组player加入4: -1
第4组player加入11: -1
第5组player加入46: -1
第6组player加入65: -1
第7组player加入-1: 39
第8组player加入-1: 41
第9组player加入49: -1
第10组player加入-1: 80
第11组player加入-1: 36
第12组player加入-1: 23
第13组player加入-1: 29
第14组player加入-1: 86
第15组player加入36: -1
第16组player加入-1: 98
第17组player加入-1: 11
第18组player加入-1: 76
第19组player加入20: -1
第20组player加入-1: 47
第21组player加入-1: 77
第22组player加入41: -1
第23组player加入-1: 20
第24组player加入57: -1
第25组player加入-1: 45
第26组player加入-1: 39
第27组player加入-1: 36
第28组player加入-1: 9
第29组player加入-1: 22
第30组player加入79: -1
第31组player加入-1: 45
第32组player加入-1: 86
第33组player加入22: -1
第34组player加入-1: 34
第35组player加入45: -1
第36组player加入97: -1
第37组player加入67: -1
第38组player加入-1: 13
第39组player加入-1: 39
第40组player加入-1: 60
第41组player加入-1: 15
第42组player加入56: -1
第43组player加入-1: 97
第44组player加入26: -1
第45组player加入71: -1
第46组player加入-1: 27
第47组player加入 无结果
第48组player加入85: -1
第49组player加入-1: 97
第50组player加入-1: 46
第51组player加入-1: 49
第52组player加入4: -1
第53组player加入-1: 35
第54组player加入27: -1
第55组player加入65: -1
第56组player加入77: -1
第57组player加入-1: 73
第58组player加入-1: 94
第59组player加入-1: 83
第60组player加入52: -1
第61组player加入48: -1
第62组player加入-1: 53
第63组player加入2: -1
第64组player加入-1: 12
第65组player加入-1: 78
第66组player加入-1: 84
第67组player加入-1: 69
第68组player加入97: -1
第69组player加入26: -1
第70组player加入-1: 97
第71组player加入71: -1
第72组player加入-1: 78
第73组player加入1: -1
第74组player加入-1: 28
第75组player加入55: -1
第76组player加入-1: 28
第77组player加入-1: 10
第78组player加入-1: 81
第79组player加入-1: 87
第80组player加入74: -1
第81组player加入-1: 63
第82组player加入33: -1
第83组player加入 无结果
第84组player加入79: -1
第85组player加入66: -1
第86组player加入9: -1
第87组player加入66: -1
第88组player加入-1: 58
第89组player加入37: -1
第90组player加入14: -1
第91组player加入-1: 21
第92组player加入54: -1
第93组player加入-1: 78
第94组player加入77: -1
第95组player加入78: -1
第96组player加入-1: 94
第97组player加入53: -1
第98组player加入-1: 56
第99组player加入-1: 45
第100组player加入14: -1
659
10

Java -- 数字化婚姻配对尝试相关推荐

  1. 数字化婚姻配对尝试问题(C++实现)

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

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

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

  3. android tv outofmem,java.lang.OutOfMemoryError:尝试抛出OutOfMemoryErr...

    我正在尝试将用户提供的lat long值与数据库中的lat long值进行比较.如果它们彼此的半径在15 km之内,则应更改textview. 但是我面临以下错误, 我的数据库包含值来源lat = 1 ...

  4. 一些可以显著提高大型 Java 项目启动速度的尝试

    我们线上的业务 jar 包基本上普遍比较庞大,动不动一个 jar 包上百 M,启动时间在分钟级,拖慢了我们在故障时快速扩容的响应.于是做了一些分析,看看 Java 程序启动慢到底慢在哪里,如何去优化, ...

  5. java 编写小工具 尝试 学习(四)

    1.在新建 的窗口上 ,添加了一个按钮后 ,给 按钮添加一个事件 ,意思就是  点击按钮后 发生什么事情!不废话 贴图 贴 代码! package jFrameDemo;import java.awt ...

  6. java 编写小工具 尝试 学习(二)

    1. 新建一个窗口  ,代码 如下 ,截图 如下 package jFrameDemo;import javax.swing.JFrame; import javax.swing.WindowCons ...

  7. java运动员最佳配对_运动员最佳配对问题 - osc_y1pyjby5的个人空间 - OSCHINA - 中文开源技术交流社区...

    这道题可以看为排列数的一个典型模块 一.算法实现题: 1.问题描述: 羽毛球队有男女运动员各n人,给定2个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q ...

  8. java 编写小工具 尝试 学习(六)

    1.java 布局管理器-布局管理器之null布局(空布局) 的 学习,参考大神教程:http://www.cnblogs.com/liaoliao/p/5009445.html import jav ...

  9. java qq 界面_【Java】仿真qq尝试:聊天界面 响应用户输入

    需求分析: 逐步完善一个"qq仿真"程序. 参考: 1.文本框与文本区:http://www.weixueyuan.net/view/6062.html 2.java布局:http ...

最新文章

  1. 看linux书籍做的一些重要笔记(2011.07.03更新)
  2. pyBoard 基于MicroPython开发STM32FXX单片机
  3. 星云精准测试之用例魔方
  4. 【Docker】容器与系统时间同步
  5. 密码学哈希函数_哈希函数在密码学中的应用
  6. SQL之COLLATE 子句 排序规则
  7. c语言长整数除法,大整数除法
  8. Flask框架 - 初识
  9. 2021-2025年中国电动陶瓷球阀行业市场供需与战略研究报告
  10. 模板类的声明和定义要放在同一个文件
  11. 【小小小白进行手机进行刷机测试 Ubuntu系统下安装adb工具、fastboot工具】
  12. 计算机绘图尺寸标注,计算机绘图AutoCAD尺寸标注演示教学.ppt
  13. 让局域网网速极速狂飙(组图)
  14. Web 攻防之业务安全:账号安全案例总结.
  15. Java技术——Interface与abstract类的区别
  16. putchar、getchar 大小写转化
  17. 全网最详细的微信小程序开发教程
  18. 2022年中国研究生数学建模竞赛E题思路及参考代码-草原放牧策略研究
  19. 三、软考·系统架构师——计算机网络基础
  20. 程序的世界里,短暂的放空

热门文章

  1. 基于asp.net732汽车4s店销售网站
  2. 图像质量评价综述:美学+客观(原创)
  3. iphone访问限制密码忘记,怎么办?
  4. Hadamard积介绍
  5. 用纯css3绘制的能自适应屏幕宽度的哆啦a梦动画
  6. 【算法】罗马数字转整数
  7. 科大讯飞SDK学习与总结
  8. Spring- 07 AOP 学习 了解底层代理
  9. JS模块化(CommomJS规范和ES6规范)
  10. 太阳电池板特性实验_太阳能电池板室外特性实验提纲