Esempio n. 1
0
		static void comTestMemQ() {

			//train a MemQ agent, and once every ten games have it teach an observer
			//do this with ten agents
			const int teachingagents = 10;
			const int gamesbetweenteaching = 10;
			const int learninggames = 10000;

			int wins = 0;
			int n = 0;
			while (File.Exists("observer" + n + ".log")) n++;
			StreamWriter writer = new StreamWriter("observer" + n + ".log");
			writer.WriteLine("sources");

			Virus virus;
			MemoryQAgent observer = new MemoryQAgent(1);
			Agent opponent = new BruteForceAgent(2);

			for (int i = 0; i < teachingagents; i++) {
				MemoryQAgent agent = new MemoryQAgent(1);

				wins = 0;
				for (int j = 0; j < learninggames; j++) {
					virus = new Virus(2, 5);
					wins += RunGame(virus, agent, opponent) == 1 ? 1 : 0;
					agent.ProcessShortTermMemory();

					if (j % gamesbetweenteaching == gamesbetweenteaching - 1) {
						agent.TellOfMemoryTo(observer, true);
					}
					if (j % 1000 == 999) {
						if (j > 9500) {
							writer.WriteLine(wins);
							Console.WriteLine("Wins: " + wins);
						}

						wins = 0;
					}
					
				}
			}

			writer.WriteLine("observer");
			for (int i = 0; i < 10; i++) {
				wins = 0;
				for (int j = 0; j < 1000; j++) {
					virus = new Virus();
					wins += RunGame(virus, observer, opponent) == 1 ? 1 : 0;
					observer.ForgetShortTerm();
				}
				writer.WriteLine(wins);
				Console.WriteLine("Observer wins: " + wins);
			}
			writer.Close();
		}
Esempio n. 2
0
		static void TrainMemoryQ(int size, byte qnumber, MemoryQAgent agent, String opponent, String logname, String savename, int iterations, int saveinterval = 360) {
			Virus virus = new Virus(2, size);
			int wins = 0, wins2 = 0;
			byte oppnumber = qnumber == 1 ? (byte)2 : (byte)1;
			Agent opp = new BruteForceAgent(oppnumber);
			StreamWriter writer = new StreamWriter(logname);
			for (int i = 1; i <= iterations; i++) {
				switch (opponent) {
					case "brute":
						break;
					case "minimax4":
						opp = new MinimaxAgent(4, oppnumber);
						break;
					case "minimax3":
						opp = new MinimaxAgent(3, oppnumber);
						break;
					case "minimax2":
						opp = new MinimaxAgent(2, oppnumber);
						break;
					default:
						opp = new BruteForceAgent(oppnumber);
						break;
				}

				int winner = RunGame(virus, qnumber == 1 ? (Agent)agent : opp, qnumber == 2 ? (Agent)agent : opp);
				wins += winner == 1 ? 1 : 0;
				wins2 += winner == 1 ? 1 : 0;

				agent.ProcessShortTermMemory();

				if (i % saveinterval == 0) {
					agent.Save(savename);
					Console.WriteLine("Iteration: " + i);
					Console.WriteLine("Wins: " + wins);
					wins = 0;
				}
				virus = new Virus(2, size);
			}
			for (int n = 0; n < 10; n++) {
				MemoryQAgent ag = new MemoryQAgent();
				for (int i = 0; i < 1000; i++) {
					agent.TellOfMemoryTo(ag);
				}
				wins = 0;
				opp = new BruteForceAgent(oppnumber);
				for (int i = 1; i <= 10000; i++) {
					switch (opponent) {
						case "brute":
							break;
						case "minimax4":
							opp = new MinimaxAgent(4, oppnumber);
							break;
						case "minimax3":
							opp = new MinimaxAgent(3, oppnumber);
							break;
						case "minimax2":
							opp = new MinimaxAgent(2, oppnumber);
							break;
						default:
							opp = new BruteForceAgent(oppnumber);
							break;
					}

					int winner = RunGame(virus, qnumber == 1 ? (Agent)ag : opp, qnumber == 2 ? (Agent)ag : opp);
					wins += winner == 1 ? 1 : 0;
					virus = new Virus(2, size);
				}
				Console.WriteLine("After 1000 memories");
				Console.WriteLine("Wins: " + wins);
				writer.Write(((double)wins) / 10000.0 + ";");
				for (int i = 0; i < 9000; i++) {
					agent.TellOfMemoryTo(ag);
				}
				wins = 0;
				opp = new BruteForceAgent(oppnumber);
				for (int i = 1; i <= 10000; i++) {
					switch (opponent) {
						case "brute":
							break;
						case "minimax4":
							opp = new MinimaxAgent(4, oppnumber);
							break;
						case "minimax3":
							opp = new MinimaxAgent(3, oppnumber);
							break;
						case "minimax2":
							opp = new MinimaxAgent(2, oppnumber);
							break;
						default:
							opp = new BruteForceAgent(oppnumber);
							break;
					}

					int winner = RunGame(virus, qnumber == 1 ? (Agent)ag : opp, qnumber == 2 ? (Agent)ag : opp);
					wins += winner == 1 ? 1 : 0;
					virus = new Virus(2, size);
				}
				Console.WriteLine("After 10000 memories");
				Console.WriteLine("Wins: " + wins);
				writer.Write(((double)wins) / 10000.0 + ";");
				for (int i = 0; i < 90000; i++) {
					agent.TellOfMemoryTo(ag);
				}
				wins = 0;
				opp = new BruteForceAgent(oppnumber);
				for (int i = 1; i <= 10000; i++) {
					switch (opponent) {
						case "brute":
							break;
						case "minimax4":
							opp = new MinimaxAgent(4, oppnumber);
							break;
						case "minimax3":
							opp = new MinimaxAgent(3, oppnumber);
							break;
						case "minimax2":
							opp = new MinimaxAgent(2, oppnumber);
							break;
						default:
							opp = new BruteForceAgent(oppnumber);
							break;
					}

					int winner = RunGame(virus, qnumber == 1 ? (Agent)ag : opp, qnumber == 2 ? (Agent)ag : opp);
					wins += winner == 1 ? 1 : 0;
					virus = new Virus(2, size);
				}
				Console.WriteLine("After 100000 memories");
				Console.WriteLine("Wins: " + wins);
				writer.WriteLine(((double)wins) / 10000.0);
			}
			writer.Close();
			agent.SaveLongTermMemory("m");
		}
