亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? neuronview.cpp

?? 神經(jīng)網(wǎng)絡(luò)中的多層感知器的BP(反向傳播)學(xué)習(xí)算法
?? CPP
字號(hào):
// NeuronView.cpp : implementation file
//

#include "stdafx.h"
#include "xor_learn.h"
#include "NeuronView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define BASE_UNIT 50.0
#define POINT_UNIT 3.0

#define TIMER_ID 0xf0f0f0f0
/////////////////////////////////////////////////////////////////////////////
// CNeuronView

CNeuronView::CNeuronView()
{
    m_bOver = FALSE;
    m_hCursor = AfxGetApp()->LoadStandardCursor(IDC_CROSS);
    m_pWeightsListener = NULL;
    m_pMouseListener = NULL;
    m_pNeuralNetWork = NULL;
    //m_pNeuron = NULL;
    m_uiTimerID = TIMER_ID;
    m_uiTimeout = 1;
    m_iCurrentPoint = -1;
    
    CPointf p;
    int iSize;
    ifstream fin("./pattern/pattern.patt");
    
    if (fin.is_open())
    {
        fin >> iSize;

        m_vecPoint.clear();
        m_vecPointClass.clear();
        m_vecPoint.resize(iSize);
        m_vecPointClass.resize(iSize);

        for (int i = 0; i < iSize; i++)
        {   
            fin >> m_vecPoint[i].x >> m_vecPoint[i].y >> m_vecPointClass[i];
        }
    }
}

CNeuronView::~CNeuronView()
{

}


BEGIN_MESSAGE_MAP(CNeuronView, CStatic)
	//{{AFX_MSG_MAP(CNeuronView)
	ON_WM_PAINT()
    ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
	ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
	ON_WM_MOUSEMOVE()
	ON_WM_SETCURSOR()
	ON_WM_TIMER()
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNeuronView message handlers
void CNeuronView::OnPaint() 
{
    static CPen penPoint(PS_SOLID, 1, RGB(74, 88, 41));
    static CPen penLine1(PS_SOLID, 1, RGB(0, 0, 255));
    static CPen penLine2(PS_SOLID, 1, RGB(174, 88, 41));
    static CPen penLine3(PS_SOLID, 1, RGB(74, 188, 41));
    static CBrush brushBg(RGB(255, 255, 255));
    static CBrush burshCurrentPoint(RGB(0, 255, 0));
    static CBrush brushPoint[7] = 
    {
        RGB(0, 255, 255),
        RGB(0, 128, 128),
        RGB(0, 255, 0),
        RGB(255, 255, 0),
        RGB(255, 0, 0),
        RGB(128, 128, 0),
        RGB(128, 0, 0)    
    };
    
    CBitmap memBitMap;
    CBitmap *pOldBit;
    CBrush *pOldBrush;
    CPen *pOldPen;
    CRect rectSrc, rectDst, rect1, rect2;
    int cx, cy;
    CDC *pDC;
    CDC memDC;
    
    pDC = GetDC();
    GetClientRect(&rectDst);
    memDC.CreateCompatibleDC(pDC);
    memBitMap.CreateCompatibleBitmap(pDC, rectDst.Width(), rectDst.Height());

    pOldPen = memDC.GetCurrentPen();
    pOldBrush = memDC.GetCurrentBrush();
    pOldBit = memDC.SelectObject(&memBitMap);

    /* move the rect to (0, 0) */
    rectSrc.CopyRect(&rectDst);
    rectSrc.OffsetRect(-rectDst.left, -rectDst.top);


    rect1.CopyRect(&rectSrc);
    rect2.CopyRect(&rectSrc);

    cx = (rectSrc.Width()) / 4;
    cy = (rectSrc.Height()) / 2;

    rect1.right = 2 * cx;
    rect2.left = 2 * cx;

    /* draw background */
    memDC.FillRect(&rectSrc, &brushBg);
    
    /* draw box */
    memDC.Rectangle(&rect1);
    memDC.Rectangle(&rect2);
    
    DrawCoordinate(memDC, rect1);
    DrawCoordinate(memDC, rect2);

    /* draw points */
    memDC.SelectObject(&penPoint);
    CPointf p;
    CPoint pL;
    for (int i = 0; i < m_vecPoint.size(); i++)
    {
        CPoint pL;
        p = m_vecPoint[i];
        if (i == m_iCurrentPoint)
            memDC.SelectObject(&burshCurrentPoint);
        else
            memDC.SelectObject(&brushPoint[m_vecPointClass[i] + 3]);
        MPtoLP(rect1, &p, &pL);
        if (rect1.PtInRect(pL))
            memDC.Ellipse(pL.x - POINT_UNIT, pL.y - POINT_UNIT, 
                          pL.x + POINT_UNIT, pL.y + POINT_UNIT);
    }    
    
    /* draw line */
    double w1, w2, b;
    if (m_pNeuralNetWork)
    {
        memDC.SelectObject(&penLine1);
        w1 = m_pNeuralNetWork->getWeight(1, 0, 0);
        w2 = m_pNeuralNetWork->getWeight(1, 1, 0);
        b = m_pNeuralNetWork->getB(1, 0);
        
        DrawLine(memDC, rect1, w1, w2, b);
        
        memDC.SelectObject(&penLine2);
        w1 = m_pNeuralNetWork->getWeight(1, 0, 1);
        w2 = m_pNeuralNetWork->getWeight(1, 1, 1);
        b = m_pNeuralNetWork->getB(1, 1);
        
        DrawLine(memDC, rect1, w1, w2, b);

        memDC.SelectObject(&penLine3);
        w1 = m_pNeuralNetWork->getWeight(2, 0, 0);
        w2 = m_pNeuralNetWork->getWeight(2, 1, 0);
        b = m_pNeuralNetWork->getB(2, 0);
        
        DrawLine(memDC, rect2, w1, w2, b);
    }

    pDC->BitBlt(rectDst.left, rectDst.top, rectDst.Width(), rectDst.Height(),
                &memDC, rectSrc.left, rectSrc.top, SRCCOPY);

    memDC.SelectObject(pOldPen);
    memDC.SelectObject(pOldBrush);
    memDC.SelectObject(pOldBit);
    memDC.DeleteDC();
    memBitMap.DeleteObject();
    ReleaseDC(pDC);
    CStatic::OnPaint();
	// Do not call CStatic::OnPaint() for painting messages
}

