Java -- 数字化婚姻配对尝试

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值