欢迎光临散文网 会员登陆 & 注册

如何找到合适的另一半:一个数学解决方案

2023-07-02 18:41 作者:卢朓  | 我要投稿

%开普勒相亲问题 (最优停止问题) 或者 秘书问题

% 北太天元 做数值实验 检验 1/e 准则 的有效性

% 数学模型: 假设有 n 个候选者,候选者可以按照好坏给打分.

% 随机按照一定的次序面试候选者, 不能同时脚踩两只船,必须对前一个候选者

% 做决定,如果选定了,后面的候选者就不能再面试了。

% 已经拒绝的候选者,不能再次再次考虑入围,面试到最后一名候选者自动被选中。

% 策略 (1/e 准则): 

% 面试 前面 n/e 个候选者,都不录取,后面再面试的候选者,如果分数大于或者等于

% 前面n/e 个候选者的分数,则选择这个候选者。

%


clear all;

clc;


   n = 8; % 假设有 n 个候选者.


      %目前北太天元还缺少获取系统时间的函数,那可以通用下面的方式来获得

      %随机性

      imax = int32(2^1024-1);

      seed = randi(imax, 1) ; %先产生一个随机的整数

      rng(seed); % 指定当前随机数发生器的种子为 seed

      imin = 1;

   score = randi([imin,imax],1,n); % 为每一个候选者随机设置一个分数


   disp("候选者的分数:\n");

      score

   disp("候选者的排名:\n");

      [~,rank] = sort(score);

      rank


   [pick_rank,pick_max, 实际最大rank, 实际最大分数] = 挑选(score)


      if (pick_rank == 实际最大rank)

            disp("成功找到了真正的最高分候选者");

      else

            disp("没有找到了真正的最高分候选者");

      end



% 使用 n/e 准册找到的“最好”的候选者

function [pick_rank, pick_max, 实际最大rank, 实际最大分数] = 挑选(score)

      n = length(score);

   %用来作为参照的样本大小

   sample_size = int32(n/e);

   fprintf("\n\n样本大小是%d", sample_size);


   %找到参照样本的最大值

   [score_max, rank_max] = max(score(1:sample_size));


   %在下面的候选者中找到不低于样本最大值的候选者

   for i = sample_size+1 : n

       if (score(i) >= score_max)

           rank_max = i;

           break;

         end

      end   


   if (i == n) % 说明上面的for循环到了i=n 都没有break

         fprintf("没有能找到比%d个候选者相等或者更好的候选者", sample_size);

         fprintf("选择就是第%d个候选者,分数是%d", n,score(n));

         pick_rank = n;

         pick_max = score(n);

   else

         fprintf("选择的是第%d个候选者, 分数是%d", rank_max,score(rank_max));

         pick_rank = rank_max;

         pick_max = score(rank_max);

      end

      [实际最大分数, 实际最大rank] = max(score);

end


如何找到合适的另一半:一个数学解决方案的评论 (共 条)

分享到微博请遵守国家法律