Below is my program in Visual C++, please check for me.

void CHJDlg::OnAc()

{

// TODO: Add your control notification handler code here

UpdateData(TRUE); // update data from control to present variance.

// vice versa update the present variance to control

m_R=m_LD*m_T2;

m_S=m_LD*m_T;

m_AC = AC();

UpdateData(FALSE);

}

// calculate the value of OC

double CHJDlg::OC()

{

int i=int(m_S-m_R-1);

double r,Lamda_T;

Lamda_T = m_LD * m_T;

r=TotalFormula(0,i,Lamda_T,exp(-Lamda_T));

m_OC = double(1)/m_T*((m_K1-m_K2)*r-m_K1/exp(Lamda_T)+m_K2);

UpdateData(FALSE);

return m_OC;

}

//build the totalfunction

double CHJDlg::TotalFormula(int m_From, int m_To, double x, double y)

{

double ResultTF,luythua,giaithua;

ResultTF=0;

for (int i=m_From;i<=m_To;i++){

//luythua = pow(x,i);

luythua = exp(i * log(x));

giaithua = Factorial(i);

ResultTF=ResultTF+luythua/giaithua*y;

}

return ResultTF;

}

//build the factorial function.

double CHJDlg::Factorial(int x)

{

double Result;

Result=1;

for (int i=2;i<=x;i++)

Result=Result*i;

return Result;

}

//calculate the value of BO1

double CHJDlg::BO1()

{

double Lamda_T, e_Lamda_T, total1, total2;

Lamda_T = m_LD * m_T;

e_Lamda_T = exp(-Lamda_T);

total1 = TotalFormula(0,m_S-1,Lamda_T,1);

total2 = TotalFormula(0,m_S,Lamda_T,1);

m_BO1 = Lamda_T - (Lamda_T * e_Lamda_T * total1) - m_S + (m_S * e_Lamda_T * total2);

UpdateData(FALSE);

return m_BO1;

}

//calculate the value of BO2

double CHJDlg::BO2(int From, int To, double m_lamda_t)

{

double lamda_t1, lamda_t, e_lamda_t1, e_lamda_t, Result, total1, total2;

Result = 0;

total1 = 0;

total2 = 0;

lamda_t1 = m_lamda_t;

e_lamda_t1 = exp(-lamda_t1);

lamda_t = m_LD * m_T;

e_lamda_t = exp(-lamda_t);

for(int j=From;j<=To;j++)

{

total1 = TotalFormula(0, j-2, lamda_t1, double(1));

total2 = TotalFormula(0, j-1, lamda_t1, double(1));

Result = Result + (lamda_t1*(double(1)-e_lamda_t1*total1) - j*(double(1)-e_lamda_t1*total2))*pow(lamda_t,m_S-j)/Factorial(m_S-j)*e_lamda_t;

}

return Result;

}

//calculate the value of BO2n

double CHJDlg::BO2n()

{

m_BO2N = BO2(m_R+1, m_S-1, m_LD*m_T1);

UpdateData(FALSE);

return m_BO2N;

}

//calculate the value of BO2e1

double CHJDlg::BO2e1()

{

double lamda_t, lamda_t2, total1, total2;

double Result;

Result = 0;

lamda_t = m_LD* m_T;

lamda_t2 = m_LD*m_T2;

total1 = TotalFormula(0, m_S-1, lamda_t, exp(-lamda_t));

total2 = TotalFormula(0, m_S-2, lamda_t, exp(-lamda_t));

m_BO2E1 = lamda_t2 + lamda_t - m_S + (m_S - lamda_t2)*total1 - lamda_t*total2;

UpdateData(FALSE);

return m_BO2E1;

}

//calculate the value of BO2e2

double CHJDlg::BO2e2()

{

m_BO2E2 = BO2(1,m_R,m_LD* m_T2);

UpdateData(FALSE);

return m_BO2E2;

}

//take sum of BO2e1 and BO2e2 to get BO2e

double CHJDlg::BO2e()

{

m_BO2E = BO2e1() + BO2e2();

UpdateData(FALSE);

return m_BO2E;

}

//calculate value of BO

double CHJDlg::BO()

{

m_BO = double(m_P)/m_T * (BO1() + BO2n() + BO2e());

UpdateData(FALSE);

return m_BO;

}

//calculate value of AC

double CHJDlg::AC()

{

return OC() + BO();

}

//////////////////////STAR USING HOOK AND JEEVE METHOD TO FIND THE VALUE OF R AND S WHICH GIVE THE MINIMUM VALUE OF AC.///

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void CHJDlg::OnHj()

