题目:一、标题:
数字化婚姻配对尝试
二、题目:
建立一个模型,来模拟推导社会男女择偶过程。
为了模型简化,一个人的特性指标有三个,这里假设为财富、样貌、品格,每个指标均可取值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 和 b
private 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;
}
@Override
public 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());
}
@Override
protected 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