⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xzdcx_display.cpp

📁 这是一个求解线性规划问题的程序
💻 CPP
字号:
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop

#include "xzDcx_display.h"
#include "global.h"
#include "main.h"

//---------------------------------------------------------------------------
#pragma link "Grids"
#pragma resource "*.dfm"
Tfrm_xzDcx_display *frm_xzDcx_display;
//---------------------------------------------------------------------------
__fastcall Tfrm_xzDcx_display::Tfrm_xzDcx_display(TComponent* Owner)
	: TForm(Owner)
{
   //构造一些中间数据
   fIMatJudge = new TMatrix(1,2);   //非基判别行矩阵MatJudge
   fICVetPivot = new TCVector(1);     //枢列向量
   fIs = new unsigned int;            //枢列坐标s
   fIr = new unsigned int;            //枢行坐标r

   fIIMatJudge = new TMatrix(1,2);   //非基判别行矩阵MatJudge
   fIICVetPivot = new TCVector(1);     //枢列向量
   fIIs = new unsigned int;            //枢列坐标s
   fIIr = new unsigned int;            //枢行坐标r
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_xzDcx_display::FormDestroy(TObject *Sender)
{
   delete fIMatJudge;  //非基判别行矩阵MatJudge
   delete fICVetPivot; //枢列向量
   delete fIs;         //枢列坐标s
   delete fIr;         //枢行坐标r

   delete fIIMatJudge;  //非基判别行矩阵MatJudge
   delete fIICVetPivot; //枢列向量
   delete fIIs;         //枢列坐标s
   delete fIIr;         //枢行坐标r
}
//---------------------------------------------------------------------------
void Tfrm_xzDcx_display::
        Reset(TDcxQuestion* aDcxQ,           //原问题
              TDcxQuestion* aRuleDcxQ,       //规范型问题
              bool adoRule,                  //是否要化为规范型问题
              TDcxQuestion* aAssistantDcxQ,  //辅助问题
              bool adoFirst,                 //是否要进行第一阶段构造辅助问题
              bool adoSecond,                //规范性问题是否有可行解
              KTList<TxzDcx*>* aILResult,    //第一阶段结果数据
              KTList<TxzDcx*>* aIILResult,   //第二阶段结果数据
              TMatrix* fMatTranForm          //规范型到原问题的变换矩阵
              )
{
   unsigned int i,j;
   
   fIMatJudge->Reset(aAssistantDcxQ->mMatA->GetColCount()-aAssistantDcxQ->mMatA->GetRowCount(),2);   //非基判别行矩阵MatJudge
   fICVetPivot->Reset(aAssistantDcxQ->mMatA->GetRowCount());     //枢列向量

   fIIMatJudge->Reset(aRuleDcxQ->mMatA->GetColCount()-aRuleDcxQ->mMatA->GetRowCount(),2);   //非基判别行矩阵MatJudge
   fIICVetPivot->Reset(aRuleDcxQ->mMatA->GetRowCount());     //枢列向量

   AnsiString s;
   memo_display->Lines->Clear();

   memo_display->Lines->Add("用修正单纯型方法求解线性规划问题:");
   memo_display->Lines->Add(" ");
   memo_display->Lines->Add("原问题为:");
   memo_display->Lines->Add("");
   AddDcxQ(memo_display->Lines,aDcxQ);
   if (adoRule) {
      memo_display->Lines->Add("-----------------------------------");
      memo_display->Lines->Add("化为规范型为:");
      AddDcxQ(memo_display->Lines,aRuleDcxQ);
   }
   if (adoFirst) {
      memo_display->Lines->Add("-----------------------------------");
      memo_display->Lines->Add("构造辅助问题为:");
      AddDcxQ(memo_display->Lines,aAssistantDcxQ);
      memo_display->Lines->Add("");
      memo_display->Lines->Add("初始单纯型表为:");
      for (i=1,aILResult->First();!aILResult->IsEof();aILResult->Next(),i++) {

         AddMatrix(memo_display->Lines,&aILResult->GetData()->GetMatxzDcx());
         AddBase(memo_display->Lines,aILResult->GetData()->GetLB());

         int lResult =  aILResult->GetData()->GetPivot(aAssistantDcxQ,fIMatJudge,fIs,fICVetPivot,fIr);

         memo_display->Lines->Add("我们计算z(j)-c(j):");
         AnsiString ls;
         for (j=1;j<=fIMatJudge->GetRowCount();j++) {
            int lj = StrToInt((AnsiString)(*fIMatJudge)(j,1));
            ls = (AnsiString)"  z("+lj+")-c("+lj+") = " + (*fIMatJudge)(j,2);
            memo_display->Lines->Add(ls);
         }

         if (lResult == 1) { //已是最优表
            memo_display->Lines->Add("");
            memo_display->Lines->Add("所有z(j)-c(j)都小于等于0,当前已是最优表.转入第二阶段.");
            break;
         }
         else {
            memo_display->Lines->Add("");
            memo_display->Lines->Add((AnsiString)"得枢列s="+(*fIMatJudge)(*fIs,1)+",计算枢列:");
            for (j=1;j<=fICVetPivot->GetDimCount();j++) {
               ls = (AnsiString)"  t("+j+","+(*fIMatJudge)(*fIs,1)+") = " + (*fICVetPivot)(j);
               memo_display->Lines->Add(ls);
            }

            if (lResult == -1) {
               memo_display->Lines->Add("");
               memo_display->Lines->Add("所有枢列元素都小于等于0,辅助问题的目标函数趋向于正无穷,无有限最优值.计算停止.");
            }
            else {
               memo_display->Lines->Add((AnsiString)"易得枢行r="+*fIr+",枢元素t("+*fIr+","+(*fIMatJudge)(*fIs,1)+")="+(*fICVetPivot)(*fIr)+",第"+i+"次换基得:");
               memo_display->Lines->Add("-----------------------------------");
            }
         }
      }



   }

   if (adoSecond) {
      memo_display->Lines->Add("-----------------------------------");

      AnsiString ls0 = "x=(";
      for (j=1;j<aRuleDcxQ->mCVetx->GetDimCount();j++)
        ls0 = ls0 + (AnsiString)(*aRuleDcxQ->mCVetx)(j) + ",";
      ls0 =ls0 + (AnsiString)(*aRuleDcxQ->mCVetx)(j) + ")";

      memo_display->Lines->Add("从初始基可行解"+ls0+"构造修正单纯型表为:");

      for (i=1,aIILResult->First();!aIILResult->IsEof();aIILResult->Next(),i++) {

         AddMatrix(memo_display->Lines,&aIILResult->GetData()->GetMatxzDcx());
         AddBase(memo_display->Lines,aIILResult->GetData()->GetLB());

         int lResult =  aIILResult->GetData()->GetPivot(aRuleDcxQ,fIIMatJudge,fIIs,fIICVetPivot,fIIr);

         memo_display->Lines->Add("我们计算z(j)-c(j):");
         AnsiString ls;
         for (j=1;j<=fIIMatJudge->GetRowCount();j++) {
            int lj = StrToInt((AnsiString)(*fIIMatJudge)(j,1));
            ls = (AnsiString)"  z("+lj+")-c("+lj+") = " + (*fIIMatJudge)(j,2);
            memo_display->Lines->Add(ls);
         }

         if (lResult == 1) { //已是最优表
            memo_display->Lines->Add("");
            memo_display->Lines->Add("所有z(j)-c(j)都小于等于0,当前已是最优表.计算停止.");

            //当前最优解
            TCVector lCVetx(aRuleDcxQ->mCVetx->GetDimCount());
            for (j=1,aIILResult->GetData()->GetLB()->First();!aIILResult->GetData()->GetLB()->IsEof();aIILResult->GetData()->GetLB()->Next(),j++)
               lCVetx(aIILResult->GetData()->GetLB()->GetData()) = (*aIILResult->GetData()->GetCVetBx())(j);

            ls = "x=(";
            for (j=1;j<lCVetx.GetDimCount();j++)
               ls = ls + (AnsiString)lCVetx(j) + ",";
            ls =ls + (AnsiString)lCVetx(j) + ")";

            memo_display->Lines->Add("最优解为:"+ls);
            memo_display->Lines->Add((AnsiString)"最优值是: z0 = "+aIILResult->GetData()->GetValz0());
            if (adoRule) {
               //原问题最优解
               TCVector lCVetx0(aDcxQ->mCVetx->GetDimCount());
               lCVetx0 = (*fMatTranForm)*(*(TMatrix*)&lCVetx);

               ls = "x=(";
               for (j=1;j<lCVetx0.GetDimCount();j++)
                  ls = ls + (AnsiString)lCVetx0(j) + ",";
               ls =ls + (AnsiString)lCVetx0(j) + ")";

               memo_display->Lines->Add("");
               memo_display->Lines->Add("原问题最优解为:"+ls);
               memo_display->Lines->Add((AnsiString)"最优值是: z0 = "+aIILResult->GetData()->GetValz0());

            }
            return;
         }
         else {
            memo_display->Lines->Add("");
            memo_display->Lines->Add((AnsiString)"得枢列s="+(*fIIMatJudge)(*fIIs,1)+",计算枢列:");
            for (j=1;j<=fIICVetPivot->GetDimCount();j++) {
               ls = (AnsiString)"  t("+j+","+(*fIIMatJudge)(*fIIs,1)+") = " + (*fIICVetPivot)(j);
               memo_display->Lines->Add(ls);
            }

            if (lResult == -1) {
               memo_display->Lines->Add("");
               memo_display->Lines->Add("所有枢列元素都小于等于0,原问题的目标函数趋向于负无穷,无有限最优值.计算停止.");
            }
            else {
               memo_display->Lines->Add((AnsiString)"易得枢行r="+*fIIr+",枢元素t("+*fIIr+","+(*fIIMatJudge)(*fIIs,1)+")="+(*fIICVetPivot)(*fIIr)+",第"+i+"次换基得:");
               memo_display->Lines->Add("-----------------------------------");
            }
         }
      }
   }
   else {
      memo_display->Lines->Add("");
      memo_display->Lines->Add("辅助问题的最优值不为0,原问题无可行解.计算停止.");
   }
}

//---------------------------------------------------------------------------
void Tfrm_xzDcx_display::AddBase(TStrings* aLines,KTList<unsigned int>* aLB)
{
   AnsiString s;
   s = "   基B = (";
   for (aLB->First();!aLB->IsTail();aLB->Next())
      s = s + aLB->GetData()+",";
   s = s + aLB->GetData()+")";
   aLines->Add(s);
}

void Tfrm_xzDcx_display::AddMatrix(TStrings* aLines,TMatrix *aMat)
{
   AnsiString s;
   aLines->Add(" ");
   for (unsigned int i=1;i<=aMat->GetRowCount();i++) {
      s ="  |  ";
      for (unsigned int j=1;j<=aMat->GetColCount();j++) {
         s = s + Format((*aMat)(i,j),5)+" ";
      }
      s = s + "|";
      aLines->Add(s);
   }
   aLines->Add(" ");

}
//---------------------------------------------------------------------------
AnsiString Tfrm_xzDcx_display::Format(AnsiString as,int aLength)
{
   AnsiString s=as;
   for (int i=1;i<=aLength-as.Length();i++) {
      s = s + " ";
   }
   return s;
}
//---------------------------------------------------------------------------
void Tfrm_xzDcx_display::AddDcxQ(TStrings* aLines,TDcxQuestion* aDcxQ)
{
   AnsiString s="";

   s = "min(z) = c*x = ";
   for (unsigned int i=1;i<=aDcxQ->mCVetc->GetDimCount();i++)
      s = s + Format((*aDcxQ->mCVetc)(i),5);
   aLines->Add(s);

   for (unsigned int i=1;i<=aDcxQ->mMatA->GetRowCount();i++) {
      if (i==1)
         s = "s.t.  ";
      else
         s = "      ";

      for (unsigned int j=1;j<=aDcxQ->mMatA->GetColCount();j++)
         s = s + Format((*aDcxQ->mMatA)(i,j),5);

      if ((*aDcxQ->mCVetI)(i)==-1)
        s = s + "<=";
      else if ((*aDcxQ->mCVetI)(i)==1)
        s = s + ">=";
      else
        s = s + "= ";

      s = s + (*aDcxQ->mCVetb)(i);
      aLines->Add(s);
   }

   s = "      ";
   unsigned int i=1;
   for (;i<aDcxQ->mCVetsign->GetDimCount();i++) {
      if ((*aDcxQ->mCVetsign)(i)==0)
         s = s + "x"+i+">=0, ";
   }
   if ((*aDcxQ->mCVetsign)(i)==0)
      s = s + "x"+i+">=0";

   aLines->Add(s);

}
//---------------------------------------------------------------------------
void Tfrm_xzDcx_display::ResetRule(TDcxQuestion* aDcxQ,TDcxQuestion* aRuleDcxQ,TDcxQuestion* aAssistantDcxQ)
{
  //刷新数据
   memo_display->Lines->Clear();
   memo_display->Lines->Add("");
   memo_display->Lines->Add("原问题为:");
   AddDcxQ(memo_display->Lines,aDcxQ);
   memo_display->Lines->Add("-------------------------------");
   memo_display->Lines->Add("化为规范型问题为:");
   AddDcxQ(memo_display->Lines,aRuleDcxQ);
   memo_display->Lines->Add("-------------------------------");
   memo_display->Lines->Add("辅助问题为:");
   AddDcxQ(memo_display->Lines,aAssistantDcxQ);

   AnsiString s;
   s = "初始基可行解为: x = (";
   unsigned int i;
   for (i=1;i<aAssistantDcxQ->mCVetx->GetDimCount();i++) 
      s = s + (*aAssistantDcxQ->mCVetx)(i)+",";
   s = s + (*aAssistantDcxQ->mCVetx)(i)+")";
   memo_display->Lines->Add(s);

   memo_display->Lines->Add("-------------------------------");
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_xzDcx_display::btn_closeClick(TObject *Sender)
{
   Close();        
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_xzDcx_display::btn_saveClick(TObject *Sender)
{
   if (dlg_save->Execute()) {
      memo_display->Lines->SaveToFile(dlg_save->FileName);
   }
}
//---------------------------------------------------------------------------

void __fastcall Tfrm_xzDcx_display::btn_printClick(TObject *Sender)
{
//打印
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -