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

%开普勒相亲问题 (最优停止问题) 或者 秘书问题
% 北太天元 做数值实验 检验 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