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

📄 main.cpp

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

#include "Main.h"
#include "about.h"
#include "reset.h"
#include "global.h"
#include "Matrix.h"
#include "MatrixOp.h"
#include "xzDcx_solve.h"
#include "xzDcx_display.h"
#include "xzDcx_Inputx.h"
#include "vcl/inifiles.hpp"

#include <shellapi.h>
//---------------------------------------------------------------------------
#pragma link "Grids"
#pragma resource "*.dfm"
Tfrm_main *frm_main;

//---------------------------------------------------------------------------
__fastcall Tfrm_main::Tfrm_main(TComponent* Owner)
	: TForm(Owner)
{
   //默认的维数
   fRowCount = ROWCOUNT;
   fColCount = COLCOUNT;

   fDcxQ = new TDcxQuestion(fRowCount,fColCount);
   fRuleDcxQ = new TDcxQuestion(fRowCount,fColCount);              //规范型线性规划问题
   fAssistantDcxQ = new TDcxQuestion(fRowCount,fColCount);         //辅助线性规划问题

   fMatTranForm = new TMatrix(fRowCount,fColCount); //从规范型问题到原问题的变换矩阵

   fIxzDcxChannel = new TxzDcxChannel;   //修正单纯型算法通道(第一阶段)
   fIIxzDcxChannel = new TxzDcxChannel;  //修正单纯型算法通道(第二阶段)
   fILResult = new KTList<TxzDcx*>;
   fIILResult = new KTList<TxzDcx*>;


   SetGrids();
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_main::FormClose(TObject *Sender, TCloseAction &Action)
{
   delete fDcxQ;
   delete fRuleDcxQ;              //规范型线性规划问题
   delete fAssistantDcxQ;         //辅助线性规划问题
   delete fMatTranForm;           //从规范型问题到原问题的变换矩阵

   //清空原来的数据
   for (fILResult->First();!fILResult->IsEof();fILResult->Next())
      delete fILResult->GetData();
   for (fIILResult->First();!fIILResult->IsEof();fIILResult->Next())
      delete fIILResult->GetData();

   delete fILResult;
   delete fIILResult;

   delete fIxzDcxChannel;   //修正单纯型算法通道(第一阶段)
   delete fIIxzDcxChannel;  //修正单纯型算法通道(第二阶段)
}
//---------------------------------------------------------------------------
//根据维数[fRowCount,fColCount]重新设置数据
void Tfrm_main::ResetData()
{
   fDcxQ->Reset(fRowCount,fColCount);
}
//---------------------------------------------------------------------------
//根据字符串珊格得到数据
bool Tfrm_main::GetData()
{
   int i;

   //系数矩阵
   if (!glb_GetData(fDcxQ->mMatA,sg_A,"A"))
      return false;

   //标号集I
   for (i=1;i<sg_I->RowCount;i++) {
      if (sg_I->Cells[1][i] == ">=")
         (*fDcxQ->mCVetI)(i) = 1;
      else if (sg_I->Cells[1][i] == "<=")
         (*fDcxQ->mCVetI)(i) = -1;
      else if (sg_I->Cells[1][i] == "=")
         (*fDcxQ->mCVetI)(i) = 0;
      else {
         glb_UserInfo("标号集I的数据元素I["+IntToStr(i)+"]不合法,必须为'='或者'>='或者'<='!");
         return false;
      }
   }

   //条件向量b
   if (!glb_GetCVetData(fDcxQ->mCVetb,sg_b,true,"b"))
      return false;

   //费用向量~c
   if (!glb_GetCVetData(fDcxQ->mCVetc,sg_c,false,"c"))
      return false;

   //符号约束sign
   for (i=1;i<sg_sign->ColCount;i++) {
      if (sg_sign->Cells[i][1] == ">=")
         (*fDcxQ->mCVetsign)(i) = 0;
      else if (sg_sign->Cells[i][1] == "")
         (*fDcxQ->mCVetsign)(i) = 1;
      else {
         glb_UserInfo("符号约束sign的数据元素sign["+IntToStr(i)+"]不合法,必须为空或者'>='!");
         return false;
      }
   }

   return true;
}
//---------------------------------------------------------------------------
//根据数据设置字符串珊格
void Tfrm_main::SetGrids()
{
   int i;

   //系数矩阵
   glb_SetGrid(fDcxQ->mMatA,sg_A);

   //标号集
   sg_I->RowCount = fRowCount + 1;
   sg_I->ColCount = 2;
   sg_I->Cells[0][0] = "("+IntToStr(fRowCount)+")";
   for (i=1;i<sg_I->RowCount;i++) {
      sg_I->Cells[0][i] = IntToStr(i);
      if ((*fDcxQ->mCVetI)(i) == 1)
        sg_I->Cells[1][i] = ">=";
      else if ((*fDcxQ->mCVetI)(i) == -1)
        sg_I->Cells[1][i] = "<=";
      else
        sg_I->Cells[1][i] = "=";
   }

   //条件向量b
   sg_b->RowCount = fRowCount + 1;
   sg_b->ColCount = 2;
   sg_b->Cells[0][0] = "("+IntToStr(fRowCount)+")";
   for (i=1;i<sg_b->RowCount;i++) {
      sg_b->Cells[0][i] = IntToStr(i);
      sg_b->Cells[1][i] = (*fDcxQ->mCVetb)(i);
   }

   //费用向量~c
   sg_c->RowCount = 2;
   sg_c->ColCount = fColCount + 1;
   sg_c->Cells[0][0] = "("+IntToStr(fColCount)+")";
   for (i=1;i<sg_c->ColCount;i++) {
      sg_c->Cells[i][0] = IntToStr(i);
      sg_c->Cells[i][1] = (*fDcxQ->mCVetc)(i);
   }

   //符号约束sign
   sg_sign->RowCount = 2;
   sg_sign->ColCount = fColCount + 1;
   sg_sign->Cells[0][0] = "("+IntToStr(fColCount)+")";
   for (i=1;i<sg_sign->ColCount;i++) {
      sg_sign->Cells[i][0] = IntToStr(i);
      if ((*fDcxQ->mCVetsign)(i) == 0)
        sg_sign->Cells[i][1] = ">=";
      else
        sg_sign->Cells[i][1] = "";
   }
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_main::btn_resetClick(TObject *Sender)
{
   frm_reset->fRowCount = fDcxQ->mMatA->GetRowCount();
   frm_reset->fColCount = fDcxQ->mMatA->GetColCount();
   if (frm_reset->ShowModal() == mrOk) {
       fRowCount = frm_reset->fRowCount;
       fColCount = frm_reset->fColCount;
       ResetData();
       SetGrids();
   }
}
//---------------------------------------------------------------------------

void __fastcall Tfrm_main::btn_MetirxOpClick(TObject *Sender)
{
   //系数矩阵
   if (!glb_GetData(fDcxQ->mMatA,sg_A,"A"))
      return;

   //取得规范型
   fDcxQ->GenRule(fRuleDcxQ,fMatTranForm);

   //拷贝矩阵A
   delete frm_MatrixOp->fMatA;
   frm_MatrixOp->fMatA = new TMatrix(fRuleDcxQ->mMatA->GetRowCount(),fRuleDcxQ->mMatA->GetColCount());
   *frm_MatrixOp->fMatA = *fRuleDcxQ->mMatA;
   glb_SetGrid(frm_MatrixOp->fMatA,frm_MatrixOp->sg_A);
   glb_SetGrid(frm_MatrixOp->fMatB,frm_MatrixOp->sg_B);
   glb_SetGrid(frm_MatrixOp->fMatC,frm_MatrixOp->sg_C);

   frm_MatrixOp->Show();
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_main::btn_xzDcxClick(TObject *Sender)
{
   //先得到数据
   if (!GetData())
      return;

   fdoRule = true;       //是否要变成规范型
   fdoFirst = true;

   if (!fDcxQ->IsRule()) {  //如果不是规范型
      //取得规范型
      fDcxQ->GenRule(fRuleDcxQ,fMatTranForm);
      fdoRule = true;
   }
   else {
      fdoRule = false;       //是否要变成规范型
      //取得规范型
      fDcxQ->GenRule(fRuleDcxQ,fMatTranForm);

      frm_xzDcx_Inputx->fCVetx = new TCVector(fRuleDcxQ->mMatA->GetColCount());
      glb_SetCVetGrid(frm_xzDcx_Inputx->fCVetx,frm_xzDcx_Inputx->sg_x,false);

      if (frm_xzDcx_Inputx->ShowModal() == mrCancel) {
         delete frm_xzDcx_Inputx->fCVetx;
         return;
      }
      delete frm_xzDcx_Inputx->fCVetx;

      if (frm_xzDcx_Inputx->rb_II->Checked) {
         fdoFirst = false;
      }
   }

   //如果是退化问题
   if (fRuleDcxQ->IsDegrade()) {
      glb_UserInfo("该线性规划问题是退化的线性规划问题,此单纯型方法无法求解.");
      return;
   }

   //如果需要进行第一阶段
   if (fdoFirst) {
      fRuleDcxQ->GenAssistant(fAssistantDcxQ);

      //提交数据,执行算法
      (*fIxzDcxChannel)<<(fAssistantDcxQ);

      //取得数据
      (*fIxzDcxChannel)>>fILResult;

      fILResult->Last();

      //如果辅助问题的目标函数值不为0
      if (fILResult->GetData()->GetValz0() != 0) {
         frm_xzDcx_display->Reset(fDcxQ,fRuleDcxQ,fdoRule,fAssistantDcxQ,fdoFirst,false,fILResult,fIILResult,fMatTranForm);
         frm_xzDcx_display->ShowModal();
         return;
      }

     //通过辅助问题取得规范型问题的一个初始基可行解
     //当前最优解
     TCVector lCVetx(fAssistantDcxQ->mCVetx->GetDimCount());
     unsigned int j;
     for (j=1,fILResult->GetData()->GetLB()->First();!fILResult->GetData()->GetLB()->IsEof();fILResult->GetData()->GetLB()->Next(),j++)
        lCVetx(fILResult->GetData()->GetLB()->GetData()) = (*fILResult->GetData()->GetCVetBx())(j);

     for (unsigned int i=1;i<=fRuleDcxQ->mCVetx->GetDimCount();i++)
        (*fRuleDcxQ->mCVetx)(i) = lCVetx(i);

   }

   //从一个初始基可行解求解规范型问题

   (*fIIxzDcxChannel)<<(fRuleDcxQ);    //提交数据,执行算法
   (*fIIxzDcxChannel)>>fIILResult;     //取得数据

    frm_xzDcx_display->Reset(fDcxQ,fRuleDcxQ,fdoRule,fAssistantDcxQ,fdoFirst,true,fILResult,fIILResult,fMatTranForm);

    //显示窗口
    frm_xzDcx_display->ShowModal();

}
//---------------------------------------------------------------------------
//读写文件
void __fastcall Tfrm_main::menu_saveClick(TObject *Sender)
{
   if (!GetData())
      return;

   if (dlg_save->Execute()) {
      TIniFile* lIniF_save = new TIniFile(dlg_save->FileName);

      lIniF_save->WriteString("Dim","RowCount",IntToStr(fRowCount));
      lIniF_save->WriteString("Dim","ColCount",IntToStr(fColCount));

      for (unsigned int i=1;i<=fDcxQ->mMatA->GetRowCount();i++)
         for (unsigned int j=1;j<=fDcxQ->mMatA->GetColCount();j++)
           lIniF_save->WriteString("MatA","MatA["+IntToStr(i)+","+IntToStr(j)+"]",(*fDcxQ->mMatA)(i,j));

      for (unsigned int i=1;i<=fDcxQ->mCVetI->GetDimCount();i++)
        lIniF_save->WriteString("CVetI","CVetI["+IntToStr(i)+"]",(*fDcxQ->mCVetI)(i));
      for (unsigned int i=1;i<=fDcxQ->mCVetb->GetDimCount();i++)
        lIniF_save->WriteString("CVetb","CVetb["+IntToStr(i)+"]",(*fDcxQ->mCVetb)(i));
      for (unsigned int i=1;i<=fDcxQ->mCVetc->GetDimCount();i++)
        lIniF_save->WriteString("CVetc","CVetc["+IntToStr(i)+"]",(*fDcxQ->mCVetc)(i));
      for (unsigned int i=1;i<=fDcxQ->mCVetsign->GetDimCount();i++)
        lIniF_save->WriteString("CVetsign","CVetsign["+IntToStr(i)+"]",(*fDcxQ->mCVetsign)(i));

      delete lIniF_save;  
   }
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_main::menu_openClick(TObject *Sender)
{
   if (dlg_open->Execute()) {
      TIniFile* lIniF_open = new TIniFile(dlg_open->FileName);

      fRowCount = StrToInt(lIniF_open->ReadString("Dim","RowCount", "0"));
      fColCount = StrToInt(lIniF_open->ReadString("Dim","ColCount", "0"));
      ResetData();

      for (unsigned int i=1;i<=fDcxQ->mMatA->GetRowCount();i++)
         for (unsigned int j=1;j<=fDcxQ->mMatA->GetColCount();j++)
          (*fDcxQ->mMatA)(i,j) = lIniF_open->ReadString("MatA","MatA["+IntToStr(i)+","+IntToStr(j)+"]", "0");

      for (unsigned int i=1;i<=fDcxQ->mCVetI->GetDimCount();i++)
        (*fDcxQ->mCVetI)(i) = lIniF_open->ReadString("CVetI","CVetI["+IntToStr(i)+"]", "0");
      for (unsigned int i=1;i<=fDcxQ->mCVetb->GetDimCount();i++)
        (*fDcxQ->mCVetb)(i) = lIniF_open->ReadString("CVetb","CVetb["+IntToStr(i)+"]", "0");
      for (unsigned int i=1;i<=fDcxQ->mCVetc->GetDimCount();i++)
        (*fDcxQ->mCVetc)(i) = lIniF_open->ReadString("CVetc","CVetc["+IntToStr(i)+"]", "0");
      for (unsigned int i=1;i<=fDcxQ->mCVetsign->GetDimCount();i++)
        (*fDcxQ->mCVetsign)(i) = lIniF_open->ReadString("CVetsign","CVetsign["+IntToStr(i)+"]", "0");

      delete lIniF_open;  
   }

   SetGrids();
}
//---------------------------------------------------------------------------

void __fastcall Tfrm_main::menu_exitClick(TObject *Sender)
{
   Close();
}
//---------------------------------------------------------------------------

void __fastcall Tfrm_main::menu_aboutClick(TObject *Sender)
{
   ShellAbout(Handle,"","\n线性规划问题求解(V1.0)\nAll Rights Reverse\n98164236 黄可坤,98164237 黄舒怀.",NULL);
}
//---------------------------------------------------------------------------

void __fastcall Tfrm_main::menu_contentClick(TObject *Sender)
{
   frm_about->ShowModal();
}
//---------------------------------------------------------------------------

void __fastcall Tfrm_main::btn_ruleClick(TObject *Sender)
{
   //先得到数据
   if (!GetData())
      return;

   //取得规范型
   fDcxQ->GenRule(fRuleDcxQ,fMatTranForm);
   fRuleDcxQ->GenAssistant(fAssistantDcxQ);

   //刷新数据
   frm_xzDcx_display->ResetRule(fDcxQ,fRuleDcxQ,fAssistantDcxQ);

   //显示窗口
   frm_xzDcx_display->ShowModal();
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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