Esempio n. 3
0
		static void TrainQ(int size, byte qnumber, QAgent agent, String opponent, String logname, String savename, int iterations, int saveinterval = 360) {
			Virus virus = new Virus(2, size);
			int wins = 0, wins2 = 0;
			byte oppnumber = qnumber == 1 ? (byte)2 : (byte)1;
			Agent opp = new BruteForceAgent(oppnumber);
			StreamWriter writer = new StreamWriter(logname);
			for (int i = 1; i <= iterations; i++) {
				switch (opponent) {
					case "brute":
						break;
					case "minimax4":
						opp = new MinimaxAgent(4, oppnumber);
						break;
					case "minimax3":
						opp = new MinimaxAgent(3, oppnumber);
						break;
					case "minimax2":
						opp = new MinimaxAgent(2, oppnumber);
						break;
					default:
						opp = new BruteForceAgent(oppnumber);
						break;
				}

				int winner = RunGame(virus, qnumber == 1 ? (Agent)agent : opp, qnumber == 2 ? (Agent)agent : opp);
				wins += winner == 1 ? 1 : 0;
				wins2 += winner == 1 ? 1 : 0;

				if (i % 100 == 0) {
					if (agent.RandomRate == 0) {
						writer.WriteLine(wins2);
					}
					wins2 = 0;
				}
				if (i % saveinterval == 0) {
					agent.Save(savename);
					Console.WriteLine("Iteration: " + i);
					Console.WriteLine("Wins: " + wins);
					wins = 0;
					if (agent.RandomRate > 0) {
						agent.TurnOffExploration();
						agent.TurnOffLearning();
						for (int j = 1; j <= 1000; j++) {
							virus = new Virus(2, size);
							winner = RunGame(virus, qnumber == 1 ? (Agent)agent : opp, qnumber == 2 ? (Agent)agent : opp);
							wins += winner == 1 ? 1 : 0;
						}
						writer.WriteLine(wins);
						wins = 0;
						agent.TurnOnExploration();
						agent.TurnOnLearning();
					}
				}
				virus = new Virus(2, size);
			}
			writer.Close();
		}
