4.模型的程序实现
对于物资分配问题,用软件来实现,其流程如下:

所以程序主要分为三个模块:数据读入模块;分配处理模块和结果保存输出模块。
4.1数据读入模块代码:
定义对象CDaoDatabase m_DB;用于数据库操作。定义全局变量m_ApplyArray、m_GalleryArray、m_DistributionArray,分别用于保存申请计划信息、库存信息和分配结果输出信息。定义全局变量float Class[10];用于保存各个优先级类的权系数变量。
在读写数据库前,首先要打开数据库。
//打开数据库 if(m_DB.IsOpen())m_DB.Close();m_DB.Open("数据库名"); |
读取申请数据、物资库存数据,并将单位信息存储到结果输出m_DistributionArray结构中。
CDaoRecordset m_Set(&m_DB);COleVariant var; m_Set.Open(dbOpenDynaset,"Select * from Apply"); m_ApplyArray.RemoveAll(); m_DistributionArray.RemoveAll(); while(!m_Set.IsEOF()) { Apply* m_Apply= =new Apply; Distribution *m_Distribution=new Distribution; var = m_Set.GetFieldValue(0); m_Apply ->Code=var.intVal; m_Distribution->Code=var.intVal; var = m_Set.GetFieldValue(1); m_Apply ->Name=CCrack::strVARIANT(var); m_Distribution->Name=m_Apply ->Name; var = m_Set.GetFieldValue(2); m_Apply ->Class=var.intVal; var = m_Set.GetFieldValue(3); m_Apply ->NQ1= var.fltVal; var = m_Set.GetFieldValue(4); m_Apply ->NQ2= var.fltVal; … var = m_Set.GetFieldValue(i+2); m_Apply ->NQi= var.fltVal; m_ApplyArray.Add(m_Apply); m_DistributionArray.Add(m_Distribution); m_Set.MoveNext(); } m_Set.Close(); m_Set.Open(dbOpenDynaset,"Select * from Gallery"); while(!m_Set.IsEOF()) { Gallery* m_Gallery = =new Gallery; var = m_Set.GetFieldValue(0); m_Gallery ->Code=var.intVal; var = m_Set.GetFieldValue(1); m_Gallery ->Name=CCrack::strVARIANT(var); var = m_Set.GetFieldValue(2); m_Gallery ->SQ1=var.fltVal; var = m_Set.GetFieldValue(3); m_Gallery ->SQ2= var.fltVal; … var = m_Set.GetFieldValue(i+1); m_Gallery ->SQi= var.fltVal; var = m_Set.GetFieldValue(i+2); m_Gallery ->RQ1=var.fltVal; var = m_Set.GetFieldValue(i+3); m_Gallery ->RQ2= var.fltVal; … var = m_Set.GetFieldValue(2i+1); m_Gallery ->RQi= var.fltVal; m_GalleryArray.Add(m_Gallery); m_Set.MoveNext(); } m_Set.Close(); if(m_DB.IsOpen())m_DB.Close(); |
4.2物资分配模型主要函数
①第 种物资的总申请量函数为
float Q() { float Q=0;//对第 种物资的总申请量 int a=m_ApplyArray.GetSize(); for(int j=0;j<a;j++) {Apply* m_Apply= m_ApplyArray.GetAt(j);Q+=m_Apply->NQi;} return Q; } |
②第 种物资的总可供量函数为
float S() {float S=0; //第 种物资的总可供量 a=m_ApplyArray.GetSize(); for(j=0;j<a;j++) {Apply* m_Gallery= m_ Gallery Array.GetAt(j); S+=m_Gallery->SQi-m_Gallery->RQi; } } |
③分配算法主函数:
由于我们考虑到实际应用中,不同情况下会有不同的分配原则(讨论如前),所以软件应该允许用户根据实际情况灵活选择分配方法。我们定义一个全局变量int method;它的取值为1、2、3、4,分别表示用户采用按照满足单位最多的原则、按照申请比例进行分配的原则、按优先级逐级保障分配法、按优先级削减分配法四种分配方法。对应的分配函数为DisFunciont1()、DisFunciont2()、DisFunciont3()、DisFunciont4().
void Distribution() { float S=S();float Q=Q(); if(S>=Q) {//各单位分得的物资量等于其申请量 int a=m_DistributionArray.GetSize(); int b=m_ApplyArray.GetSize(); for(int i=0;i<a;i++) { int code= m_DistributionArray.GetAt(i)->Code; for(int j=0;j<b;j++){if (code== m_ApplyArray.GetAt()->Code;) m_DistributionArray.GetAt(i)->DQi =m_ApplyArray.GetAt(j)->NQi } } }else { if(method==1) DisFunciont1();else if(method==2) DisFunciont2();else if(method==3) DisFunciont3();else if(method==4) DisFunciont4();else ::AfxMessageBox("出错啦!"); } } |
四个分配函数的模型前面已经讨论过了,这里就不一一写出代码了。
4.3分配结果数据存储模块
//打开数据库 if(m_DB.IsOpen())m_DB.Close();m_DB.Open("数据库名"); CString strSQL; int a=m_DistributionArray.GetSize(); for(int i=0;i<a;i++) {strSQL.Format( "insert into Distribution values (%d,'%s',%f,%f,…,%f)",m_DistributionArray.GetAt(i)->Code, m_DistributionArray.GetAt(i)->Name, m_DistributionArray.GetAt(i)->DQ1, m_DistributionArray.GetAt(i)->DQ2,…, m_DistributionArray.GetAt(i)->DQi); m_DB.Execute(strSQL); } if(m_DB.IsOpen())m_DB.Close(); |
把上述函数打包成模块,可以在需要的时候调用用于保存分配结果数据。
|