披露:是的,这是我的作业。
我有以下问题:我有50名男性,50名女性和50只狗。他们每个人都有一份他最喜欢的每个人的名单。例如,6号女人有一个列表,列出了从最不喜欢到最喜欢的50个最喜欢的男人,以及从最不喜欢到最喜欢的50个最喜欢的狗的列表。男人有女人和狗的名单,狗有女人和男人的名单。
我需要找到最佳匹配,以便让女人,男人和狗尽可能快乐。我需要通过遗传算法来做到这一点。
假设我有匹配A和B(我将所有150个实体与50个家庭匹配,因此每个女人/男人/狗只出现一次)。
我如何跨越A和B? 我能想到的每一次交叉都会让我遇到以下问题:有人会出现两次,有些则根本不出现。
例如,如果我随机选择1到50之间的X
,并从A中取出第一个X族,从B中取出50-x第二族,则新匹配有可能大约为0每个人只出现一次。
我如何处理这样的问题?
任何提示都会有所帮助。
答案 0 :(得分:1)
有很多方法可以做到,没有一个完美。
A 和 B 可以轮流建议家人 C 。由于 C 从50名自由人,50名自由女性和50只自由犬开始,它可以成为第一个建议的家庭。如果建议的家庭需要一个已经在家中的成员,比如一只狗,新家庭可以从免费狗池中随机选择一只狗。
A 可以为 C 贡献一组10个家庭,然后 B 可以贡献其家族中的任何一个仍然可行 C (即与 A 中的10兼容的那些)。剩下的男人,女人和狗随意组成家庭。
C 可以继承 A 的男女配对和 B 的女狗配对,没有任何冲突。
答案 1 :(得分:0)
我找到了一个问题的解决方案,也许它将来会帮助一些人。 我必须承认,它感觉有点像“黑客”,但它完全合法。
我有两个匹配A(包含50个系列)和B个(包含50个系列),每个系列由一个元组大小为3 { WomanId,ManId,DogId }
交叉是这样的:
womanId
排序A和B,现在位于A的家庭电话号码i
和家庭电话号码i
中的WomanId
= i
正在发生的事情是,C继承了A的女人,男人夫妻,以及来自B的女人,狗夫妻。
为了完整,你并不总是按照女人的顺序排序,你随机选择女人,男人,狗,然后随机复制A或B中的其他人。
它实际上有效(我还添加了突变),我随机生成了1000个匹配并且运行算法,数字是我在当前一代中可以找到的最佳匹配的成本
费用只是其家庭成员每个女人/男人/狗排名的总和(等级越低越好)
答案 2 :(得分:0)
由于您已经找到了解决方案,如果您希望加深对此任务的深入了解,我想为您提供另一个探索和比较的想法。
你可以用3个大小为50的排列代表它,每个排列代表一个家庭的女人,男人和狗的分配。这是每个排列的第一个条目代表哪个女人,男人和狗形成一个家庭等等。在每个排列中,每个数字只出现一次,因此每个女人,男人或狗只被分配给一个家庭。然后你可以使用例如部分匹配的交叉(PMX),您可以使用相同的断点或独立地应用于所有排列。在变异中,您可以选择交换两个或更多男/女/狗,从而将它们分配给不同的家庭。