📄 infocaldlg.cpp
字号:
// infocalDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "infocal.h"
#include "infocalDlg.h"
#include ".\infocaldlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
const int LnMat = 30;
int m_N = 0;
int m_M = 0;
int m_MaxoMin = 0;
int index_M = 0;
int cal_flag[40] ={0};
int cal_xb[22]={0};
double cal_zc[40] = {0};
double cal_tzc[40] = {0};
double cal_matrix[40][LnMat] = {0};
double cal_mrelt[22] = {0};
// CinfocalDlg 对话框
CinfocalDlg::CinfocalDlg(CWnd* pParent /*=NULL*/)
: CDialog(CinfocalDlg::IDD, pParent)
, v_zx1(0)
, v_zx2(0)
, v_zx3(0)
, v_zx4(0)
, v_zx5(0)
, v_zx6(0)
, v_zx7(0)
, v_zx8(0)
, v_zx9(0)
, v_zx10(0)
, v_cx1(0)
, v_cx2(0)
, v_cx3(0)
, v_cx4(0)
, v_cx5(0)
, v_cx6(0)
, v_cx7(0)
, v_cx8(0)
, v_cx9(0)
, v_cx10(0)
, v_cp(0)
, v_Res(0)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CinfocalDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO_ChooseN, combo_n);
DDX_Control(pDX, IDC_COMBO_ChooseType, combo_type);
DDX_Control(pDX, IDC_EDIT_Zx1, edit_zx1);
DDX_Control(pDX, IDC_EDIT_Zx2, edit_zx2);
DDX_Control(pDX, IDC_EDIT_Zx3, edit_zx3);
DDX_Control(pDX, IDC_EDIT_Zx4, edit_zx4);
DDX_Control(pDX, IDC_EDIT_Zx5, edit_zx5);
DDX_Control(pDX, IDC_EDIT_Zx6, edit_zx6);
DDX_Control(pDX, IDC_EDIT_Zx7, edit_zx7);
DDX_Control(pDX, IDC_EDIT_Zx8, edit_zx8);
DDX_Control(pDX, IDC_EDIT_Zx9, edit_zx9);
DDX_Control(pDX, IDC_EDIT_Zx10, edit_zx10);
DDX_Text(pDX, IDC_EDIT_Zx1, v_zx1);
DDX_Text(pDX, IDC_EDIT_Zx2, v_zx2);
DDX_Text(pDX, IDC_EDIT_Zx3, v_zx3);
DDX_Text(pDX, IDC_EDIT_Zx4, v_zx4);
DDX_Text(pDX, IDC_EDIT_Zx5, v_zx5);
DDX_Text(pDX, IDC_EDIT_Zx6, v_zx6);
DDX_Text(pDX, IDC_EDIT_Zx7, v_zx7);
DDX_Text(pDX, IDC_EDIT_Zx8, v_zx8);
DDX_Text(pDX, IDC_EDIT_Zx9, v_zx9);
DDX_Text(pDX, IDC_EDIT_Zx10, v_zx10);
DDX_Control(pDX, IDC_COMBO_ChoosM, combo_m);
DDX_Control(pDX, IDC_BUTTON_LCN, button_lcn);
DDX_Control(pDX, IDC_EDIT_Cx1, edit_cx1);
DDX_Control(pDX, IDC_EDIT_Cx2, edit_cx2);
DDX_Control(pDX, IDC_EDIT_Cx3, edit_cx3);
DDX_Control(pDX, IDC_EDIT_Cx4, edit_cx4);
DDX_Control(pDX, IDC_EDIT_Cx5, edit_cx5);
DDX_Control(pDX, IDC_EDIT_Cx6, edit_cx6);
DDX_Control(pDX, IDC_EDIT_Cx7, edit_cx7);
DDX_Control(pDX, IDC_EDIT_Cx8, edit_cx8);
DDX_Control(pDX, IDC_EDIT_Cx9, edit_cx9);
DDX_Control(pDX, IDC_EDIT_Cx10, edit_cx10);
DDX_Text(pDX, IDC_EDIT_Cx1, v_cx1);
DDX_Text(pDX, IDC_EDIT_Cx2, v_cx2);
DDX_Text(pDX, IDC_EDIT_Cx3, v_cx3);
DDX_Text(pDX, IDC_EDIT_Cx4, v_cx4);
DDX_Text(pDX, IDC_EDIT_Cx5, v_cx5);
DDX_Text(pDX, IDC_EDIT_Cx6, v_cx6);
DDX_Text(pDX, IDC_EDIT_Cx7, v_cx7);
DDX_Text(pDX, IDC_EDIT_Cx8, v_cx8);
DDX_Text(pDX, IDC_EDIT_Cx9, v_cx9);
DDX_Text(pDX, IDC_EDIT_Cx10, v_cx10);
DDX_Control(pDX, IDC_COMBO_Relt, combo_relt);
DDX_Text(pDX, IDC_EDIT_CP, v_cp);
DDX_Control(pDX, IDC_EDIT_CP, edit_cp);
DDX_Control(pDX, IDC_BUTTON_LCM, button_lcm);
DDX_Text(pDX, IDC_EDIT_Result, v_Res);
DDX_Control(pDX, IDC_BUTTON_RTC, button_result);
DDX_Control(pDX, IDC_EDIT_Result, edit_result);
DDX_Control(pDX, IDC_STATIC_ShowType, m_stype);
DDX_Control(pDX, IDC_STATIC_Mcur, m_mcur);
}
BEGIN_MESSAGE_MAP(CinfocalDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_CBN_SELCHANGE(IDC_COMBO_ChooseN, OnCbnSelchangeComboChoosen)
ON_CBN_SELCHANGE(IDC_COMBO_ChooseType, OnCbnSelchangeComboChoosetype)
ON_EN_CHANGE(IDC_EDIT_Zx1, OnEnChangeEditZx1)
ON_EN_CHANGE(IDC_EDIT_Zx2, OnEnChangeEditZx2)
ON_EN_CHANGE(IDC_EDIT_Zx3, OnEnChangeEditZx3)
ON_EN_CHANGE(IDC_EDIT_Zx4, OnEnChangeEditZx4)
ON_EN_CHANGE(IDC_EDIT_Zx5, OnEnChangeEditZx5)
ON_EN_CHANGE(IDC_EDIT_Zx6, OnEnChangeEditZx6)
ON_EN_CHANGE(IDC_EDIT_Zx7, OnEnChangeEditZx7)
ON_EN_CHANGE(IDC_EDIT_Zx8, OnEnChangeEditZx8)
ON_EN_CHANGE(IDC_EDIT_Zx9, OnEnChangeEditZx9)
ON_EN_CHANGE(IDC_EDIT_Zx10, OnEnChangeEditZx10)
ON_CBN_SELCHANGE(IDC_COMBO_ChoosM, OnCbnSelchangeComboChoosm)
ON_BN_CLICKED(IDC_BUTTON_LCN, OnBnClickedButtonLcn)
ON_CBN_SELCHANGE(IDC_COMBO_Relt, OnCbnSelchangeComboRelt)
ON_BN_CLICKED(IDC_BUTTON_LCM, OnBnClickedButtonLcm)
ON_EN_CHANGE(IDC_EDIT_Cx1, OnEnChangeEditCx1)
ON_EN_CHANGE(IDC_EDIT_Cx2, OnEnChangeEditCx2)
ON_EN_CHANGE(IDC_EDIT_Cx3, OnEnChangeEditCx3)
ON_EN_CHANGE(IDC_EDIT_Cx4, OnEnChangeEditCx4)
ON_EN_CHANGE(IDC_EDIT_Cx5, OnEnChangeEditCx5)
ON_EN_CHANGE(IDC_EDIT_Cx6, OnEnChangeEditCx6)
ON_EN_CHANGE(IDC_EDIT_Cx7, OnEnChangeEditCx7)
ON_EN_CHANGE(IDC_EDIT_Cx8, OnEnChangeEditCx8)
ON_EN_CHANGE(IDC_EDIT_Cx9, OnEnChangeEditCx9)
ON_EN_CHANGE(IDC_EDIT_Cx10, OnEnChangeEditCx10)
ON_EN_CHANGE(IDC_EDIT_CP, OnEnChangeEditCp)
ON_BN_CLICKED(IDC_BUTTON_RTC, OnBnClickedButtonRtc)
END_MESSAGE_MAP()
// CinfocalDlg 消息处理程序
BOOL CinfocalDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CinfocalDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CinfocalDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CinfocalDlg::OnCbnSelchangeComboChoosen()
{
m_N = combo_n.GetCurSel();
m_N += 2;
combo_m.EnableWindow(0);
{
edit_zx1.EnableWindow(1);
edit_zx2.EnableWindow(1);
edit_zx3.EnableWindow(1);
edit_zx4.EnableWindow(1);
edit_zx5.EnableWindow(1);
edit_zx6.EnableWindow(1);
edit_zx7.EnableWindow(1);
edit_zx8.EnableWindow(1);
edit_zx9.EnableWindow(1);
edit_zx10.EnableWindow(1);
}
switch (m_N + 1)
{
case 1 : edit_zx1.EnableWindow(0);
case 2 : edit_zx2.EnableWindow(0);
case 3 : edit_zx3.EnableWindow(0);
case 4 : edit_zx4.EnableWindow(0);
case 5 : edit_zx5.EnableWindow(0);
case 6 : edit_zx6.EnableWindow(0);
case 7 : edit_zx7.EnableWindow(0);
case 8 : edit_zx8.EnableWindow(0);
case 9 : edit_zx9.EnableWindow(0);
case 10 : edit_zx10.EnableWindow(0);
}
if (m_MaxoMin == 0)
{
combo_type.SetCurSel(0);
m_stype.SetWindowText("Max");
m_MaxoMin = 1;
}
button_lcn.EnableWindow(1);
edit_result.EnableWindow(0);
}
void CinfocalDlg::OnCbnSelchangeComboChoosetype()
{
m_MaxoMin = combo_type.GetCurSel();
m_MaxoMin *= -2;
m_MaxoMin += 1;
CString str;
combo_type.GetLBText(combo_type.GetCurSel(), str);
m_stype.SetWindowText(str);
}
void CinfocalDlg::OnEnChangeEditZx1()
{
UpdateData(TRUE);
cal_zc[1] = v_zx1;
}
void CinfocalDlg::OnEnChangeEditZx2()
{
UpdateData(TRUE);
cal_zc[2] = v_zx2;
}
void CinfocalDlg::OnEnChangeEditZx3()
{
UpdateData(TRUE);
cal_zc[3] = v_zx3;
}
void CinfocalDlg::OnEnChangeEditZx4()
{
UpdateData(TRUE);
cal_zc[4] = v_zx4;
}
void CinfocalDlg::OnEnChangeEditZx5()
{
UpdateData(TRUE);
cal_zc[5] = v_zx5;
}
void CinfocalDlg::OnEnChangeEditZx6()
{
UpdateData(TRUE);
cal_zc[6] = v_zx6;
}
void CinfocalDlg::OnEnChangeEditZx7()
{
UpdateData(TRUE);
cal_zc[7] = v_zx7;
}
void CinfocalDlg::OnEnChangeEditZx8()
{
UpdateData(TRUE);
cal_zc[8] = v_zx8;
}
void CinfocalDlg::OnEnChangeEditZx9()
{
UpdateData(TRUE);
cal_zc[9] = v_zx9;
}
void CinfocalDlg::OnEnChangeEditZx10()
{
UpdateData(TRUE);
cal_zc[10] = v_zx10;
}
void CinfocalDlg::OnCbnSelchangeComboChoosm()
{
m_M = combo_m.GetCurSel();
m_M ++;
combo_relt.EnableWindow(1);
edit_cp.EnableWindow(1);
CString str;
str.Format("%d",m_M);
m_mcur.SetWindowText("1 / " + str);
index_M = 1;
button_lcm.EnableWindow(1);
}
void CinfocalDlg::OnBnClickedButtonLcn()
{
if (m_N)
{
{
edit_cx1.EnableWindow(1);
edit_cx2.EnableWindow(1);
edit_cx3.EnableWindow(1);
edit_cx4.EnableWindow(1);
edit_cx5.EnableWindow(1);
edit_cx6.EnableWindow(1);
edit_cx7.EnableWindow(1);
edit_cx8.EnableWindow(1);
edit_cx9.EnableWindow(1);
edit_cx10.EnableWindow(1);
}
switch (m_N + 1)
{
case 1 : edit_cx1.EnableWindow(0);
case 2 : edit_cx2.EnableWindow(0);
case 3 : edit_cx3.EnableWindow(0);
case 4 : edit_cx4.EnableWindow(0);
case 5 : edit_cx5.EnableWindow(0);
case 6 : edit_cx6.EnableWindow(0);
case 7 : edit_cx7.EnableWindow(0);
case 8 : edit_cx8.EnableWindow(0);
case 9 : edit_cx9.EnableWindow(0);
case 10 : edit_cx10.EnableWindow(0);
}
combo_m.EnableWindow(1);
combo_m.SetCurSel(-1);
m_M = 0;
}
}
void CinfocalDlg::OnCbnSelchangeComboRelt()
{
cal_mrelt[index_M] = combo_relt.GetCurSel() - 1;
}
void CinfocalDlg::OnBnClickedButtonLcm()
{
index_M ++;
if (index_M > m_M)
{
button_result.EnableWindow(1);
}
else
{
CString str1,str2;
str1.Format("%d",index_M);
str2.Format("%d",m_M);
m_mcur.SetWindowText(str1 + " / " + str2);
{
v_cx1 = 0;
v_cx2 = 0;
v_cx3 = 0;
v_cx4 = 0;
v_cx5 = 0;
v_cx6 = 0;
v_cx7 = 0;
v_cx8 = 0;
v_cx9 = 0;
v_cx10 = 0;
v_cp =0;
UpdateData(0);
combo_relt.SetCurSel(-1);
}
}
}
void CinfocalDlg::OnEnChangeEditCx1()
{
UpdateData(TRUE);
cal_matrix[index_M][1] = v_cx1;
}
void CinfocalDlg::OnEnChangeEditCx2()
{
UpdateData(TRUE);
cal_matrix[index_M][2] = v_cx2;
}
void CinfocalDlg::OnEnChangeEditCx3()
{
UpdateData(TRUE);
cal_matrix[index_M][3] = v_cx3;
}
void CinfocalDlg::OnEnChangeEditCx4()
{
UpdateData(TRUE);
cal_matrix[index_M][4] = v_cx4;
}
void CinfocalDlg::OnEnChangeEditCx5()
{
UpdateData(TRUE);
cal_matrix[index_M][5] = v_cx5;
}
void CinfocalDlg::OnEnChangeEditCx6()
{
UpdateData(TRUE);
cal_matrix[index_M][6] = v_cx6;
}
void CinfocalDlg::OnEnChangeEditCx7()
{
UpdateData(TRUE);
cal_matrix[index_M][7] = v_cx7;
}
void CinfocalDlg::OnEnChangeEditCx8()
{
UpdateData(TRUE);
cal_matrix[index_M][8] = v_cx8;
}
void CinfocalDlg::OnEnChangeEditCx9()
{
UpdateData(TRUE);
cal_matrix[index_M][9] = v_cx9;
}
void CinfocalDlg::OnEnChangeEditCx10()
{
UpdateData(TRUE);
cal_matrix[index_M][10] = v_cx10;
}
void CinfocalDlg::OnEnChangeEditCp()
{
UpdateData(TRUE);
cal_matrix[index_M][0] = v_cp;
}
void CinfocalDlg::OnBnClickedButtonRtc()
{
FILE *out = fopen("out.txt","w");
fprintf(out,"Max Z = %.5lf",m_MaxoMin * cal_zc[1]);
for (int i = 2;i <= m_N;i ++)
fprintf(out," + %.5lf",m_MaxoMin * cal_zc[i]);
fprintf(out,"\n\n");
for (int i = 1;i <= m_M;i ++)
{
fprintf(out,"%.5lf",cal_matrix[i][1]);
for (int j = 2;j <= m_N; j ++)
fprintf(out," + %.5lf",cal_matrix[i][j]);
if (cal_mrelt[i] == -1) fprintf(out," <= ");
if (cal_mrelt[i] == 0) fprintf(out," == ");
if (cal_mrelt[i] == 1) fprintf(out," >= ");
fprintf(out,"%.5lf",cal_matrix[i][0]);
fprintf(out,"\n");
}
// Output to the file
//
for (int i = 1;i <= m_N; i ++)
cal_zc[i] *= m_MaxoMin;
for (int i = 1; i <= m_M; i++)
{
if (cal_matrix[i][0] < 0)
{
for (int j = 1;j <= m_N; j ++)
{
cal_matrix[i][j] *= -1;
}
cal_mrelt[i] *= -1;
}
}
int m_Nt = m_N;
//for (int i = 1; i <= m_N; i ++)
// cal_tzc[i] = 0;
int vtem = 0;
int vman = 0;
for (int i = 1; i <= m_M; i ++)
{
if (cal_mrelt[i] == -1)
{
cal_tzc[++ m_Nt] = 0;
cal_matrix[i][m_Nt] = 1;
cal_zc[m_Nt] = 0;
cal_xb[++vtem] = m_Nt;
}else
if (cal_mrelt[i] == 0)
{
cal_tzc[++ m_Nt] = -1;
cal_matrix[i][m_Nt] = 1;
cal_zc[m_Nt] = 0;
cal_xb[++vtem] = m_Nt;
cal_flag[m_Nt] = 1;
vman ++;
}else
if (cal_mrelt[i] == 1)
{
cal_tzc[++ m_Nt] = 0;
cal_matrix[i][m_Nt] = -1;
cal_zc[m_Nt] = 0;
cal_tzc[++ m_Nt] = -1;
cal_matrix[i][m_Nt] = 1;
cal_zc[m_Nt] = 0;
cal_xb[++vtem] = m_Nt;
cal_flag[m_Nt] = 1;
vman ++;
}
}
if (vman)
cal_max(cal_matrix,m_Nt,m_M,cal_xb,cal_tzc,-1);
//move off the manual varibles:
//m_Nt -= vman;
//
v_Res = -1 * m_MaxoMin * cal_max(cal_matrix,m_Nt,m_M,cal_xb,cal_zc,1);
edit_result.EnableWindow(1);
//v_Res = vresult;
UpdateData(0);
fprintf(out,"\n\nWhen \n");
for (int i = 1;i <= m_M; i ++)
{
fprintf(out,"X%d = %.5lf ",cal_xb[i],cal_matrix[i][0]);
}
fprintf(out,"\n");
fprintf(out,"The target varible get Z = %.5lf", v_Res);
// destory;
// memset();
//
memset(cal_matrix,0,sizeof(cal_matrix));
memset(cal_xb,0,sizeof(cal_xb));
memset(cal_zc,0,sizeof(cal_zc));
memset(cal_tzc,0,sizeof(cal_tzc));
memset(cal_flag,0,sizeof(cal_flag));
memset(cal_mrelt,0,sizeof(cal_mrelt));
m_MaxoMin = 0;
}
double CinfocalDlg::cal_max(double mat[][LnMat],int n,int m,int xb[],double c[],int f)
{
double z[LnMat] ={0};
int r,s;
double tmax,tmin;
while (1)
{
// calculate -z
for (int i = 0;i <= n; i ++) if (cal_flag[i] != f)
{
z[i] = c[i];
for (int j = 1; j <= m ;j ++)
z[i] -= mat[j][i] * c[xb[j]];
}
//find the import varible
// with Theorem Bland
// the first maximal -z
tmax = 0;
for (int i = 1;i<=n;i++) if (cal_flag[i] != f)
if (z[i]>tmax)
{
r=i;
tmax=z[i];
}
if (tmax == 0)
break;
//
tmin = 1e99;
for (int j=1;j<=m;j++)
if (mat[j][r] > 0 && mat[j][0]/mat[j][r]<tmin ||
(mat[j][0]/mat[j][r] == tmin && xb[j]<xb[s]))
{
s = j;
tmin = mat[j][0]/mat[j][r];
}
//
for (int i=0;i<=n;i++)
if (i != r)
if (cal_flag[i] != f)
mat[s][i]/=mat[s][r];
mat[s][r] = 1;
for (int j=1;j<=m;j++)
if (j != s)
{
for (int i=0;i<=n;i++)
if (i != r)
if (cal_flag[i] != f)
{
mat[j][i] -= mat[j][r] * mat[s][i];
}
mat[j][r] = 0;
}
xb[s] = r;
}
return z[0];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -