美文网首页编什么程PHP开发
利用最优停止理论,寻找你的真爱

利用最优停止理论,寻找你的真爱

作者: 沙蒿同学 | 来源:发表于2019-01-06 16:51 被阅读59次

    前言

    某天我在西瓜视频看了李永乐老师的《如何才能找到真命天子?》,感触颇多,心想能不能用编程把这个数学公式给敲出来,好啦,说干就干。建议各位同学朋友有空多看看李永乐老师的教学视频,纯干货,老师讲得好还很有趣。

    开始

    故事要从苏格拉底他老人家开始说起:
    一天,苏格拉底带领几个弟子来到一块长满麦穗的田地边,对弟子们说:“你们去麦地里摘一个最大的麦穗,只许进,不许退。”
    第一个弟子走几步看见一支又大又漂亮的麦穗,高兴地摘下了。但是他继续前进时,发现前面有许多比他摘的那支大,只得遗憾地走完了全程。第二个弟子吸取了教训.每当他要摘时,总是提醒自己,后面还有更好的。当他快到终点时才发现,机会全错过了。第三个弟子吸取了前两位教训.当他走到三分之一时,即分出大、中、小三类,再走三分之一时验证是否正确,等到最后三分之一时,他选择了属于大类中的一支美丽的麦穗。虽说,这不一定是最大最美的那一支,但他满意地走完了全程。"
    苏格拉底观点:“麦地里肯定有最大的麦穗,但你未必能碰到它。即使碰到了,也未必能作出准确的判断。只有你在经历过一半以后选择你认为最好的,以后也许会遇到比你选择的更好的,但你会一生无悔”

    我的看法

    是啊,类似捡麦穗,人的一生都希望可以寻找到一个真正爱你的人,尽管你知道他不会是完美的,但你一定希望他在你心里就是完美的那一个。也许,你的一生会遇到很多爱你的人,但最终你们别没有走到一起;也许你的一生一心一意只爱一个人,而那个人却一直没出现;有句话说得好,人的一生会遇到三种女人,第一种是你爱的人却不爱你的人,第二种是爱你的人你却不爱的人,第三种是你不爱她不爱却可以相伴一生的人,那么问题来了,你现在喜欢的是那种人呢?为什么前任要跟我分手呢?什么时候才是我选择真爱的时候呢?别急,看下面哈。

    代码实现

    <?php
    /**
    * Created by PhpStorm.
    * User: benny
    * Date: 18-12-7
    * Time: 下午2:58
    */
    $first_time = microtime(true);
    //var_dump(find_love(8,1))."<br/>";
    
    $result = [];
    for ($i=1;$i <= 8;$i++){
      $percent = array();
      //生成排列组合可能性数组
      //例如:恋爱3次,有6种可能, "[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]"
      $all_array = arrangement(range(1,$i),$i);
     // var_dump(json_encode($all_array));
      echo "<br/>";
      for ($j=0;$j<$i;$j++){
          $percent[] = find_love($i,$j,$all_array);
      }
      $smaple = array_search(max($percent),$percent);
      echo '当你恋爱次数为:'.$i.' 时,你应该选择的样本数为:'.$smaple.' , 你得到真爱的概率是:'.max($percent)."<br/>";
    
      switch ($i) {
          case 1:
              echo "当你选择一生只挚爱一个人的时候,那毋容置疑你选择的她,那是你一生中最‘完美的人’,可能在他人眼里他有很多的瑕疵,但在你心里永远的值得依靠的另一半。<br/>";
              break;
          case 2:
              echo "你的一生会被两个人所疼爱,不管你选择的前者还后者,你得到真爱的概率只有50%,就如鱼和熊掌不可兼得,得与失之间选择,选择前者你可能会对未知的那个他报有期望,选择后者的你可能会念念不忘与前任的朝朝夕夕。<br/>";
              break;
          case 3:
              echo "如果你选择相爱3次,你应该把第一个遇到的那个人当做样本,不管他好不好,你最后都不要跟他在一起,这可能就是为什么我有些人会失恋的原因吧,因为你落入到他人的样本区间啦。<br/>";
              break;
          case 4:
              echo "人的一生是短暂的,你能相爱四次,证明你也是有一定魅力的,也相当自信,选择相爱四次的你是最机智的,总和考虑,这个选择可以让你最大概率的得到真爱,选择第一个作为自己的样本得到真爱的概率是46%。<br/>";
              break;    
          default:
             echo "不解释,你都是老司机啦,希望你找到真爱。<br/>";
              break;
      }
      // $result[]= $item =[
      //     'love_nums' =>  $i,
      //     'sample_nums' => $smaple,
      //     'percent'   =>  max($percent),
      // ];
    
    }
    //var_dump(json_encode($result));
    $last_time = microtime(true);
    
    echo '运行时间:'.round($last_time-$first_time,8).'秒';
    
    /*
      $love_nums 恋爱次数
      $sample_nums 样本个数
      $all_array 所有恋爱可能性排列情况
    */
    function find_love($love_nums = 0,$sample_nums = 0,$all_array = array()){
      $sum = count($all_array);
      
      $count = 0;
      
      foreach ($all_array as $item){
    
          if ($sample_nums == 0 && $item[0] == $love_nums) {
             $count++;
          }
          else{
              $sample_array = array_slice($item,0,$sample_nums);
              $love_array = array_slice($item,$sample_nums);
              foreach ($love_array as $key => $value) {
                  if ($value > max($sample_array) && $value == $love_nums) {
                      $count++;
                      break;
                  }elseif($value > max($sample_array) && $value != $love_nums){
                      break;
                  }
              }
             
          }
          
          
    
      }
      return sprintf('%.2f',$count/$sum);
    }
    
    // 阶乘
    function factorial($n) {
      return array_product(range(1, $n));
    }
    
    // 排列数,公式=n!/(n-m)!
    function arrange_num($n, $m) {
      return factorial($n)/factorial($n-$m);
    }
    
    // 组合数,公式=(n!/(n-m)!)/m!
    function combination_num($n, $m) {
      return arrange($n, $m)/factorial($m);
    }
    // 排列
    function arrangement($st_array, $m) {
      $re_array = array();
    
      $n = count($st_array);
      if ($m <= 0 || $m > $n) {
          return $re_array;
      }
    
      for ($i=0; $i<$n; $i++) {
          $item_array = $st_array;
          $t = array_splice($item_array, $i, 1);
          if ($m == 1) {
              $re_array[] = $t;
          } else {
              $c = arrangement($item_array, $m-1);
              foreach ($c as $v) {
                  $re_array[] = array_merge($t, $v);
              }
          }
      }
    
      return $re_array;
    }
    
    // 组合
    function combination($st_array, $m) {
      $re_array = array();
    
      $n = count($st_array);
      if ($m <= 0 || $m > $n) {
          return $re_array;
      }
    
      for ($i=0; $i<$n; $i++) {
          $t = array($st_array[$i]);
          if ($m == 1) {
              $re_array[] = $t;
          } else {
              $item_array = array_slice($st_array, $i+1);
              $c = combination($item_array, $m-1);
              foreach ($c as $v) {
                  $re_array[] = array_merge($t, $v);
              }
          }
      }
    
      return $re_array;
    }
    

    效果图

    image.png

    总结

    • 当你选择一生只挚爱一个人的时候,那毋容置疑你选择的她,那是你一生中最‘完美的人’,可能在他人眼里他有很多的瑕疵,但在你心里永远的值得依靠的另一半。

    • 你的一生会被两个人所疼爱,不管你选择的前者还后者,你得到真爱的概率只有50%,就如鱼和熊掌不可兼得,得与失之间选择,选择前者你可能会对未知的那个他报有期望,选择后者的你可能会念念不忘与前任的朝朝夕夕。

    • 如果你选择相爱3次,你应该把第一个遇到的那个人当做样本,不管他好不好,你最后都不要跟他在一起,这可能就是为什么我有些人会失恋的原因吧,因为你落入到他人的样本区间啦。

    • 人的一生是短暂的,你能相爱四次,证明你也是有一定魅力的,也相当自信,选择相爱四次的你是最机智的,总和考虑,这个选择可以让你最大概率的得到真爱,选择第一个作为自己的样本得到真爱的概率是46%。

    • 这里主要用到的数学知识是排列组合,以上是封装好的排列组合函数外加根据业务需求写出的"寻找爱情"的业务逻辑,主要代码都已加上注释,阅读代码即可读懂,

    话题

    看完故事、代码和结论,你应该知道下一个她是不是你的真爱了吧?可下方留言哦。

    原文作者:------ 沙蒿 ------
    关注我吧《程序员的碎碎念》作者,不会ui的前端不是好后端
    不忘初心,牢记使命,对于文章内容有疑问的或者想深入交流学习的朋友可以加我QQ:2283743369

    相关文章

      网友评论

        本文标题:利用最优停止理论,寻找你的真爱

        本文链接:https://www.haomeiwen.com/subject/znpsrqtx.html