コード例 #1
0
    private static void AdaptOffRules(LogHolder log, Strategy strategy)
    {
        int goalIndex = -1;

        int             row = log.positions.Count - 1;
        PositionsHolder p   = log.positions[row];

        int    rule  = p.lRule;
        string score = p.score;
        int    ballX = Convert.ToInt16(p.ballPosition.X);
        int    ballY = Convert.ToInt16(p.ballPosition.Y);

        if (row <= 1)
        {
            return;
        }

        //ball is before the opponents gate
        if (ballX == 6 && (ballY == 2 || ballY == 3))
        {
            ballWasInGate = true;
        }
        //somewhere else
        else
        {
            //failed goal atempt
            if (ballWasInGate && score == log.positions[row - 1].score)
            {
                goalIndex = row - 1;
            }
            ballWasInGate = false;
        }

        if (goalIndex != -1)
        {
            //extract lookupLines
            int from = -1;
            int to   = goalIndex;

            if ((to - lookBackLines) < 0)
            {
                from = 0;
            }
            else
            {
                from = to - lookBackLines;
            }

            //extract rules
            for (int off = from; off < to; off += ruleOffset)
            {
                int[]    sumValues = new int[18];
                double[] avgValues = new double[18];
                for (int i = 0 + off; i < ruleOffset + off; i++)
                {
                    int j = 0;
                    sumValues[j++] += Convert.ToInt16(log.positions[i].ballPosition.X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].ballPosition.Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[0].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[0].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[1].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[1].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[2].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[2].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[3].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[3].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[0].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[0].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[1].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[1].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[2].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[2].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[3].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[3].Y);
                }

                //avg from ruleOffset lines
                for (int i = 0; i < 18; i++)
                {
                    avgValues[i] = sumValues[i] / Convert.ToDouble(ruleOffset);
                    avgValues[i] = Math.Round(avgValues[i]);
                }

                //transform to rule
                Rule rl = new Rule();
                int  ii = 0;
                rl.ballX = Convert.ToInt16(avgValues[ii++]);
                rl.ballY = Convert.ToInt16(avgValues[ii++]);
                rl.lr0x  = Convert.ToInt16(avgValues[ii++]);
                rl.lr0y  = Convert.ToInt16(avgValues[ii++]);
                rl.lr1x  = Convert.ToInt16(avgValues[ii++]);
                rl.lr1y  = Convert.ToInt16(avgValues[ii++]);
                rl.lr2x  = Convert.ToInt16(avgValues[ii++]);
                rl.lr2y  = Convert.ToInt16(avgValues[ii++]);
                rl.lr3x  = Convert.ToInt16(avgValues[ii++]);
                rl.lr3y  = Convert.ToInt16(avgValues[ii++]);
                rl.rr0x  = Convert.ToInt16(avgValues[ii++]);
                rl.rr0y  = Convert.ToInt16(avgValues[ii++]);
                rl.rr1x  = Convert.ToInt16(avgValues[ii++]);
                rl.rr1y  = Convert.ToInt16(avgValues[ii++]);
                rl.rr2x  = Convert.ToInt16(avgValues[ii++]);
                rl.rr2y  = Convert.ToInt16(avgValues[ii++]);
                rl.rr3x  = Convert.ToInt16(avgValues[ii++]);
                rl.rr3y  = Convert.ToInt16(avgValues[ii++]);

                //set default moveto
                rl.lr0mx = rl.lr0x;
                rl.lr0my = rl.lr0y;
                rl.lr1mx = rl.lr1x;
                rl.lr1my = rl.lr1y;
                rl.lr2mx = rl.lr2x;
                rl.lr2my = rl.lr2y;
                rl.lr3mx = rl.lr3x;
                rl.lr3my = rl.lr3y;

                //send two closest robots to oponnents gate
                int selRobot  = -1;
                int selRobot2 = -1;

                int minX = Int16.MaxValue;
                int minY = Int16.MaxValue;

                int[] robotsL = new int[] { rl.lr0x, rl.lr0y, rl.lr1x, rl.lr1y, rl.lr2x, rl.lr2y, rl.lr3x, rl.lr3y };
                for (int i = 0; i < robotsL.Length; i = i + 2)
                {
                    int distX = 6 - robotsL[i];
                    int distY = 3 - robotsL[i + 1];
                    if (distX <= minX && distY <= minY)
                    {
                        minX     = distX;
                        minY     = distY;
                        selRobot = i / 2;
                    }
                }

                //find second robot
                robotsL[selRobot * 2]       = 0;
                robotsL[(selRobot * 2) + 1] = 0;
                minX = Int16.MaxValue;
                minY = Int16.MaxValue;
                for (int i = 0; i < robotsL.Length; i = i + 2)
                {
                    int distX = 6 - robotsL[i];
                    int distY = 2 - robotsL[i + 1];
                    if (distX <= minX && distY <= minY)
                    {
                        minX      = distX;
                        minY      = distY;
                        selRobot2 = i / 2;
                    }
                }

                //change moveto for selected robot
                switch (selRobot)
                {
                case 0:
                {
                    rl.lr0mx = 6;
                    rl.lr0my = 3;
                    break;
                }

                case 1:
                {
                    rl.lr1mx = 6;
                    rl.lr1my = 3;
                    break;
                }

                case 2:
                {
                    rl.lr2mx = 6;
                    rl.lr2my = 3;
                    break;
                }

                case 3:
                {
                    rl.lr3mx = 6;
                    rl.lr3my = 3;
                    break;
                }
                }

                //change moveto for selected robot
                switch (selRobot2)
                {
                case 0:
                {
                    rl.lr0mx = 6;
                    rl.lr0my = 2;
                    break;
                }

                case 1:
                {
                    rl.lr1mx = 6;
                    rl.lr1my = 2;
                    break;
                }

                case 2:
                {
                    rl.lr2mx = 6;
                    rl.lr2my = 2;
                    break;
                }

                case 3:
                {
                    rl.lr3mx = 6;
                    rl.lr3my = 2;
                    break;
                }
                }

                //check if the rule is not already created
                int il = adaptationOffRules.FindIndex(f =>
                                                      f.ballX == rl.ballX && f.ballY == rl.ballY &&
                                                      f.lr0x == rl.lr0x && f.lr0y == rl.lr0y &&
                                                      f.lr1x == rl.lr1x && f.lr1y == rl.lr1y &&
                                                      f.lr2x == rl.lr2x && f.lr2y == rl.lr2y &&
                                                      f.lr3x == rl.lr3x && f.lr3y == rl.lr3y &&
                                                      f.rr0x == rl.rr0x && f.rr0y == rl.rr0y &&
                                                      f.rr1x == rl.rr1x && f.rr1y == rl.rr1y &&
                                                      f.rr2x == rl.rr2x && f.rr2y == rl.rr2y &&
                                                      f.rr3x == rl.rr3x && f.rr3y == rl.rr3y
                                                      );
                if (il == -1)
                {
                    //rule strategy check
                    int istr = strategy.GStrategy.Rules.FindIndex(f =>
                                                                  f.Ball.X == rl.ballX && f.Ball.Y == rl.ballY &&
                                                                  f.Mine[0].X == rl.lr0x && f.Mine[0].Y == rl.lr0y &&
                                                                  f.Mine[1].X == rl.lr1x && f.Mine[1].Y == rl.lr1y &&
                                                                  f.Mine[2].X == rl.lr2x && f.Mine[2].Y == rl.lr2y &&
                                                                  f.Mine[3].X == rl.lr3x && f.Mine[3].Y == rl.lr3y &&
                                                                  f.Oppnt[0].X == rl.rr0x && f.Oppnt[0].Y == rl.rr0y &&
                                                                  f.Oppnt[1].X == rl.rr1x && f.Oppnt[1].Y == rl.rr1y &&
                                                                  f.Oppnt[2].X == rl.rr2x && f.Oppnt[2].Y == rl.rr2y &&
                                                                  f.Oppnt[3].X == rl.rr3x && f.Oppnt[3].Y == rl.rr3y
                                                                  );

                    if (istr == -1)
                    {
                        rl.ruleNum = ++ruleNum;
                        adaptationOffRules.Add(rl);
                    }
                    else
                    {
                        ++discardedOffrules;
                    }
                }
                else
                {
                    ++discardedOffrules;
                }
            }
        }
    }