Esempio n. 4
0
		static void RunQ(byte qnumber, QAgent agent, String opponent, int iterations, int size) {
			Virus virus = new Virus(2, size);
			int wins = 0;
			byte oppnumber = qnumber == 1 ? (byte)2 : (byte)1;

			Agent opp;
			switch (opponent) {
				case "brute":
					opp = new BruteForceAgent(oppnumber);
					break;
				case "minimax4":
					opp = new MinimaxAgent(4, oppnumber);
					break;
				case "minimax3":
					opp = new MinimaxAgent(3, oppnumber);
					break;
				case "minimax2":
					opp = new MinimaxAgent(2, oppnumber);
					break;
				default:
					opp = new BruteForceAgent(oppnumber);
					break;
			}

			int n = 0;
			while (File.Exists("qwinlog" + n)) {
				n++;
			}
			StreamWriter writer = new StreamWriter("qwinlog" + n);

			for (int i = 1; i <= iterations; i++) {
				int winner = RunGame(virus, qnumber == 1 ? (Agent)agent : opp, qnumber == 2 ? (Agent)agent : opp);
				wins += winner == 1 ? 1 : 0;
				virus = new Virus(2, size);
			}
			writer.WriteLine(wins);
			Console.WriteLine("Iteration: " + iterations);
			Console.WriteLine("Wins: " + wins);
			wins = 0;
			writer.Close();
		}
Esempio n. 5
0
		static void RunMinimax(int size, byte qnumber, MinimaxAgent agent, String opponent, int iterations, int saveinterval = 360) {
			Virus virus = new Virus(2, size);
			int wins = 0;
			int wins2 = 0;
			byte oppnumber = qnumber == 1 ? (byte)2 : (byte)1;

			int n = 0;
			while (File.Exists("mmlog" + n)) {
				n++;
			}

			StreamWriter writer = new StreamWriter("mmlog" + n);
			StreamWriter timeWriter = new StreamWriter("mmTimeLog", true);
			timeWriter.WriteLine("Player number: {0} Board size: {1} Opponent: {2}", qnumber, size, opponent);
			timeWriter.Close();

			for (int i = 1; i <= iterations; i++) {
				Agent opp;
				switch (opponent) {
					case "brute":
						opp = new BruteForceAgent(oppnumber);
						break;
					case "minimax4":
						opp = new MinimaxAgent(4, oppnumber);
						break;
					case "minimax3":
						opp = new MinimaxAgent(3, oppnumber);
						break;
					case "minimax2":
						opp = new MinimaxAgent(2, oppnumber);
						break;
					default:
						opp = new BruteForceAgent(oppnumber);
						break;
				}

				virus.SaveReplay = true;
				int winner = RunGame(virus, qnumber == 1 ? (Agent)agent : opp, qnumber == 2 ? (Agent)agent : opp);
				wins += winner == 1 ? 1 : 0;
				wins2 += winner == 1 ? 1 : 0;

				/*if (i % 100 == 0) {
					writer.WriteLine(wins2);
					//Console.WriteLine("Iteration: " + i);
					//Console.WriteLine("Wins: " + wins);
					wins2 = 0;
				}*/

				if (i % saveinterval == 0) {
					writer.WriteLine(wins);
					Console.WriteLine("Iteration: " + i);
					Console.WriteLine("Wins: " + wins);
					//Console.WriteLine(winners);
					//winners.Clear();
					wins = 0;
				}
				virus = new Virus(2, size);
			}
			writer.Close();
		}
Esempio n. 6
0
		public VirusInterface(Virus virus, int tilesize = 20, bool immediateAI = false, params String[] names) {
			InitializeComponent();
			this.virus = virus;
			this.tileSize = tilesize;
			this.immediateAI = immediateAI;
			this.MouseClick += MouseClickHandler1;
			this.Size = new Size(
				virus.Size * tileSize + 17,
				virus.Size * tileSize + 55);
			this.names.Add("Player 0");
			this.names.AddRange(names);
			while (this.names.Count < virus.Players + 1) {
				this.names.Add("Player " + this.names.Count);
			}
			//Save("Lalalafil");
			agents = new Agent[this.names.Count];
			int n = 1;
			for (byte i = 1; i < this.names.Count; i++) {
				String p = this.names[i];
				switch (p) {
					case "QAI":
						agents[i] = new QAgent(i);
						if (File.Exists("TrainingData.Q") && File.Exists("TrainingData.N")) {
							((QAgent)agents[i]).Load("TrainingData");
							((QAgent)agents[i]).TurnOffExploration();
							((QAgent)agents[i]).TurnOffLearning();
						}
						this.names[i] = "AI " + n;
						n++;
						break;
					case "AnnAI":
						agents[i] = new AnnAgent(false, virus.Size, i);
						this.names[i] = "AI " + n;
						n++;
						break;
					case "MinimaxAI":
						agents[i] = new MinimaxAgent(4,i);
						this.names[i] = "AI " + n;
						n++;
						break;
					case "MiniMaxMixAI":
						if (File.Exists("TrainingData.Q"))
							agents[i] = new MiniMaxMixAgent("TrainingData", 2, i);
						else
							agents[i] = new BruteForceAgent(i);
						this.names[i] = "AI " + n;
						n++;
						break;
					case "MixedAI":
						agents[i] = new MixedAgent(0.5,false,i);
						this.names[i] = "AI " + n;
						n++;
						break;
					case "BruteAI":
						agents[i] = new BruteForceAgent(i);
						this.names[i] = "AI " + n;
						n++;
						break;
					case "RandomAI":
						agents[i] = new RandomAgent(i);
						this.names[i] = "AI " + n;
						n++;
						break;
					case "SimpleAI":
						agents[i] = new SimpleAgent(i);
						this.names[i] = "AI " + n;
						n++;
						break;
				}
			}

			message = this.names[1] + "'s turn";

			colors = new Color[virus.Players + 1];
			colors[0] = Color.White;
			colors[1] = Color.FromArgb(128, 160, 255);
			colors[2] = Color.FromArgb(96, 255, 96);
			if(virus.Players > 2)
				colors[3] = Color.FromArgb(255, 96, 96);
			if(virus.Players > 3)
				colors[4] = Color.FromArgb(255, 255, 64);
			Random rand = new Random();
			for (int i = 5; i <= virus.Players; i++)
				colors[i] = Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256));
		}
Esempio n. 7
0
		static void comTestMemQ2() {

			//train a MemQ agent, and once every ten games have it teach an observer
			//do this with ten agents
			const int teachingagents = 10;
			const int gamesbetweenteaching = 10;
			const int learninggames = 10000;

			int wins = 0;
			int n = 0;
			while (File.Exists("observer" + n + ".log")) n++;
			StreamWriter writer = new StreamWriter("observer" + n + ".log");
			writer.WriteLine("sources");

			Virus virus;
			MemoryQAgent observer = new MemoryQAgent(1);
			Agent opponent = new BruteForceAgent(2);
			MemoryQAgent[] agents = new MemoryQAgent[teachingagents];

			for (int i = 0; i < teachingagents; i++) {
				agents[i] = new MemoryQAgent(1);

				wins = 0;
				for (int j = 0; j < learninggames; j++) {
					virus = new Virus(2, 5);
					wins += RunGame(virus, agents[i], opponent) == 1 ? 1 : 0;
					agents[i].ProcessShortTermMemory();
					if (j % 1000 == 999) {
						if (j > 9500) {
							writer.WriteLine(wins);
							Console.WriteLine("Wins: " + wins);
						}

						wins = 0;
					}

				}
			}

			writer.WriteLine("observer");
			int totalmems = 0;
			int memstoprocess = 0;
			while (totalmems < 100000) {
				//if (memstoprocess == 10000) memstoprocess = 100000;
				//if (memstoprocess == 1000) memstoprocess = 10000;
				//if (memstoprocess < 1000) memstoprocess = 1000;
				memstoprocess += 1000;
				while (totalmems < memstoprocess) {
					for (int i = 0; i < teachingagents; i++) {
						totalmems += agents[i].TellOfMemoryToExt(observer, true);
					}
				}

				//writer.WriteLine("observer");
				//for (int i = 0; i < 10; i++) {
					wins = 0;
					for (int j = 0; j < 10000; j++) {
						virus = new Virus();
						wins += RunGame(virus, observer, opponent) == 1 ? 1 : 0;
						observer.ForgetShortTerm();
					}
					writer.WriteLine(wins);
					Console.WriteLine("Observer wins after " + totalmems + "memories: " + wins);
				//}
			}
			writer.Close();
		}
