资源描述
血样的二次分组检验法及其模型与求解
摘 要
在当今快节奏的社会生活中,越来越多的人因为承受过多的生活压力而产生身体的健康问题。因而,健康问题越来越受到人类的重视。在普查一些疾病或体检时,常常需要对大量人群的血液样本进行检验。逐个检验血样,工作量很大,浪费人力、物力、财力。本课题提出了一种可将多个样本点合并进行校验而不影响校验结果的样本类型,采取二次分组的校验方式,目的在于对血样校验的实际情况进行分析,建立血样二次分组校验的数学模型,然后对模型的性质进行细致的分析,设计解决问题的算法并对算法进行程序实现,最后开发一个能够用于实际的血样分组校验的系统,以减少血样校验的次数,提高检验的效率,节约校验的成本,为医药的血样校验程序提供辅助的工具。
其意义是减少了血样校验的次数,节省了人力物力,降低了校验成本,为血样的校验提供了一个崭新的、更高效的方法。
关键词:血样分组检验、二次血样检验、分组血样检验模型与求解
目 录
第1章 绪 论 1
1.1血样二次分组检验法的意义 1
1.2二次分组验血的概述 1
1.3国内外研究现状,水平和发展趋势 1
1.3.1 国内外研究现状及水平 2
1.3.1 发展趋势 2
1.4开发环境及运行环境 2
1.4.1 开发环境 2
1.4.2 运行环境 2
第2章 血样检测相关知识简介 3
2.1血样检测的基本性质 3
2.1.1 一次分组验血法的性质 2
2.1.2 二次分组验血法的性质 2
2.2血样检测程序的基本操作 3
第3章 系统需求分析 6
3.1系统可行性分析 6
3.2 系统设计的思想 6
第4章 算法设计与实现 8
4.1 一次分组验血 8
4.2 二次分组验血 9
4.3 主要算法 19
4.7 几点补充说明 28
总 结 29
参考文献 30
第一章 绪论
1.1开发该系统的意义
普查一些疾病或体检时,常常需要对大量人群的血样进行检验。逐个检验血样,工作量很大,浪费人力、物力、财力。在各人的血样的反应相互独立的前提下,医务工作者提出了分组验血的方法,把从各个待检验者身上抽出的血液分成两部分,一份作为备用暂时保存起来,另一份若干个人分成一组混合起来。先检验各组的混合血样,若检验结果为阴性,则该组全部正常;若呈阳性,说明这一组至少有一个人异常,为查明是那些人异常,再对该组人的备份血样逐个检验,记单个人的血样呈阴性的概率为q(0<q<1),当q较大时,分组验血法能大大减少检验次数。
1.2二次分组验血的概述
研究中发现:每个待检验者的血样分成三份,两份备用,若干人分一组,当混合血样检验结果呈阳性时,不直接逐个检验该组的血样,而是分成若干个小组,先检验各个小组的混合血样,若呈阴性,该小组全正常,若呈阳性,再对该小组逐个检验,即成为二次分组验血法,有望进一步显著的减少预期检验次数。本文具体分析了二次分组检验的过程,建立了二次分组验血法预期人均检验次数最小的模型,以一次分组验血实际有效(有效技能减少检验次数)的q的范围为基础,得出了二次分组验血的最优小组数和最有效组人数范围,借鉴一次分组法求最有分组人数的方法,给出了求二次分组最优方案的方法,在医疗系统推广开来,有望产生较大的经济利益、社会利益。
1.3国内外研究现状,水平和发展趋势
1.3.1国内外研究现状及水平
由于血样分组校验在实际生活中存在着十分重大的意义,近些年来,大批的国内外专家学者以及对血样分组校验法感兴趣的人对此进行了大量的研究,初步证明了这种方法的有效性。这种分组校验的模型不仅适用于医学上,它还可以延伸到生活的各个方面,可以给社会实践以指导作用。
与此同时,对这个问题的各种研究也存在着一定的缺陷。
1、虽然给出了二次校验的方法,建立了问题的数学模型,该方法具有实际意义。但只给出了二次分组检验问题最优解的必要条件,却没有分析解的存在性、唯一性等性质,没有给出最优解的有界性,从理论分析上有不足之处,对于最优解的求解算法,也仍然是给出一个枚举法,提出算法似乎简单了点,同样由于没有给出最优解的存在性和有界性,所提出的最优解求解算法能否搜索到最优解有可疑之处,在理论分析上有不严密之处,精确度不够。
2、建立模型的过程中先验概率和合理假设具有非常重要的影响,比如,如果先验概率是一个特定群体的概率,而在建立模型的时候把这个特定群体的概率用到大众群体上来,就必然会导致模型预测的重大偏差。又如,如果在建立模型的时候假设不合理,把相互有影响的事件假设成独立事件,忽略了事物的内在影响,也会导致模型预测的失效,一个合理的模型,一定要建立在合理的假设前提下。
3、目前还没有以此数学模型建立一个有效的软件系统来实现血样的二次分组校验。
1.3.2发展趋势
任何正确的科学理论经过人类的不懈努力研究,都会朝着更有效、更严密的方向发展,血样的二次分组检验法也不例外,在人类的共同努力下,它一定会更严密,更有效,一定会为人类的生活带来更大的便利。
1.4 开发环境及运行环境
1.4.1 开发环境
l Intel® Pentium® 4 2.0GHz,512M内存,80G硬盘
l Microsoft® Windows™ 2000 Professional
l Microsoft® Visual C++ 6.0
l Microsoft® Developer Network for Visual Studio.NET 2003
l Visual Assist X 10.1.1301.0
1.4.2 运行环境
l Intel® Pentium® 2及以上处理器,32M以上内存,4G以上硬盘
l Microsoft® Windows™ 9X/NT操作系统
l 800*600或以上的屏幕分辨率
第二章 血样检测相关知识简介
2 .1血样检测的基本性质
2 .1.1一次分组验血的几个性质
采用一次分组验血法,分成k个人一组,记为分组方案S[K].对任意一组,若混合血样检验结果呈阴性,则该组织需检验一次,平均每人1/k次,概率为,若呈阳性,则该组共需检验1+k次,平均每人次,概率为1。人均检验次数X是一个随机变量,预期人均检验次数。若S[k]有效,则<1,即<。
性质1 当且仅当,存在有效的一次分组方案。记最优一次分组方案为,即分成人一组,预期人均检验次数最少。
性质2 当时,
性质3 当时,
由性质2和性质3,可以得到求的方法:
1、 取
2、 若则=k,终止
3、 k=k+1转步骤2
2.1.2二次分组验血的基本性质
采用二次分组验血法:待检测的血样分成若干个大组,每个大组再分成l个小组,每个小组m人,则每个大组lm人,记为分组方案S[l,m]。首先检验大组混合血样,若结果呈阴性,则该大组的所有人都呈阴性,只需检验1次,人均检验1/lm次,若呈阳性,则该大组中肯定有人异常。分别检验该大组中各个小组的混合血样,检验结果呈阴性的小组全部正常,不用在检验,检验结果呈阳性的小组需要在逐个检验。有可能两个小组中有1个小组的混个血样呈阳性,其余呈阴性,共需检验1+l+m次人均检验次,其概率为,有可能l个小组中有2个小组的混合血样呈阳性,其余呈阴性,共需检验1+l+2m次,人均检验次,其概率为,,人均检验次数X是一个随机变量,分布律为:
X
……
概率
……
预期的人均检验次数为:
上式进行转换得
考虑这样一个模型:检验lm人的血样,采用一次分组法,每组m人,可得预期人均检验次数:。也可以从整体上考虑上述检验的人均检验次数Y:先分别检验l个小组的混合血样,需要l次,然后对呈阳性的小组逐个检验,当l个小组都呈阴性时,Y取,概率为,当l个小组中有一个呈阳性,其余呈阴性时,Y取值,概率为,当l个小组中有2个呈阳性,其余呈阴性时,Y取值,概率为;……Y是一个随机变量,分布律为:
Y
……
概率
……
预期人均检验次数是:
EY=
所以有:
=
需要解决:确定的取得范围,使二次分组检验比一次分组检验更有效,对确定的q,寻求最佳二次分组方案,使取最小值,即求解模型
性质4 二次分组验血采用分组方案,能比最优的一次分组方案更有效,则(a);(b);(c);(d)每大组对应于m的最优小组数满足:。
证明(a)
由已知条件,,所以,相当于把每个小组的混合血样看做一个样本,对阴性概率为的样本进行一次分组检验有效。由性质1,。
(b)由性质2和性质4(a),使二次分组有效的q的范围:
(c)考察函数:
如同(a),可得g(x)<0有
所以,函数g(x)递增,当时,;由是最优的一次分组方案,得。因而,。因此,最优的二次分组方案中,。
(d)当每小组m人,求一个大组中的最优小组数,相当于对阴性概率为的样本进行一次分组时,求一个组内的最有数目,把性质3中的q换成即可得到结论。
根据性质4,借鉴于一次分组法,由每组人数k的下限值逐一递增求得的方法,得到求二次分组验血法的最优分组方案和预期最小人均检验次数的如下方法
计算,令m=
计算,
是
m=m-1
否
找出最小的,对应的分组方案为最优二次分组方案,预期最小人均检验次数
应用上述方法,求得以下结果;
一次分组检验
二次分组检验
单个人呈阴
性概率q
最优方案
预期人均最少
检验次数
最优方案
预期最小人均
检验次数
0.7
0.8
0.85
0.90
0.95
0.98
0.99
0.995
0.996
0.997
0.998
0.999
0.9995
0.9998
0.9999
3
3
3
4
5
8
11
15
16
19
23
32
45
71
101
0.990333
0.821333
0.719208
0.593900
0.426219
0.274237
0.195571
0.139098
0.124615
0.108118
0.088480
0.062759
0.044476
0.028186
0.019951
_
_
_
(3,3)
(3,3)
(4,4)
(5,5)
(6,6)
(7,6)
(7,7)
(8,8)
(11,10)
(13,13)
(18,17)
(22,22)
_
_
_
0.586304
0.376986
0.209182
0.133446
0.084923
0.073393
0.060777
0.046546
0.029468
0.018632
0.010155
0.006412
2.2血样检测程序的基本操作
第三章 系统需求分析
第四章 算法设计与实现
第五章 结束语
当各人的血样混合在一起检验互相不干扰,但个人血样检验呈阴性的概率q>0.693361时,一次分组验血法能减少预期人均检验次数,节约人力、物力;在q>0.885088时,采用二次分组法能进一步减少预期人均检验次数;实施中,能否取得预定效果与q值估计的准确性密切相关。在详细分析学养的分组检验基础上,提出了血样的二次分组检验法,建立了二次分组血样预期人均检验次数最小的模型,给出了二次分组法的最优小组数和最优小组人数的范围,得到了求二次分组最优方案的方法。计算结果表明模型结合方法是可信的,在单个人血样呈阴性概率q>0.885088时,采用二次分组验血法能比一次分组验血法更进一步减少检验次数,有较大的实用价值。
致 谢
经过近半年的努力,毕业论文终于完成,在此我对在这些日子中给予我很大帮助的老师、同学表示我的谢意。本次毕业论文完成得到了孙俊清老师全程的悉心帮助与指导,让我学习到了很多新的知识。同时孙老师也给我提出了很多宝贵的、实用的建议,帮助我把过去学到的数学和计算机知识真正地用到了实际问题的建模与分析以及算法的设计与程序实现中,得以顺利地完成对本次毕业论文工作。因此,我要诚挚地感谢孙俊清老师于百忙之中给予我的所有关心和帮助。
整个毕业论文是我们在学校的最后一段学习过程,也可以看作是我在理工大学四年本科生活的一点总结。七月,我将踏上工作岗位,在此我要真心地感谢计算机系所有曾经传授给我知识,更教给我做人道理的敬爱的老师们,谢谢您们让我拥有了一段充实的、精彩的、难忘的大学生活。
参考文献
[1] 张艳蛾,刘国义,纪爱兵,等.数学期望在疾病普查中的应用[J].数理医药杂志,2003,16(1):83-84.
[2] 张贵生.分组验血法最佳分组人数的取值范围和估计公式[J].苏州医学院学报,1994,(6):56-57.
[3] 涂宝标.关于血样分组校验的探讨[J].重庆工学院学报,2005,19(3):145-146.
[4] 唐守宪.分组化验的优化模型[J].数学的实践与认识,2006,36(7):284-288.
[5] 刘学忠.最优验血方法的判定[J].湎都学坛,1996,16(6):70-71.
[6] 孙群科.怎样计算分组验血法的最优值[J].工科数学,1990,6(1-2):14-18.
[7] 张乐成,任凤岐,迟津愉,等.血液分组化验中每组最佳人数算法及计算机程序[J].微机发展,2000,(3):59-61.
[8] 徐明民,邵均利.分组验血法的数学证明及计算最佳分组人数的一个新公式[J].数学的实践与认识,1996,26(2):18-24.
[9] 王为.分组校验成立的条件及最佳分组方法[J].新疆工学院学报,1996,17(1):19-23.
[10] 陈培德.概率群试[J].数学通报,2004,(4):38-39.
附 录
算法部分程序代码(c++):
#include<iostream.h>
#include<math.h>
double q;
double q1=1/pow(3,1/3.0);
int f=0;//数据个数的控制
int w=f-1;
int m[20000],l[20000];
double z[20000];
double yun1(double q,int k){
return 1-pow(q,k)+1.0/k;
}
void yun2(double q){ //计算fq的值
int a;
for(a=f-1;a>=0;a--){
z[a]=1.0-pow(q,m[a])+1.0/m[a]+1.0/(l[a]*m[a])-pow(q,l[a]*m[a])/m[a]; //公式
}
}
int suanfa()
{
double a,b,c;
int k;
a=ceil(sqrt(-1/(q*q*log(q))));
if(a>3)k=a;
else k=3;
do
{
b=pow(q,k)*(q-1)+1/(k*(k+1));
c=pow(q,k-1)*(q-1)+1/(k*(k-1));
k++;
}
while(b>=0);
return k-1;
}
void main()
{
int x,ch1;
int y;
do
{
cout<<"Separate System, choose"<<endl;
cout<<"1 计算 2 退出"<<endl;
cin>>ch1;
y=0;
if(ch1==1){
int l1,k;
cout<<"输入q的值:"<<endl;
cin>>q;
while(q<=q1){
cout<<"输入q值错误,请重新输入!"<<endl;
cout<<"输入q的值:"<<endl;
cin>>q;
}
k=suanfa();
if(q<=pow(q1,1/3.0)){
cout<<"只能进行一次分组!"<<endl;
cout<<"可得k的值为:"<<k<<endl;
cout<<"一次分组预期最小人均检验次数为:"<<yun1(q,k)<<endl;
y=1;
}
if(y==1) continue;
int a=int(log(q1)/log(q));
int m1=(k<a)?k:a;//中间变量
int m2;
double b;
double c;
for(m2=3;m2<=m1;m2++){
for(l1=3;l1<=k;l1++){
b=pow(q,(m2*l1))*((pow(q,m2))-1)+1/(l1*(l1+1));
c=pow(q,(m2*(l1-1)))*((pow(q,m2))-1)+1/(l1*(l1-1));//(注意)程序中没有用到这个式子
if(b<=0){
m[f]=m2;
l[f]=l1;
f++;
}
}
}
yun2(q);
double min=z[f-1];
for(int d=f-1;d>=0;d--){
if(z[d]<=min){
min=z[d];
w=d;
}
}
cout<<"可得k的值为:"<<k<<endl;
cout<<"可得m的值为:"<<m[w]<<endl;
cout<<"可得l的值为:"<<l[w]<<endl;
cout<<"一次分组预期最小人均检验次数:"<<yun1(q,k)<<endl;
cout<<"二次分组预期最小人均检验次数:"<<min<<endl;
}
else
if(ch1==2){
cout<<"1 NO 0 YES"<<endl;
cin>>x;
}
}while(x);
}
展开阅读全文