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