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

📄 xzdcx_solve.cpp

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

#include "xzDcx_solve.h"
//---------------------------------------------------------------------------
#pragma link "Grids"
#pragma resource "*.dfm"
Tfrm_xzDcx_solve *frm_xzDcx_solve;
//---------------------------------------------------------------------------
__fastcall Tfrm_xzDcx_solve::Tfrm_xzDcx_solve(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void Tfrm_xzDcx_solve::SetGrids(KTList<TxzDcx*>* aLxzDcx,TDcxQuestion* aDcxQ,TMatrix* aMatJudge,unsigned int* as,TCVector* aCVetPivot,unsigned int *ar)
{
   int i;

   //修正单纯型表
   glb_SetGrid(&aLxzDcx->GetData()->GetMatxzDcx(),sg_xzDcx);

   //序号
//   sg_xzDcx->Cells[0][0] = "("+IntToStr(sg_xzDcx->RowCount-1)+"*"+IntToStr(sg_xzDcx->ColCount-1)+")";
//   for (i=1;i<sg_xzDcx->RowCount-1;i++)
//      sg_xzDcx->Cells[0][i] = IntToStr(i);
//   sg_xzDcx->Cells[0][sg_xzDcx->RowCount-1] = '1';
//   sg_xzDcx->Cells[0][1] = '1';
//   for (j=2;j<sg_xzDcx->ColCount;j++)
//      sg_xzDcx->Cells[j][0] = IntToStr(j-1);

   //基
   sg_B->RowCount = aLxzDcx->GetData()->GetLB()->GetCount()+1;
   sg_B->Cells[0][0] = "("+IntToStr(aLxzDcx->GetData()->GetLB()->GetCount())+ ")";
   for (i=1,aLxzDcx->GetData()->GetLB()->First();!aLxzDcx->GetData()->GetLB()->IsEof();aLxzDcx->GetData()->GetLB()->Next(),i++) {
      sg_B->Cells[0][i] = i;
      sg_B->Cells[1][i] = aLxzDcx->GetData()->GetLB()->GetData();
   }

   //费用向量
   glb_SetCVetGrid(aDcxQ->mCVetc,sg_c,false);

   //当前解
   glb_SetCVetGrid(aDcxQ->mCVetx,sg_x,false);
   for (i=1;i<sg_x->ColCount;i++)
      sg_x->Cells[i][1] = 0;
   for (i=1,aLxzDcx->GetData()->GetLB()->First();!aLxzDcx->GetData()->GetLB()->IsEof();aLxzDcx->GetData()->GetLB()->Next(),i++) {
      sg_x->Cells[aLxzDcx->GetData()->GetLB()->GetData()][1] = (*aLxzDcx->GetData()->GetCVetBx())(i);
   }


    //传进原问题,计算取得非基判别行矩阵MatJudge及枢列坐标as、枢列向量VetPivot及枢行坐标位置,
   int lResult = aLxzDcx->GetData()->GetPivot(aDcxQ,aMatJudge,as,aCVetPivot,ar);

   unsigned int j;
   //z(j)-c(j)=~y*a(s) - c(s),非基判别行矩阵MatJudge
   lbox_judge->Items->Clear();
   AnsiString ls;
   unsigned int lDimCount = aDcxQ->mMatA->GetRowCount();
   for (j=1;j<=aMatJudge->GetRowCount();j++) {
     //z(2)-c(2) = y(1)a(1,2)+y(2)a(2,2)-c(2)=1*2+1*5-0 =7
     int lj;
     lj = StrToInt((AnsiString)(*aMatJudge)(j,1));
     ls = "z("+(AnsiString)lj+")-c("+lj+")=";

     for (unsigned int k=1;k<lDimCount;k++)
        ls = ls + "y("+k+")a"+"("+k+","+lj+")+";
     ls = ls + "y("+lDimCount+")a"+"("+lDimCount+","+lj+")";
     ls = ls + "-c("+lj+")=";

     for (unsigned int k=1;k<lDimCount;k++)
        ls = ls + (*aLxzDcx->GetData()->GetCVety())(k)+"*"+(*aDcxQ->mMatA)(k,lj)+"+";
     ls = ls + (*aLxzDcx->GetData()->GetCVety())(lDimCount)+"*"+(*aDcxQ->mMatA)(lDimCount,lj);
     ls = ls + "-"+(*aDcxQ->mCVetc)(lj)+"=";

     ls =ls +(*aMatJudge)(j,2);

     lbox_judge->Items->Add(ls);
   }

   if (lResult==1) {//所有判别行z(j)-c(j)都<=0(即当前已是最优解)
      lb_judge->Caption = "所有判别行z(j)-c(j)都<=0,当前已是最优解.";
      lbox_row->Visible = false;
      lb_row->Visible = false;
   }
   else {
      lb_judge->Caption = "得枢列s = "+(AnsiString)*as+",计算枢行:";
      lbox_row->Visible = true;
      lb_row->Visible = true;

      //枢行
      lbox_row->Items->Clear();
      for (j=1;j<=aCVetPivot->GetDimCount();j++) {
         //t(2,1)=u(2,1)*a(1,1)+u(2,2)a(2,1)=(-2)*1+1*4=2
         ls = "t("+IntToStr(j)+","+*as+")=";

         for (unsigned int k=1;k<lDimCount;k++)
            ls = ls + "u("+j+","+k+")a"+"("+k+","+*as+")+";
         ls = ls + "u("+j+","+lDimCount+")a"+"("+lDimCount+","+*as+")";
         ls = ls + "=";

         ls = ls + (*aCVetPivot)(j);

         if ((*aCVetPivot)(j)>0) {
            // t(2,0)/t(2,s)
            ls = ls + "    t("+j+",0)/t("+j+","+*as+")=" + (*aLxzDcx->GetData()->GetCVetBx())(j)/(*aCVetPivot)(j);
         }

         lbox_row->Items->Add(ls);
      }

      lb_row->Caption = "易得枢行r="+(AnsiString)*ar+",枢元素t("+*ar+","+*as+")="+(*aCVetPivot)(*ar)+".";
  }

}
//---------------------------------------------------------------------------
void __fastcall Tfrm_xzDcx_solve::btn_firstClick(TObject *Sender)
{
  if(fILRet->First()) {
     SetGrids(fILRet,fIDcxQ,fIMatJudge,fIs,fICVetPivot,fIr);
     fCurrent = 1;
     gb_cursor->Caption = "当前第"+(AnsiString)fCurrent+"步/共"+IntToStr(fILRet->GetCount())+"步";
  }
}
//---------------------------------------------------------------------------

void __fastcall Tfrm_xzDcx_solve::btn_lastClick(TObject *Sender)
{
  if (fILRet->Last()) {
     SetGrids(fILRet,fIDcxQ,fIMatJudge,fIs,fICVetPivot,fIr);
     fCurrent = fILRet->GetCount();
     gb_cursor->Caption = "当前第"+(AnsiString)fCurrent+"步/共"+IntToStr(fILRet->GetCount())+"步";
  }
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_xzDcx_solve::btn_priorClick(TObject *Sender)
{
   if (!fILRet->IsHead()) {
     fILRet->Prior();
     SetGrids(fILRet,fIDcxQ,fIMatJudge,fIs,fICVetPivot,fIr);
     fCurrent = fCurrent - 1;
     gb_cursor->Caption = "当前第"+(AnsiString)fCurrent+"步/共"+IntToStr(fILRet->GetCount())+"步";
   }
   else
      glb_UserInfo("已经是第一步了,不能再向上一步!");
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_xzDcx_solve::btn_nextClick(TObject *Sender)
{
   if (!fILRet->IsTail()) {
     fILRet->Next();
     SetGrids(fILRet,fIDcxQ,fIMatJudge,fIs,fICVetPivot,fIr);
     fCurrent = fCurrent + 1;
     gb_cursor->Caption = "当前第"+(AnsiString)fCurrent+"步/共"+IntToStr(fILRet->GetCount())+"步";
   }
   else
      glb_UserInfo("已经是最后一步了,不能再向下一步!");
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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