void CNeuronView::MPtoLP(CRect& rect, CPointf *pointf, CPoint *point)
{
    double ax, bx, ay, by;

    int cx = rect.left + (rect.right - rect.left) / 2.0;
    int cy = rect.top + (rect.bottom - rect.top) / 2.0;

	ax = 1.0 / BASE_UNIT;
    bx = -cx / BASE_UNIT;
    ay = -1.0 / BASE_UNIT;
    by = cy / BASE_UNIT;

    point->x = (long)((pointf->x - bx) / ax);
    point->y = (long)((pointf->y - by) / ay);
}

void CNeuronView::LPtoMP(CRect& rect, CPoint *point, CPointf *pointf)
{
    double ax, bx, ay, by;

    int cx = rect.left + (rect.right - rect.left) / 2;
    int cy = rect.top + (rect.bottom - rect.top) / 2;

	ax = 1 / BASE_UNIT;
    bx = -cx / BASE_UNIT;
    ay = -1 / BASE_UNIT;
    by = cy / BASE_UNIT;

    pointf->x = point->x * ax + bx;
    pointf->y = point->y * ay + by;
}

void CNeuronView::DrawCoordinate(CDC& dc, CRect& rect)
{
    int cx, cy;
    int offset;

    static CPen penCorrdinate(PS_SOLID, 1, RGB(0, 0, 0));

    dc.SelectObject(&penCorrdinate);
    
    cx = rect.left + (rect.right - rect.left) / 2;
    cy = rect.top + (rect.bottom - rect.top) / 2;
    
    /* x-coordinate */
    dc.MoveTo(rect.left, cy);
    dc.LineTo(rect.right, cy);
    offset = BASE_UNIT;
    while (offset + cx < rect.right)
    {
        dc.MoveTo(cx + offset, cy);
        dc.LineTo(cx + offset, cy - 5);

        dc.MoveTo(cx - offset, cy);
        dc.LineTo(cx - offset, cy - 5);
        offset += BASE_UNIT;
    }

    /* y-coordinate */
    dc.MoveTo(cx, rect.top);
    dc.LineTo(cx, rect.bottom);
    offset = BASE_UNIT;
    while (offset + cy < rect.bottom)
    {
        dc.MoveTo(cx, cy + offset);
        dc.LineTo(cx + 5, cy + offset);

        dc.MoveTo(cx, cy - offset);
        dc.LineTo(cx + 5, cy - offset);
        offset += BASE_UNIT;
    }
}
void CNeuronView::DrawLine(CDC &dc, CRect& rect, double w1, double w2, double b)
{
    int cx, cy;

    cx = rect.left + (rect.right - rect.left) / 2;
    cy = rect.top + (rect.bottom - rect.top) / 2;

    if (fabs(w2 - 0.0) < 0.0001)
    {
        if (fabs(w1 - 0.0) < 0.0001)
        {
            EndAdjust();
            MessageBox("Neuron is Dead.", "Error");            
        }
        
        CPointf pTmp1(-b / w1, 0);
        CPoint pTmp2;
        MPtoLP(rect, &pTmp1, &pTmp2);
        dc.MoveTo(pTmp2.x, rect.top);
        dc.LineTo(pTmp2.x, rect.bottom);
    }
    else
    {
        CPointf pf1, pf2;
        CPoint pc1, pc2;
        pf1.x = -(cx - rect.left) / BASE_UNIT;
        pf1.y = -(w1 * pf1.x + b) / w2;
        pf2.x = -pf1.x;
        pf2.y = -(w1 * pf2.x + b) / w2;

        MPtoLP(rect, &pf1, &pc1);
        MPtoLP(rect, &pf2, &pc2);
        
        /* adjust the beginning and ending of the line to be inner the rectangle of view */        
        if (!(pc1.y <= rect.top && pc2.y <= rect.top) 
            && !(pc1.y >= rect.bottom && pc2.y >= rect.bottom))
        {
            if (pc2.y != pc1.y)
            {
                int tmpY;
                tmpY = pc1.y < rect.top ? rect.top : 
                       pc1.y > rect.bottom ? rect.bottom : pc1.y;
                pc1.x = (pc2.x - pc1.x) * (tmpY - pc1.y) / (pc2.y - pc1.y) + pc1.x;
                pc1.y = tmpY;

                tmpY = pc2.y < rect.top ? rect.top : 
                       pc2.y > rect.bottom ? rect.bottom : pc2.y;
                pc2.x = (pc2.x - pc1.x) * (tmpY - pc1.y) / (pc2.y - pc1.y) + pc1.x;
                pc2.y = tmpY;
            }
            dc.MoveTo(pc1);
            dc.LineTo(pc2);
        }
    }
}

