Beispiel #1
0
void CPropertiesWnd::OnPropDownitem()
{
	if (!IsComboType())
	{
		return;
	}

	CMFCPropertyGridProperty *pProp = m_wndPropList.GetCurSel();
	if (pProp && pProp->IsGroup())
	{
		CString strName(pProp->GetName());
		if (strName.CompareNoCase(_T("ITEM")) == 0)
		{
			CMFCPropertyGridProperty *pParentProp = pProp->GetParent();
			if (pProp == pParentProp->GetSubItem(pParentProp->GetSubItemsCount() - 1))
			{
				return;
			}

			int nEnd = 0;
			CList<CMFCPropertyGridProperty*, CMFCPropertyGridProperty*> lstSubItems;
			for (int i = pParentProp->GetSubItemsCount() - 1; i >= nEnd; i--)
			{
				CMFCPropertyGridProperty *pChildProp = pParentProp->GetSubItem(i);
				if (pChildProp)
				{
					if (pChildProp == pProp)
					{
						nEnd = i;
						lstSubItems.InsertAfter(lstSubItems.GetHeadPosition(), pChildProp);
					}
					else
					{
						lstSubItems.AddHead(pChildProp);
					}
					pParentProp->RemoveSubItem(pChildProp, FALSE);
				}
			}

			for (POSITION pos = lstSubItems.GetHeadPosition(); pos != NULL;)
			{
				CMFCPropertyGridProperty* pProp = lstSubItems.GetNext(pos);
				ASSERT_VALID(pProp);

				pParentProp->AddSubItem(pProp);
			}
			m_wndPropList.AdjustLayout();
		}
	}
}
//current   变化后,以上没有问题了。
void Genetic::crossoveroperator()   
{
    //非均匀算术线性交叉,浮点数适用,alpha ,beta是(0,1)之间的随机数
    //对种群中两两交叉的个体选择也是随机选择的。也可取beta=1-alpha;
    //current的变化会有一些改变。

    int i,j;
    double alpha,beta;
    CList <int,int> index;
    int point,temp;
    double p;
    
    // srand( (unsigned)time( NULL ) );
    for (i=0;i<popsize;i++)//生成序号
    {
        index.InsertAfter (index.FindIndex(i),i);
    }
    
    for (i=0;i<popsize;i++)//打乱序号
    {
        point=rand()%(popsize-1);
        temp=index.GetAt(index.FindIndex(i));
        index.SetAt(index.FindIndex(i),
        index.GetAt(index.FindIndex(point)));  
        index.SetAt(index.FindIndex(point),temp);
    }
    
    for (i=0;i<popsize-1;i+=2)
    {
        //按顺序序号,按序号选择两个母体进行交叉操作。
        p=double(rand()%10000)/10000.0;
        if (p<crossoverrate)
        {   
            alpha=double(rand()%10000)/10000.0;
            beta=double(rand()%10000)/10000.0;
            current=population.GetAt(population.FindIndex(index.GetAt(index.FindIndex(i))));
            current1=population.GetAt(population.FindIndex(index.GetAt(index.FindIndex(i+1))));//临时使用
            current1代替
            for(j=0;j<variablenum;j++)
            { 
                //交叉
                double sign;
                sign=rand()%2;
                if(sign)
                {
                    current.chromosome[j]=(1-alpha)*current.chromosome[j]+
                    beta*current1.chromosome[j];
                }
                else
                {
                    current.chromosome[j]=(1-alpha)*current.chromosome[j]-
                    beta*current1.chromosome[j];
                }
                if (current.chromosome[j]>variabletop[j])  //判断是否超界.
                {
                    current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+
                    variablebottom[j];
                }
                if (current.chromosome[j]<variablebottom [j])
                {
                    current.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+
                    variablebottom[j];
                }
                if(sign)
                {
                    current1.chromosome[j]=alpha*current.chromosome[j]+
                    (1- beta)*current1.chromosome[j];
                }
                else
                {
                    current1.chromosome[j]=alpha*current.chromosome[j]-
                    (1- beta)*current1.chromosome[j];
                }
                if (current1.chromosome[j]>variabletop[j])
                {
                    current1.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+
                    variablebottom[j];
                }
                if (current1.chromosome[j]<variablebottom [j])
                {
                    current1.chromosome[j]=double(rand()%10000)/10000*(variabletop[j]-variablebottom[j])+
                    variablebottom[j];
                }
            }
            //回代
        }
        
        newpopulation.InsertAfter  (newpopulation.FindIndex(i),current);
        newpopulation.InsertAfter  (newpopulation.FindIndex(i),current1);
    }
//*********************************************************************************
int CBCGPVisualManagerVS2005::CreateAutoHideButtonRegion (CRect rect, 
								DWORD dwAlignment, LPPOINT& points)
{
	switch (dwAlignment & CBRS_ALIGN_ANY)
	{
	case CBRS_ALIGN_LEFT:
		rect.right--;
		break;

	case CBRS_ALIGN_TOP:
		rect.bottom--;
		break;
	}

	CRect rectOrign = rect;
	DWORD dwAlignmentOrign = dwAlignment;

	if ((dwAlignment & CBRS_ALIGN_ANY) == CBRS_ALIGN_LEFT || 
		(dwAlignment & CBRS_ALIGN_ANY) == CBRS_ALIGN_RIGHT)
	{
		rect = CRect (0, 0, rectOrign.Height (), rectOrign.Width ());
		dwAlignment = (dwAlignment == CBRS_ALIGN_LEFT) ? CBRS_ALIGN_TOP : CBRS_ALIGN_BOTTOM;
	}

	CList<POINT, POINT> pts;

	if (!m_bRoundedAutohideButtons)
	{
		rect.right--;

		pts.AddHead (CPoint (rect.left, rect.top));
		pts.AddHead (CPoint (rect.left, rect.bottom - 2));
		pts.AddHead (CPoint (rect.left + 2, rect.bottom));
		pts.AddHead (CPoint (rect.right - 2, rect.bottom));
		pts.AddHead (CPoint (rect.right, rect.bottom - 2));
		pts.AddHead (CPoint (rect.right, rect.top));
	}
	else
	{
		POSITION posLeft = pts.AddHead (CPoint (rect.left, rect.top));
		posLeft = pts.InsertAfter (posLeft, CPoint (rect.left, rect.top + 2));

		POSITION posRight = pts.AddTail (CPoint (rect.right, rect.top));
		posRight = pts.InsertBefore (posRight, CPoint (rect.right, rect.top + 2));

		int xLeft = rect.left + 1;
		int xRight = rect.right - 1;

		int y = 0;

		BOOL bIsHorz =
			(dwAlignmentOrign & CBRS_ALIGN_ANY) == CBRS_ALIGN_LEFT || 
			(dwAlignmentOrign & CBRS_ALIGN_ANY) == CBRS_ALIGN_RIGHT;

		for (y = rect.top + 2; y < rect.bottom - 4; y += 2)
		{
			posLeft = pts.InsertAfter (posLeft, CPoint (xLeft, y));
			posLeft = pts.InsertAfter (posLeft, CPoint (xLeft, y + 2));

			posRight = pts.InsertBefore (posRight, CPoint (xRight, y));
			posRight = pts.InsertBefore (posRight, CPoint (xRight, y + 2));

			xLeft++;
			xRight--;
		}

		if ((dwAlignmentOrign & CBRS_ALIGN_ANY) == CBRS_ALIGN_BOTTOM && !bIsHorz)
		{
			xLeft--;
			xRight++;
		}

		if (bIsHorz)
		{
			xRight++;
		}
	
		for (;y < rect.bottom - 1; y++)
		{
			posLeft = pts.InsertAfter (posLeft, CPoint (xLeft, y));
			posLeft = pts.InsertAfter (posLeft, CPoint (xLeft + 1, y + 1));

			posRight = pts.InsertBefore (posRight, CPoint (xRight, y));
			posRight = pts.InsertBefore (posRight, CPoint (xRight - 1, y + 1));

			if (y == rect.bottom - 2)
			{
				posLeft = pts.InsertAfter (posLeft, CPoint (xLeft + 1, y + 1));
				posLeft = pts.InsertAfter (posLeft, CPoint (xLeft + 3, y + 1));

				posRight = pts.InsertBefore (posRight, CPoint (xRight, y + 1));
				posRight = pts.InsertBefore (posRight, CPoint (xRight - 2, y + 1));
			}

			xLeft++;
			xRight--;
		}

		posLeft = pts.InsertAfter (posLeft, CPoint (xLeft + 2, rect.bottom));
		posRight = pts.InsertBefore (posRight, CPoint (xRight - 2, rect.bottom));
	}

	points = new POINT [pts.GetCount ()];

	int i = 0;

	for (POSITION pos = pts.GetHeadPosition (); pos != NULL; i++)
	{
		points [i] = pts.GetNext (pos);

		switch (dwAlignmentOrign & CBRS_ALIGN_ANY)
		{
		case CBRS_ALIGN_BOTTOM:
			points [i].y = rect.bottom - (points [i].y - rect.top);
			break;

		case CBRS_ALIGN_RIGHT:
			{
				int x = rectOrign.right - points [i].y;
				int y = rectOrign.top + points [i].x;

				points [i] = CPoint (x, y);
			}
			break;

		case CBRS_ALIGN_LEFT:
			{
				int x = rectOrign.left + points [i].y;
				int y = rectOrign.top + points [i].x;

				points [i] = CPoint (x, y);
			}
			break;
		}
	}

	return (int) pts.GetCount ();
}