コード例 #2
0
    private static void AdaptDefRules(LogHolder log, Strategy strategy)
    {
        int goalIndex = -1;

        int             row   = log.positions.Count - 1;
        PositionsHolder p     = log.positions[row];
        int             rule  = p.lRule;
        string          score = p.score;

        if (row <= 1)
        {
            return;
        }

        if (score != log.positions[row - 1].score)
        {
            //goal
            string[] lastScoreSplit = log.positions[row - 1].score.Split(':');
            int      lastGoalsL     = Convert.ToInt16(lastScoreSplit[0]);
            int      lastGoalsR     = Convert.ToInt16(lastScoreSplit[1]);
            string[] scoreSplit     = score.Split(':');
            int      goalsL         = Convert.ToInt16(scoreSplit[0]);
            int      goalsR         = Convert.ToInt16(scoreSplit[1]);
            //right team scored goal
            if (lastGoalsL == goalsL && lastGoalsR < goalsR)
            {
                goalIndex = row;
            }
        }

        if (goalIndex != -1)
        {
            //extract lookupLines
            int from = -1;
            int to   = goalIndex;

            if ((to - lookBackLines) < 0)
            {
                from = 0;
            }
            else
            {
                from = to - lookBackLines;
            }

            //extract rules
            for (int off = from; off < to; off += ruleOffset)
            {
                int[]    sumValues = new int[18];
                double[] avgValues = new double[18];
                for (int i = 0 + off; i < ruleOffset + off; i++)
                {
                    int j = 0;
                    sumValues[j++] += Convert.ToInt16(log.positions[i].ballPosition.X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].ballPosition.Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[0].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[0].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[1].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[1].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[2].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[2].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[3].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].leftPlayerRobots[3].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[0].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[0].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[1].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[1].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[2].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[2].Y);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[3].X);
                    sumValues[j++] += Convert.ToInt16(log.positions[i].rightPlayerRobots[3].Y);
                }

                //avg from ruleOffset lines
                for (int i = 0; i < 18; i++)
                {
                    avgValues[i] = sumValues[i] / Convert.ToDouble(ruleOffset);
                    avgValues[i] = Math.Round(avgValues[i]);
                }

                //transform to rule
                Rule rl = new Rule();
                int  ii = 0;
                rl.ballX = Convert.ToInt16(avgValues[ii++]);
                rl.ballY = Convert.ToInt16(avgValues[ii++]);
                rl.lr0x  = Convert.ToInt16(avgValues[ii++]);
                rl.lr0y  = Convert.ToInt16(avgValues[ii++]);
                rl.lr1x  = Convert.ToInt16(avgValues[ii++]);
                rl.lr1y  = Convert.ToInt16(avgValues[ii++]);
                rl.lr2x  = Convert.ToInt16(avgValues[ii++]);
                rl.lr2y  = Convert.ToInt16(avgValues[ii++]);
                rl.lr3x  = Convert.ToInt16(avgValues[ii++]);
                rl.lr3y  = Convert.ToInt16(avgValues[ii++]);
                rl.rr0x  = Convert.ToInt16(avgValues[ii++]);
                rl.rr0y  = Convert.ToInt16(avgValues[ii++]);
                rl.rr1x  = Convert.ToInt16(avgValues[ii++]);
                rl.rr1y  = Convert.ToInt16(avgValues[ii++]);
                rl.rr2x  = Convert.ToInt16(avgValues[ii++]);
                rl.rr2y  = Convert.ToInt16(avgValues[ii++]);
                rl.rr3x  = Convert.ToInt16(avgValues[ii++]);
                rl.rr3y  = Convert.ToInt16(avgValues[ii++]);

                int il = adaptationDefRules.FindIndex(f =>
                                                      f.ballX == rl.ballX && f.ballY == rl.ballY &&
                                                      f.lr0x == rl.lr0x && f.lr0y == rl.lr0y &&
                                                      f.lr1x == rl.lr1x && f.lr1y == rl.lr1y &&
                                                      f.lr2x == rl.lr2x && f.lr2y == rl.lr2y &&
                                                      f.lr3x == rl.lr3x && f.lr3y == rl.lr3y &&
                                                      f.rr0x == rl.rr0x && f.rr0y == rl.rr0y &&
                                                      f.rr1x == rl.rr1x && f.rr1y == rl.rr1y &&
                                                      f.rr2x == rl.rr2x && f.rr2y == rl.rr2y &&
                                                      f.rr3x == rl.rr3x && f.rr3y == rl.rr3y
                                                      );
                if (il == -1)
                {
                    //rule strategy check
                    int istr = strategy.GStrategy.Rules.FindIndex(f =>
                                                                  f.Ball.X == rl.ballX && f.Ball.Y == rl.ballY &&
                                                                  f.Mine[0].X == rl.lr0x && f.Mine[0].Y == rl.lr0y &&
                                                                  f.Mine[1].X == rl.lr1x && f.Mine[1].Y == rl.lr1y &&
                                                                  f.Mine[2].X == rl.lr2x && f.Mine[2].Y == rl.lr2y &&
                                                                  f.Mine[3].X == rl.lr3x && f.Mine[3].Y == rl.lr3y &&
                                                                  f.Oppnt[0].X == rl.rr0x && f.Oppnt[0].Y == rl.rr0y &&
                                                                  f.Oppnt[1].X == rl.rr1x && f.Oppnt[1].Y == rl.rr1y &&
                                                                  f.Oppnt[2].X == rl.rr2x && f.Oppnt[2].Y == rl.rr2y &&
                                                                  f.Oppnt[3].X == rl.rr3x && f.Oppnt[3].Y == rl.rr3y
                                                                  );

                    if (istr == -1)
                    {
                        rl.ruleNum = ++ruleNum;

                        //set moveto
                        rl.lr0mx = rl.lr0x;
                        rl.lr0my = rl.lr0y;
                        rl.lr1mx = rl.lr1x;
                        rl.lr1my = rl.lr1y;
                        rl.lr2mx = rl.ballX;
                        rl.lr2my = rl.ballY;
                        rl.lr3mx = rl.ballX;
                        rl.lr3my = rl.ballY;

                        adaptationDefRules.Add(rl);
                    }
                    else
                    {
                        ++discardedDefrules;
                    }
                }
                else
                {
                    ++discardedDefrules;
                }
            }
        }
    }