LRESULT CNeuronView::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
    m_bOver = FALSE;
    return 0;
}

LRESULT CNeuronView::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
    m_bOver = TRUE;
    return 0;
}

void CNeuronView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	TRACKMOUSEEVENT tme;
	tme.cbSize = sizeof(tme);
	tme.hwndTrack = m_hWnd;
	tme.dwFlags = TME_LEAVE | TME_HOVER;
	tme.dwHoverTime = 1;
	_TrackMouseEvent(&tme);
    
	CStatic::OnMouseMove(nFlags, point);
}

void CNeuronView::PreSubclassWindow() 
{	
	CStatic::PreSubclassWindow();
    ModifyStyle(0, BS_OWNERDRAW | SS_NOTIFY);
}

BOOL CNeuronView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	// TODO: Add your message handler code here and/or call default
	if (m_bOver)
    {
        ::SetCursor(m_hCursor);
        return TRUE;
    }
    else
    {
	    return CStatic::OnSetCursor(pWnd, nHitTest, message);
    }
}

void CNeuronView::AddPoint(const CPointf *pPointf, int iPointClass)
{
    m_vecPoint.push_back(*pPointf);
    m_vecPointClass.push_back(iPointClass);
}

void CNeuronView::SetWeightsListener(CWeightsListener *listener)
{
    m_pWeightsListener = listener;
}

void CNeuronView::SetMouseListener(CMouseListener *listener)
{
    m_pMouseListener = listener;
}

void CNeuronView::Redraw()
{
    CRect rect;
    GetClientRect(&rect);
    RedrawWindow(&rect, NULL);
}

void CNeuronView::ResetNeuron(double dbLearnRate, double dbActiveLvl, double dbMomentum)
{
    if (m_pNeuralNetWork)
        delete m_pNeuralNetWork;

    m_pNeuralNetWork = new NeuralNetwork(2);
    m_pNeuralNetWork->appendLayer(2, dbLearnRate, dbActiveLvl, dbMomentum);
    m_pNeuralNetWork->appendLayer(1, dbLearnRate, dbActiveLvl, dbMomentum);

    m_iCurrentPoint = -1;
    WeightsNotify();
}

void CNeuronView::BeginAdjust()
{
    if (m_iCurrentPoint != -1 || m_vecPoint.empty())
        return;

    UINT retVal = SetTimer(m_uiTimerID, m_uiTimeout, NULL);
    if (retVal != m_uiTimerID)
    {
        MessageBox("Timer is not available");
        return;
    }

    m_iCurrentPoint = 0;
}

void CNeuronView::EndAdjust()
{
    if (m_iCurrentPoint != -1)
    {
        m_iCurrentPoint = -1;
        KillTimer(m_uiTimerID);
    }
}

void CNeuronView::WeightsNotify()
{
    if (m_pWeightsListener)
    {
        double weights[9];
        weights[0] = m_pNeuralNetWork->getB(1, 0);
        weights[1] = m_pNeuralNetWork->getWeight(1, 0, 0);
        weights[2] = m_pNeuralNetWork->getWeight(1, 1, 0);
        weights[3] = m_pNeuralNetWork->getB(1, 1);
        weights[4] = m_pNeuralNetWork->getWeight(1, 0, 1);
        weights[5] = m_pNeuralNetWork->getWeight(1, 1, 1);
        weights[6] = m_pNeuralNetWork->getB(2, 0);
        weights[7] = m_pNeuralNetWork->getWeight(2, 0, 0);
        weights[8] = m_pNeuralNetWork->getWeight(2, 1, 0);
        m_pWeightsListener->OnWeightsNotify(weights, 9);
    }

}
void CNeuronView::OnTimer(UINT nIDEvent) 
{
    if (nIDEvent == m_uiTimerID && m_iCurrentPoint != -1 && m_pNeuralNetWork)
    {
        DVec vecInputs;
        DVec vecTarget;
        
        vecInputs.resize(2);
        vecInputs[0] = m_vecPoint[m_iCurrentPoint].x;
        vecInputs[1] = m_vecPoint[m_iCurrentPoint].y;

        vecTarget.resize(1);
        vecTarget[0] = m_vecPointClass[m_iCurrentPoint];

        m_pNeuralNetWork->learn(vecInputs, vecTarget);
    
        m_iCurrentPoint++;
        if (m_iCurrentPoint == m_vecPoint.size())
        {
            m_iCurrentPoint = 0;;
        }
        
        Redraw();

        WeightsNotify();
        
    }
	CStatic::OnTimer(nIDEvent);
}

void CNeuronView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
    if (m_pMouseListener)
    {
        
    }
	CStatic::OnLButtonDown(nFlags, point);
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产123| 欧美精品一区男女天堂| 国产精品国产三级国产有无不卡| 久久99国产精品麻豆| 欧美精品日韩精品| 肉肉av福利一精品导航| 欧美日韩一区在线| 丝袜a∨在线一区二区三区不卡| 日本韩国一区二区三区视频| 综合久久综合久久| 91福利视频网站| 亚洲一区二区三区视频在线播放 | 亚洲男人的天堂在线aⅴ视频| 成人av电影免费在线播放| 国产婷婷色一区二区三区四区| 极品少妇xxxx精品少妇偷拍 | 日本欧美在线看| 欧美福利视频导航| 另类小说综合欧美亚洲| www欧美成人18+| 成人午夜av电影| 亚洲三级在线播放| 欧美日韩一区二区三区在线| 蜜臀av一区二区| 国产性天天综合网| 91欧美一区二区| 亚洲成人激情av| 欧美大肚乱孕交hd孕妇| 国产v综合v亚洲欧| 亚洲综合视频在线观看| 日韩欧美在线不卡| 国产高清不卡一区二区| 亚洲啪啪综合av一区二区三区| 欧美天天综合网| 精品一区二区三区在线观看国产| 精品国产乱码91久久久久久网站| 成人激情校园春色| 亚洲在线免费播放| 久久婷婷国产综合国色天香| 成人永久aaa| 亚洲成人福利片| 26uuu久久天堂性欧美| 91免费小视频| 激情另类小说区图片区视频区| 国产精品色在线观看| 欧美日韩精品综合在线| 久久99国产乱子伦精品免费| 亚洲欧洲精品一区二区三区| 在线亚洲高清视频| 国产一区二区三区免费播放| 亚洲一区二区美女| 欧美激情在线免费观看| 欧美三级韩国三级日本三斤| 久久精品国产一区二区| 午夜精品久久久久| 中文字幕一区二区三区乱码在线| 3751色影院一区二区三区| jlzzjlzz亚洲日本少妇| 日本不卡中文字幕| 洋洋成人永久网站入口| 久久久精品国产免费观看同学| 一本大道久久a久久综合| 亚洲一区二区3| 欧美一区二区二区| 91丨porny丨户外露出| 久久精工是国产品牌吗| 五月婷婷久久丁香| 亚洲视频一二三区| 久久精品欧美日韩| 欧美一区二区三区喷汁尤物| 91福利国产成人精品照片| 国产综合久久久久影院| 日韩精品福利网| 亚洲综合自拍偷拍| 中文字幕中文在线不卡住| 337p粉嫩大胆色噜噜噜噜亚洲| 欧美日韩国产欧美日美国产精品| 91在线观看一区二区| 成人午夜激情视频| 丁香婷婷深情五月亚洲| 性久久久久久久久久久久| 亚洲精品中文字幕乱码三区| 中文一区二区在线观看| 国产日韩亚洲欧美综合| 国产日韩欧美麻豆| 精品91自产拍在线观看一区| 日韩欧美亚洲国产另类| 日韩一区二区三区免费观看| 欧美少妇性性性| 欧美日韩在线观看一区二区 | 日韩美女久久久| 国产精品私人影院| 国产精品国产三级国产有无不卡| 久久精品亚洲精品国产欧美kt∨| 日韩美女一区二区三区四区| 欧美成人艳星乳罩| 精品国产精品网麻豆系列 | 欧美亚男人的天堂| 7777精品伊人久久久大香线蕉的| 欧美一区二区在线免费观看| 日韩免费观看2025年上映的电影| 久久夜色精品国产噜噜av| 欧美国产日韩a欧美在线观看 | 久久精品视频一区二区三区| 久久久蜜桃精品| 国产精品美日韩| 亚洲色图欧洲色图| 亚洲综合一二区| 午夜精品一区二区三区电影天堂| 免费日本视频一区| 国精品**一区二区三区在线蜜桃| 国产激情视频一区二区在线观看 | 久久久久国产一区二区三区四区| 久久久高清一区二区三区| 欧美激情中文不卡| 洋洋成人永久网站入口| 奇米色一区二区| 老色鬼精品视频在线观看播放| 国产一区二区三区四区五区入口| www.在线成人| 欧美日韩高清不卡| 亚洲一区在线看| 激情久久五月天| 欧美色爱综合网| 久久综合九色欧美综合狠狠| 亚洲精品va在线观看| 另类小说综合欧美亚洲| av在线播放不卡| 在线成人高清不卡| 国产亚洲欧美中文| 亚洲高清免费观看 | 95精品视频在线| 91年精品国产| 欧美xxxxx牲另类人与| 国产精品久久久久影视| 舔着乳尖日韩一区| 99精品国产视频| 日韩欧美色电影| 亚洲色图清纯唯美| 国产一区二区调教| 欧美三级电影一区| 国产精品乱子久久久久| 蜜桃久久久久久| 在线影视一区二区三区| 久久综合狠狠综合久久综合88| 一区二区三区四区精品在线视频| 日韩成人免费看| 91蝌蚪porny| 国产精品久久夜| 国产精品资源站在线| 精品黑人一区二区三区久久| 男女性色大片免费观看一区二区| 成人app软件下载大全免费| 精品国产污污免费网站入口| 一区二区三区精品视频| 国产成人欧美日韩在线电影| 69堂亚洲精品首页| 夜夜嗨av一区二区三区网页| 99久久99久久综合| 欧美日韩情趣电影| 中文字幕一区二区在线观看 | 亚洲激情自拍偷拍| 国产69精品久久久久777| 日韩美女主播在线视频一区二区三区| 成人欧美一区二区三区小说| 国产一区二区不卡在线| 在线播放欧美女士性生活| 亚洲黄色录像片| 国产最新精品精品你懂的| 制服丝袜在线91| 亚洲午夜电影在线| 91激情五月电影| 亚洲男人天堂av| 91麻豆精东视频| 一区二区三区四区五区视频在线观看| 成人精品国产福利| 欧美激情一区二区三区| 国产美女视频91| 久久久蜜臀国产一区二区| 久久不见久久见免费视频7| 欧美日韩高清在线| 亚洲激情自拍偷拍| 91国产福利在线| 婷婷国产在线综合| 欧美三区在线观看| 成人国产精品免费观看视频| 国产精品视频第一区| 99久久免费视频.com| 中文字幕日韩一区二区| 99久久免费国产| 亚洲欧美国产高清| 欧美在线观看视频一区二区三区| 伊人夜夜躁av伊人久久| 欧美日韩国产首页| 日本va欧美va欧美va精品| 亚洲精品一区二区三区福利| 国产大陆a不卡| 久久免费的精品国产v∧| 国产一区二区精品久久| 国产日韩欧美制服另类|