📄 xzdcx_solve.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 + -