📄 powersearchview.cpp
字号:
// PowerSearchView.cpp : implementation of the CPowerSearchView class
//
#include "stdafx.h"
#include "PowerSearch.h"
#include "PowerSearchSet.h"
#include "PowerSearchDoc.h"
#include "PowerSearchView.h"
#include "BusRecord.h"
#include "NodeRecord.h"
#include "malloc.h"
#include "DlgEnrollBus.h"
//#include "engine.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPowerSearchView
IMPLEMENT_DYNCREATE(CPowerSearchView, CRecordView)
BEGIN_MESSAGE_MAP(CPowerSearchView, CRecordView)
//{{AFX_MSG_MAP(CPowerSearchView)
ON_BN_CLICKED(IDC_StartPoint, OnStartPoint)
ON_BN_CLICKED(IDC_Show, OnShow)
ON_BN_CLICKED(IDC_StepOne, OnStepOne)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPowerSearchView construction/destruction
CPowerSearchView::CPowerSearchView()
: CRecordView(CPowerSearchView::IDD)
{
//{{AFX_DATA_INIT(CPowerSearchView)
m_pSet = NULL;
m_startpoint =1 ;
m_depth = 5;
m_num = 0;
m_percent = 0.0f;
//}}AFX_DATA_INIT
// TODO: add construction code here
}
CPowerSearchView::~CPowerSearchView()
{
}
void CPowerSearchView::DoDataExchange(CDataExchange* pDX)
{
CRecordView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPowerSearchView)
DDX_Control(pDX, IDC_LIST1, m_showlist);
DDX_Text(pDX, IDC_EDIT1, m_startpoint);
DDX_Text(pDX, IDC_EDIT2, m_depth);
DDV_MinMaxInt(pDX, m_depth, 2, 6);
DDX_Text(pDX, IDC_EDIT3, m_num);
DDX_Text(pDX, IDC_EDIT5, m_percent);
//}}AFX_DATA_MAP
}
BOOL CPowerSearchView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CRecordView::PreCreateWindow(cs);
}
void CPowerSearchView::OnInitialUpdate()
{
m_pSet = &GetDocument()->m_powerSearchSet;
CRecordView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
m_showlist.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_showlist.InsertColumn(0,"厂站1");
m_showlist.SetColumnWidth(0,75);
m_showlist.InsertColumn(1,"厂站2");
m_showlist.SetColumnWidth(1,75);
m_showlist.InsertColumn(2,"厂站3");
m_showlist.SetColumnWidth(2,75);
m_showlist.InsertColumn(3,"厂站4");
m_showlist.SetColumnWidth(3,75);
m_showlist.InsertColumn(4,"厂站5");
m_showlist.SetColumnWidth(4,75);
m_showlist.InsertColumn(5,"厂站6");
m_showlist.SetColumnWidth(5,75);
m_showlist.InsertColumn(6,"厂站7");
m_showlist.SetColumnWidth(6,75);
m_showlist.InsertColumn(7,"厂站8");
m_showlist.SetColumnWidth(7,75);
m_showlist.InsertColumn(8,"厂站9");
m_showlist.SetColumnWidth(8,75);
m_showlist.InsertColumn(9,"厂站10");
m_showlist.SetColumnWidth(9,75);
}
/////////////////////////////////////////////////////////////////////////////
// CPowerSearchView printing
BOOL CPowerSearchView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CPowerSearchView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CPowerSearchView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CPowerSearchView diagnostics
#ifdef _DEBUG
void CPowerSearchView::AssertValid() const
{
CRecordView::AssertValid();
}
void CPowerSearchView::Dump(CDumpContext& dc) const
{
CRecordView::Dump(dc);
}
CPowerSearchDoc* CPowerSearchView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPowerSearchDoc)));
return (CPowerSearchDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CPowerSearchView database support
CRecordset* CPowerSearchView::OnGetRecordset()
{
return m_pSet;
}
/////////////////////////////////////////////////////////////////////////////
// CPowerSearchView message handlers
struct resultnode
{
int road[100];
struct resultnode *next;
};
void CPowerSearchView::OnStartPoint()
{
struct resultnode *head;
struct resultnode *p1,*p2;
p1=(struct resultnode *)malloc(sizeof(struct resultnode));
head=p1;
CBusRecord m_busset;
CNodeRecord m_nodeset;
int a[200][100];
int i=0;
int j=0;
int k;
int m;
int node=0;
int h=0;
int w=0;
int count=0;
int visit[50]={0};
UpdateData(TRUE);
m_busset.Open();
m_nodeset.Open();
m_nodeset.MoveFirst();
while((!m_nodeset.IsEOF())&&(m_nodeset.m_column2!=m_startpoint))
{
m_nodeset.MoveNext();
}
if(m_nodeset.m_column4==0)
{
AfxMessageBox("此节点不是电厂,请重新输入!");
goto A;
}
if(m_nodeset.IsEOF())
{
AfxMessageBox("无此节点,请重新输入!");
goto A;
}
a[i][j]=m_startpoint;
a[i+1][j]=100;
visit[a[0][0]]=1;
m_busset.MoveFirst();
m_nodeset.MoveFirst();
for(count=0;count<m_depth-1;count++)//循环次数
{
while(a[i][j]!=100)
{
int start=a[i][j];
m_busset.MoveFirst();
while((m_busset.m_column2!=start)&&(!m_busset.IsEOF()))
{
m_busset.MoveNext();
}
while((m_busset.m_column2==start)&&(!m_busset.IsEOF()))
{
if((visit[m_busset.m_column3]==1)) goto B;
m_nodeset.MoveFirst();
while((m_nodeset.m_column2!=m_busset.m_column3)&&(!m_nodeset.IsEOF()))
{
m_nodeset.MoveNext();
}
if(m_nodeset.m_column4==1)
{ //添加数据
for(int n=0;n<=j;n++)
p1->road[n]=a[i][n];//添加数组数据
p1->road[n]=m_nodeset.m_column2;//添加表数据
//visit[m_nodeset.m_column2]=1;
node++;
//建立接点
p2=(struct resultnode *)malloc(sizeof(struct resultnode));
p1->next=p2;
p1=p2;
}
else
{
k=i;
while(a[k][j]>0)
{
k++;
}
for(m=0;m<=j;m++) a[k][m]=a[i][m];
a[k][m]=m_nodeset.m_column2;
}
B: m_busset.MoveNext();
}
i++;
}
a[k+1][m]=100;
i++;
j++;
}
//列表显示
struct resultnode *p;
m_showlist.DeleteAllItems();
p=head;
w=0;
if(node==0) AfxMessageBox("无可行方案!");
else
{
for(h=0;(h<node)&&(p->next!=NULL);h++)
{
CString s;
m_nodeset.MoveFirst();
while((m_nodeset.m_column2!=p->road[0])&&(!m_nodeset.IsEOF()))
{
m_nodeset.MoveNext();
}
s=m_nodeset.m_column3;
m_showlist.InsertItem(w,s,0);
int i=1;
while(p->road[i]>0)
{ m_nodeset.MoveFirst();
while((m_nodeset.m_column2!=p->road[i])&&(!m_nodeset.IsEOF()))
{
m_nodeset.MoveNext();
}
s=m_nodeset.m_column3;
m_showlist.SetItemText(w,i,s);
i++;
}
w++;
p=p->next;
}
}
A: m_num=w;
m_nodeset.MoveFirst();
float generatornum=0;
while(!m_nodeset.IsEOF())
{
if(m_nodeset.m_column4==1) generatornum++;
m_nodeset.MoveNext();
}
m_percent=((float)(w)/(generatornum-1))*100;
if(m_percent>100) m_percent=100;
UpdateData(FALSE);
}
void CPowerSearchView::OnButton1()
{
}
void CPowerSearchView::OnShow()
{
/*#include "engine.h"
Engine *ep=engOpen(NULL);
CString command;
//从vc传数据给matlab
//mxArray *data=mxCreateNumericMatrix(height,wide,mxUINT8_CLASS,mxREAL);
//memcpy((BYTE *)(mxGetPr(data)),(BYTE *)p_data,wide*height);
//engPutVariable(ep,"data",data);
//engEvalString(ep,"data=rot90(data)");
//执行matlab
engEvalString(ep,"open_system('overvoltage')");
engEvalString(ep,"set_param('overvoltage/A','Amplitude','110e3')");
engEvalString(ep,"set_param('overvoltage/B','Amplitude','110e3')");
engEvalString(ep,"set_param('overvoltage/C','Amplitude','110e3')");
engEvalString(ep,"set_param('overvoltage/Distributed Parameters Line','Length','300')");
engEvalString(ep,"[t,x,y]=sim('overvoltagenew')");
engEvalString(ep,"save_system('overvoltage')");
//engEvalString(ep,"plot(t,y)");
/*
[amax,index]=max(max(x(:,4:6)));
[amax,index1]=max(x(:,(3+index)) );
tmax=t(index1)
*/
//从matlab传回数据vc
//mxArray *T=engGetVariable(ep,"data");
//memcpy((BYTE *)p_data,(BYTE *)mxGetPr(T),wide*height);
//执行VC
}
void CPowerSearchView::OnStepOne()
{
float A[5][5]=
{ 1 , 1.0/2 , 4 , 3 , 3,
2 , 1 , 7 , 5 , 5,
1.0/4, 1.0/7, 1, 1.0/2,1.0/3,
1.0/3, 1.0/5, 2, 1, 1,
1.0/3, 1.0/5, 3, 1, 1
};
float B[5][3][3]=
{
{ 1 , 2 , 5,
1.0/2 , 1 , 2,
1.0/5 , 1.0/2, 1
},{
1 ,1.0/3 ,1.0/8,
3 ,1 ,1.0/3,
8 ,3 ,1
}, {
1 ,1 ,3,
1 ,1 ,3,
1.0/3 ,1.0/3 ,1
},{
1,3,4,1.0/3,1,1,1.0/4,1,1
},{
1,1,1.0/4,1,1,1.0/4,4,4,1
}
};
int i,j,k,m=5,n=5,m1=3,n1=3;
float sum=0;
float w[5],W2[3][5],W[3];
float A_change[5][5];
float B_change[5][3][3];
//对判断矩阵做列向量归一化处理
for(j=0;j<n;j++)
{
sum=0;
for(i=0;i<m;i++)
{
sum=sum+ A[i][j];
}
for(i=0;i<m;i++)
{
A_change[i][j]=A[i][j]/sum;
}
}
//求判断矩阵的特征向量w
sum=0;
for(i=0;i<m;i++)
{
w[i]=0;
for(j=0;j<n;j++)
{
w[i]=w[i]+A_change[i][j];
}
sum=sum+w[i];
}
for(i=0;i<m;i++)
w[i]=w[i]/sum;
//求下层的特征向量构成的矩阵W2
//同上,先归一化,再求特征向量
for(k=0;k<n;k++)
{
for(j=0;j<n1;j++)
{
sum=0;
for(i=0;i<m1;i++)
{
sum=sum+B[k][i][j];
}
for(i=0;i<m1;i++)
{
B_change[k][i][j]=B[k][i][j]/sum;
}
}
}
for(k=0;k<n;k++)
{
sum=0;
for(i=0;i<m1;i++)
{
W2[i][k]=0;
for(j=0;j<n1;j++)
{
W2[i][k]=W2[i][k]+B_change[k][i][j];
}
sum=sum+W2[i][k];
}
for(i=0;i<m1;i++)
W2[i][k]=W2[i][k]/sum;
}
//评估各方案的优劣,用向量W表示
sum=0;
for(i=0;i<m1;i++)
{
W[i]=0;
for(j=0;j<n;j++)
{
W[i]=W[i]+W2[i][j]*w[j];
}
sum=sum+W[i];
}
for(i=0;i<m1;i++)
{
W[i]=W[i]/sum;
//printf(" Evaluation of plan %d : %f \n",i+1,W[i]);
}
//printf("\n");
//getchar();
//对各矩阵的一致性进行评价
//先求判断矩阵的特征值
float lamdaA=0,lamdaB[5];
float Aw[5],Bw[3];
for(i=0;i<m;i++)
{
Aw[i]=0;
for(j=0;j<n;j++)
{
Aw[i]=Aw[i]+A[i][j]*w[j];
}
lamdaA=lamdaA+Aw[i]/w[i]/m;
}
//printf("lamdaA=%1.3f \n",lamdaA);
for(k=0;k<m;k++)
{
sum=0;
lamdaB[k]=0;
for(i=0;i<m1;i++)
{
Bw[i]=0;
for(j=0;j<n1;j++)
{
Bw[i]=Bw[i]+B[k][i][j]*W2[j][k];
}
lamdaB[k]=lamdaB[k]+Bw[i]/W2[i][k]/m1;
}
//printf("lamdaB[%d]=%1.3f \n",k,lamdaB[k]);
}
//printf("\n");
//再求一致性指标CI和一致性比率CR; RI为随机一致性指标
float RI[12]={0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45,1.49,1.51};
float CIA,CRA,CIB[5],CRB[5],CR1,CR2=0,CR;
CIA=(lamdaA-m)/(m-1);
CRA=CIA/RI[m-1];
CR1=CRA;
for(k=0;k<5;k++)
{
CIB[k]=(lamdaB[k]-m1)/(m1-1);
CRB[k]=CIB[k]/RI[m1-1];
CR2=CRB[k]*w[k]+CR2;
}
CR=CR1+CR2;
//printf("the value of CR is :%1.3f \n",CR);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -