如何找到合適的另一半:一個數(shù)學(xué)解決方案

%開普勒相親問題 (最優(yōu)停止問題) 或者 秘書問題
% 北太天元 做數(shù)值實驗 檢驗?1/e 準(zhǔn)則 的有效性
% 數(shù)學(xué)模型: 假設(shè)有 n 個候選者,候選者可以按照好壞給打分.
%?隨機按照一定的次序面試候選者, 不能同時腳踩兩只船,必須對前一個候選者
% 做決定,如果選定了,后面的候選者就不能再面試了。
% 已經(jīng)拒絕的候選者,不能再次再次考慮入圍,面試到最后一名候選者自動被選中。
% 策略 (1/e 準(zhǔn)則):?
% 面試 前面 n/e 個候選者,都不錄取,后面再面試的候選者,如果分數(shù)大于或者等于
% 前面n/e 個候選者的分數(shù),則選擇這個候選者。
%
clear all;
clc;
???n = 8; % 假設(shè)有 n 個候選者.
??????%目前北太天元還缺少獲取系統(tǒng)時間的函數(shù),那可以通用下面的方式來獲得
??????%隨機性
??????imax = int32(2^1024-1);
??????seed = randi(imax, 1) ; %先產(chǎn)生一個隨機的整數(shù)
??????rng(seed); % 指定當(dāng)前隨機數(shù)發(fā)生器的種子為 seed
??????imin = 1;
???score =?randi([imin,imax],1,n); % 為每一個候選者隨機設(shè)置一個分數(shù)
???disp("候選者的分數(shù):\n");
??????score
???disp("候選者的排名:\n");
??????[~,rank] = sort(score);
??????rank
???[pick_rank,pick_max, 實際最大rank, 實際最大分數(shù)] = 挑選(score)
??????if (pick_rank == 實際最大rank)
????????????disp("成功找到了真正的最高分候選者");
??????else
????????????disp("沒有找到了真正的最高分候選者");
??????end
% 使用 n/e 準(zhǔn)冊找到的“最好”的候選者
function [pick_rank, pick_max, 實際最大rank, 實際最大分數(shù)] = 挑選(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循環(huán)到了i=n 都沒有break
?????????fprintf("沒有能找到比%d個候選者相等或者更好的候選者", sample_size);
?????????fprintf("選擇就是第%d個候選者,分數(shù)是%d", n,score(n));
?????????pick_rank = n;
?????????pick_max = score(n);
???else
?????????fprintf("選擇的是第%d個候選者, 分數(shù)是%d", rank_max,score(rank_max));
?????????pick_rank = rank_max;
?????????pick_max = score(rank_max);
??????end
??????[實際最大分數(shù), 實際最大rank] = max(score);
end