Esempio n. 8
0
		public void StartGame(
			Virus virus, 
			PerformedMoveCallback callback, 
			UpdatePiecesCallback piecesCallback,
			EndCallback end,
			string id, 
			params VirusPlayer[] players) 
		{
			Random rand = new Random();
			PerformedMove = callback;
			UpdatePieces = piecesCallback;
			End = end;
			PlayerID = id;
			this.virus = virus;
			this.immediateAI = true;
			this.MouseClick += MouseClickHandler1;
			tileSize = 49;
			this.Size = new Size(
				virus.Size * tileSize + 17,
				virus.Size * tileSize + 55);
			int smallestSide = this.Size.Height < this.Size.Width ? this.Size.Height : this.Size.Width;
			tileSize = smallestSide / virus.Size;
			this.players.Add(new VirusPlayer("Player 0", "", Color.White));
			this.players.AddRange(players);
			while (this.players.Count < virus.Players + 1) {
				this.players.Add(new VirusPlayer("BruteAI","AI",Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256))));
			}
			//Save("Lalalafil");
			agents = new Agent[this.players.Count];
			int n = 1;
			for (byte i = 1; i < this.players.Count; i++) {
				String p = this.players[i].Name;
				switch (p) {
					case "AIQ":
						agents[i] = new QAgent(i);
						if (File.Exists("TrainingData.Q") && File.Exists("TrainingData.N")) {
							((QAgent)agents[i]).Load("TrainingData");
							((QAgent)agents[i]).TurnOffExploration();
							((QAgent)agents[i]).TurnOffLearning();
						}
						//this.players[i].Name = "AI " + n;
						n++;
						break;
					case "AIMQ":
						agents[i] = new MemoryQAgent(i);
						if (File.Exists("TrainingData.Q") && File.Exists("TrainingData.N")) {
							((MemoryQAgent)agents[i]).Load("TrainingData");
							((MemoryQAgent)agents[i]).TurnOffExploration();
						}
						//this.players[i].Name = "AI " + n;
						n++;
						break;
					case "AIMinimax":
						agents[i] = new MinimaxAgent(4,i);
						//this.players[i].Name = "AI " + n;
						n++;
						break;
					case "AIMiniMaxMix":
						if (File.Exists("TrainingData.Q"))
							agents[i] = new MiniMaxMixAgent("TrainingData", 2, i);
						else
							agents[i] = new BruteForceAgent(i);
						//this.players[i].Name = "AI " + n;
						n++;
						break;
					case "AIMixed":
						agents[i] = new MixedAgent(0.5,false,i);
						//this.players[i].Name = "AI " + n;
						n++;
						break;
					case "AIBrute":
						agents[i] = new BruteForceAgent(i);
						//this.players[i].Name = "AI " + n;
						n++;
						break;
					case "AIRandom":
						agents[i] = new RandomAgent(i);
						//this.players[i].Name = "AI " + n;
						n++;
						break;
					case "AISimple":
						agents[i] = new SimpleAgent(i);
						//this.players[i].Name = "AI " + n;
						n++;
						break;
				}
			}

			message = this.players[1].Name + "'s turn";

			/*colors = new Color[virus.Players + 1];
			colors[0] = Color.White;
			colors[1] = Color.FromArgb(128, 160, 255);
			colors[2] = Color.FromArgb(96, 255, 96);
			if(virus.Players > 2)
				colors[3] = Color.FromArgb(255, 96, 96);
			if(virus.Players > 3)
				colors[4] = Color.FromArgb(255, 255, 64);
			
			for (int i = 5; i <= virus.Players; i++)
				colors[i] = Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256));*/
		}