目录

  • 用蒙特卡罗算法模拟在线雇佣问题
    • 问题描述
    • 现实中的问题
    • 雇佣函数:
    • 全部代码:

文章只供参考,如果有什么不对的地方会及时更正,学习也是一个分享的过程,希望和大家一起进步。

用蒙特卡罗算法模拟在线雇佣问题

问题描述

首先看看雇佣问题的基本内容。
假设你要雇佣一个新的办公室助理,雇佣代理每天向你推荐一个应聘者(连续推荐n个),你面试这个人,如果这个应聘者比目前的办公室助理更优秀,你就会辞掉当前的办公室助理,然后聘用这个新的。面试一个人需付给雇佣代理一笔费用,聘用办公助理也需要费用。
假设推荐费用为Ci,雇佣的费用为Ch,假设整个过程中雇佣了m次,于是总的费用是 nCi+mCh。由于n是固定值,总费用的变化取决于m值。

如果要费用最少,这时可以很容易的想到,只雇佣第一个人,即第一个人是最好的就只用花费n*Ci+Ch的费用。但是事前我们并不知道最好的那个人在哪。所以想要雇佣最好的办公室经理,一般的方法就是遍历所有的推荐者。

HIRE-ASSISTANT(n)best ← 0     ® candidate 0 is a least-qualified dummy candidatefor i ← 1 to ndo interview candidate iif candidate i is better than candidate bestthen best ← ihire candidate i

现实中的问题

但是现在,假设我们不希望面试所有的应聘者以找到最好的一个。我们也不希望因为有更好的申请者出现,不停雇佣新人解雇旧人。我们愿意雇用接近最好的应聘者,只雇用一次。我们必须遵守公司的一个要求:在每次面试后,或者必须立即提供职位给应聘者,或者拒绝。在最小化面试次数和最大化雇用应聘者的质量两方面如何取得平衡?就会出现一个概率问题:最好的那个人出现时的概率有多大和小标是多少?

这时就引入了我们需要解决的问题:最好的那个人出现的概率最大时 k 的取值和最大概率是多少呢?

首先,在面试一个应聘者之后,我们给每人一个分数。在面试过j个人之后,我们能知道这j个人中的最高分,但是不知道后面的n-j个会不会有最高的。所以我们决定采取下面的方法:
选择一个正整数k<n。面试然后拒绝前k个应聘者,再雇佣其后比前面的应聘者有更高分数的第一个应聘者,如果最高得分的应聘者在前k个应聘者,我们将雇佣第n个应聘者。
下面是伪代码:

c++代码如下:
产生随机数:

void random1(int list[100]){//初始化随机数的发生,使用时间函数并使其非负int a = 0, b = 100;int i = 100, r = 0;while (i) {r = rand() % (b - a + 1) + a;   /*控制随机数的范围(简单记为:取“区间长度+1”的模再+前端点值)*/list[i-1] = r;    //得到0到100的100个随机数 i--;}// 把list数组的r1,r2个元素改成100和99,保证list数组中一定有最好的和次好的那个人 int r1 = rand() % (b - a + 1) + a;   int r2 = rand() % (b - a + 1) + a;   list[r1] = 100; //把list数组的第r个元素改成100 list[r2] = 99; //把list数组的第r个元素改成99
}

雇佣函数:

void hire_ass(int iter_time){int a[100];int list[100]={0};float key1=0;int x=0;for(int t=0;t<100;t++){float k=0;for(int i=0;i<iter_time;i++){random1(list);    //调用random函数产生100个随机数的数组 int best=0;int best1=0;//找到0到t之间的最大值 for(int j=0;j<t;j++){if(list[j]>best){best = list[j];}}//找到t到100之间的第一个大于best的值 for(int j=t;j<100;j++){if(list[j]>best)best1 = list[j];}if(best1==100)  //只求一个时 //if(best1==100 || best1==99)   // 求两个最好的 k = k+1;}float key = k/iter_time;a[t] = key;if(key>key1){key1=key;x = t+1;}//cout<<key<<" ";}cout<<endl;cout<<"最好的概率和下标是:"<<key1<<" "<<x<<endl;
}

结果显示:

全部代码:


#include <iostream>
#include<iostream>
#include<ctime>     //包含时间的头文件
#include<cstdlib>   //包含随机数函数的头文件
#include <cmath>/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;void random1(int *list);
void hire_ass(int iter_time);int main(int argc, char** argv) {srand((unsigned)time(NULL));   //一定要写在循环的外面,或者循环调用的外面 int a,iter_time;cout<<"输入循环次数:"<<endl;cin>>iter_time;
//  hire(iter_time);hire_ass(iter_time);return 0;}void random1(int list[100]){//初始化随机数的发生,使用时间函数并使其非负int a = 0, b = 100;int i = 100, r = 0;while (i) {r = rand() % (b - a + 1) + a;   /*控制随机数的范围(简单记为:取“区间长度+1”的模再+前端点值)*/list[i-1] = r;    //得到0到100的100个随机数 i--;}// 把list数组的r1,r2个元素改成100和99,保证list数组中一定有最好的和次好的那个人 int r1 = rand() % (b - a + 1) + a;   int r2 = rand() % (b - a + 1) + a;   list[r1] = 100; //把list数组的第r个元素改成100 list[r2] = 99; //把list数组的第r个元素改成99}void hire_ass(int iter_time){int a[100];int list[100]={0};float key1=0;int x=0;for(int t=0;t<100;t++){float k=0;for(int i=0;i<iter_time;i++){random1(list);    //调用random函数产生100个随机数的数组 int best=0;int best1=0;//找到0到t之间的最大值 for(int j=0;j<t;j++){if(list[j]>best){best = list[j];}}//找到t到100之间的第一个大于best的值 for(int j=t;j<100;j++){if(list[j]>best)best1 = list[j];}if(best1==100)  //只求一个时 //if(best1==100 || best1==99)   // 求两个最好的 k = k+1;}float key = k/iter_time;a[t] = key;if(key>key1){key1=key;x = t+1;}//cout<<key<<" ";}cout<<endl;cout<<"最好的概率和下标是:"<<key1<<" "<<x<<endl;
}

求在线雇佣问题中最好雇佣者出现的概率及概率最大时最好雇佣者的位置相关推荐

  1. 人工智能在线特征系统中的生产调度

    在上篇博客<人工智能在线特征系统中的数据存取技术>中,我们围绕着在线特征系统存储与读取这两方面话题,针对具体场景介绍了一些通用技术,此外特征系统还有另一个重要话题:特征生产调度.本文将以美 ...

  2. c语言100以内最大能被17整除,求100之内自然数中最大的能被17整除的数

    1.1求100之内自然数中最大的能被17整除的数#includevoid main() int i ;for (i=100;i0;i-)if(i%17-0)break;printf("%dn ...

  3. 分别用BFS和DFS求给定的矩阵中“块”的个数

    目录 背景介绍 BFS实现 基本思想 获取相邻位置元素技巧 BFS函数 DFS实现 基本思想 DFS函数 完整代码 背景介绍 背景 给出一个mxn的矩阵,矩阵中的元素为0或1.称位置(x,y)与其上下 ...

  4. python输入正整数n、求n以内能被17整除的最大正整数_求100之内自然数中最大的能被17整除的数...

    . . 1 求 100 之内自然数中最大的能被 17 整除的数 #include void main() { int i ; for (i=100;i>0;i--) if(i%17--0)bre ...

  5. 求一颗二叉树中两个节点的最低公共父节点

    题目:求一棵二叉树中两个节点的最低公共父节点 思路:递归 和 非递归 public static TreeNode getLastCommonParentRec(TreeNode root, Tree ...

  6. 编程笔试(解析及代码实现):求出一个整数中各位数上所包含全部质数之和

    编程笔试(解析及代码实现):求出一个整数中各位数上所包含全部质数之和 目录 题目描述 代码实现 题目描述 求出一个整数中各位数上所包含全部质数之和 一家电子商务公司计划在圣诞节给客户提供特别折扣,他们 ...

  7. ML/DL之激活函数/求导函数:ML中常用的AF激活函数(step_function、sigmoid、softmax、ReLU等)求导函数等代码实现之详细攻略

    ML/DL之激活函数/求导函数:ML中常用的AF激活函数(step_function.sigmoid.softmax.ReLU等)&求导函数等代码实现之详细攻略 目录 AF函数&求导函 ...

  8. MAT之GA:利用GA对一元函数进行优化过程,求x∈(0,10)中y的最大值

    MAT之GA:利用GA对一元函数进行优化过程,求x∈(0,10)中y的最大值 目录 输出结果 代码设计 输出结果 代码设计 x = 0:0.01:10; y = x + 10*sin(5*x)+7*c ...

  9. c语言编程矩阵主对角线相同,急求!c语言 求N*N矩阵中主对角线和次对角线的元素之和...

    急求!c语言 求N*N矩阵中主对角线和次对角线的元素之和 來源:互聯網  2010-02-24 23:29:06  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 ...

  10. Hash——字符串匹配(求s1在s2中出现的次数)

    题目描述: 这是一道模板题. 给定一个字符串 A 和一个字符串 B ,求 B 在 A  中的出现次数.A 和 B中的字符均为英语大写字母. 求A 在 B 中出现了几次.(可重叠) 样例输入: 3 BA ...

最新文章

  1. LeetCode-135-Candy
  2. 怎样做网络推广浅谈如何更高效的提升关键词排名?你还不知道?
  3. 黑马程序员Linux系统开发视频之mmap使用注意事项
  4. MvvmLight:Command
  5. 从 12306 订购火车票 无需FQ
  6. java doubke类型转换为String_Java基础知识面试题大集合
  7. LaTeX双栏模板插入通栏公式(跨栏插图)
  8. linux用户密码转换为明文,Linux运维知识之linux下抓取内存中明文密码mimipenguin
  9. MVC路由中routes.IgnoreRoute({resource}.axd/{*pathInfo}) 到底什么意思!
  10. mysql+tushare搭建本地数据库
  11. 【LeetCode笔记】剑指 Offer 10-I. 斐波那契数列 (Java、递归、动态规划)
  12. 计算机学院科研,科研概况
  13. Java中@WebServlet的使用方法
  14. tableview cell自适应撑高
  15. Zabbix server is not running:the information displayed may not be current
  16. JRE 和 JDK历史版本是为了帮助开发
  17. java web邮件收发组件
  18. 《统计学》第八版贾俊平第十三章时间序列分析和预测知识点总结及课后习题答案
  19. 基于51单片机+SG90舵机
  20. 树莓派pytorch实现图像识别

热门文章

  1. 4A和堡垒机的关系与区别
  2. 基于C#的电脑录屏和录像(工程源码)
  3. 马化腾:搜索、电子商务硬仗一定要坚持打
  4. NO.25-SAP S4 HANA Cloud EX版本介绍
  5. Hunter的读《高效程序员的45个习惯》
  6. 单例模式的五种实现形式(懒汉式,饿汉式,双空判断,内部类,枚举)
  7. 八行代码实现图像分类-神一样的Mathematica
  8. 适合普通大众、非科班的路线
  9. 前端调用后端接口全都报403,但是换个浏览器可以正常访问,请问有大佬知道什么问题吗?
  10. 零基础看得懂的C语言入门教程