{

// TODO: Add your control notification handler code here

UpdateData(TRUE); // update date from control to present variance

// define the array value for Xo, X1....

int Xo[2],X10[2],X11[2],X12[2];

CString str;

m_R=m_LD*m_T2;

m_S=m_LD*m_T;

// set the start value for Xo: Xo{x1,x2}={R,S}

Xo[0] = m_R;

Xo[1] = m_S;

// calculate AC

m_AC = AC();

// the program get stuck, then debug from this line to find the problem

//The problem still not solved.

////////////////////////////////////////////////////////////////////////////////////////////////////////

str.Format("%d\t\t%d\t\t%d\t\t%15lf\n",m_deltaXi,m _R,m_S,m_AC);

m_View = str;

UpdateData(false);

// set X10=Xo

X10[0] = Xo[0];

X10[1] = Xo[1];

bool flag=true;

while (flag)

{

// step 1: increase/decrease x1 by deltaX.

//first: to increase x1

m_R = X10[0] + m_deltaXi;

m_S = X10[1];

// calculate AC+ then add to ac_temp

ac_temp = AC();

if (ac_temp<m_AC) // if AC+ less than AC then change the value of X11

{

X11[0] = X10[0] + m_deltaXi;

X11[1] = X10[1];

// keep the new value AC+, update value m_AC by AC+ for using of next step (step 2).

m_AC =ac_temp;

str.Format("%d\t\t%d\t\t%d\t\t%15lf\n",m_deltaXi,m _R,m_S,m_AC);

m_View = m_View + str;

UpdateData(false);

// still do not save the value of m_R, m_S, m_AC and deltaX into file.

}

else// if increase x1 do not give lower value of AC then decrease x1.

{

//second: decrease x1

m_R = X10[0] - m_deltaXi;

// reculculate AC-

ac_temp = AC();

if (ac_temp<m_AC)

{// if AC- < AC => take the new value for X11

X11[0] = X10[0] - m_deltaXi;

X11[1] = X10[1];

// keep the new value AC-, update value m_AC by AC- for using of next step(step 2).

m_AC =ac_temp;

// still do not save the value of m_R, m_S, m_AC and deltaX into file.

str.Format("%d\t\t%d\t\t%d\t\t%15lf\n",m_deltaXi,m _R,m_S,m_AC);

m_View = m_View + str;

UpdateData(false);

}

else// if increase/decrease x1 do not give lower value of AC then take X11=X10

{

X11[0] = X10[0];

X11[1] = X10[1];

}

}

// step 2: increase/decrease x2 by deltaX.

//first: increase x2

m_R = X11[0];

m_S = X11[1] + m_deltaXi;

// calculate AC+

ac_temp = AC();

if (ac_temp<m_AC)// if AC+ < AC then X12 = X11 + delta

{

X12[0] = X11[0];

X12[1] = X11[1] + m_deltaXi;

// update value of m_AC by AC+ for the comparing of next step.

m_AC = ac_temp;

// still do not save the value of m_R, m_S, m_AC and deltaX into file.

str.Format("%d\t\t%d\t\t%d\t\t%15lf\n",m_deltaXi,m _R,m_S,m_AC);

m_View = m_View + str;

UpdateData(false);

}

else // if increase x1 do not give lower value of AC then decrease x1.

{

//decrease x2

m_S = X11[1] - m_deltaXi;

ac_temp = AC();

if (ac_temp<m_AC)

{

X12[0] = X11[0];

X12[1] = X11[1] - m_deltaXi;

// update value of AC by AC- for the next comparing.

m_AC = ac_temp;

// still do not save value of m_R, m_S, m_AC and deltaX into file

str.Format("%d\t\t%d\t\t%d\t\t%15lf\n",m_deltaXi,m _R,m_S,m_AC);

m_View = m_View + str;

UpdateData(false);

}

else// if increase/decrease x2 do not give lower value of AC then take X12=X11

{

X12[0] = X11[0];

X12[1] = X11[1];

}

}

//******************************

// check the value of X12 and X10, they are equal or not.

if (X12[0]==X10[0] && X12[1]==X10[1])// if X12=X10 then check deltaX < epsilon ?

{

if (m_deltaXi<=m_epsilon)// if deltaX < epsilon, then stop.

{

flag=false;//add the flag = false to stop the bool.

break; // exit the bool

}

else // if deltaX > epsilon, then decrease deltaX.

{

m_deltaXi = m_deltaXi/2;

}

}

else // if X12# X10

{

// then find the new value of X10 by X10 = X12 - (X12 - X10).

X10[0] = 2*X12[0] - Xo[0];

X10[1] = 2*X12[1] - Xo[1];

//update the value of R, S, AC.

m_R = X10[0];

m_S = X10[1];

m_AC = AC();

//update the value of Xo.

Xo[0] = X10[0];

Xo[1] = X10[1];

}

}// end while

}