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

📄 infocaldlg.cpp

📁 线性规划问题求解代码 可用于运筹学作业
💻 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 + -