最近我们一直在使用Berkley Pacman AI课程。我们必须分析alpha,epsilon和gamma的变化值对AI的影响。
要将命令直接插入CMD,我们告诉CMD:
pacman.py -q -p PacmanQAgent -x 2000 -n 2010 -l smallGrid -a epsilon=0.08,alpha=0.3,gamma=0.7
现在,我想运行一系列测试,我们更改这些给定变量的值。所以我想打开CMD,运行很多命令(基本上是相同的)并将输出保存在文本文件中。我在StackExchange上找到了一些信息,它给了我以下代码:
string command = "pacman.py -q -p PacmanQAgent -x 2000 -n 2010 -l smallGrid -a epsilon=0.08,alpha=0.3,gamma=0.7";
Process.Start("CMD.exe", command);
尽管它打开了CMD,似乎没有做任何事情。此外,CMD的目录是我的解决方案的目录。 这应该是相当容易的(Altough Windows API可能很难使用)
任何人都可以帮忙,或者给我一个通用的解决方案吗?
答案 0 :(得分:1)
尝试ProcessStartInfo类。 MSDN ProcessStartInfo
因为这是一个AI课程。我可能会做一个PacmanArgument
课程。 PacmanArgument
将为每个可能的命令行参数和要调用的自定义ToString
方法提供属性。这样可以更容易地以编程方式生成类似遗传算法的参数,假设输出可以被视为适应性。
主要功能:
double MAX_EPSILON = 1; //I assume there are constraints
//create packman agent with initial values
PacmanAgent agent = new PackmanAgent(0,0,0) //epsilon,alpha,gamma
//create Process info
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "pacman.py"
psi.WorkingDirectory = @"C:/FilePathToPacman"
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
string output;
Console.WriteLine("***** Increasing Eplison Test *****");
while( agent.Epsilon =< MAX_EPSILON )
{
psi.Arguments = agent.GetArgument();
// Start the process with the info we specified.
// Call WaitForExit and then the using-statement will close.
using (Process process = Process.Start(psi))
{
output = process.StandardOutput.ReadToEnd(); //pipe output to c# variable
process.WaitForExit(); //wait for pacman to end
}
//Do something with test output
Console.WriteLine("Epsilon: {0}, Alpha: {1}, Gamma: {2}",agent.Epsilon,agent.Alpha,agent.Gamma );
Console.WriteLine("\t" + output);
agent.IncrementEpsilon(0.05); //increment by desired value or default(set in IncrementEpsilon function)
}
Pacman Agent类:
public class PacmanAgent
{
private string ArgumentBase = "-q -p PacmanQAgent -x 2000 -n 2010 -l smallGrid -a ";
[Range(0, 1, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
public double Epsilon { get; set; }
[Range(0, 1, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
public double Alpha { get; set; }
[Range(0, 1, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
public double Gamma { get; set; }
public PacmanAgent(int epsilon, int alpha , int gamma )
{
Epsilon = epsilon;
Alpha = alpha;
Gamma = gamma;
}
public string GetArgument()
{
string argument = string.Format("{0} epsilon={1}, alpha={2}, gamma={3}", ArgumentBase, Epsilon, Alpha, Gamma)
return argument
}
public void IncrementEpsilon(double i = 0.01)
{
Epsilon += i;
}
public void IncrementAlpha(double i = 0.01)
{
Alpha += i;
}
public void IncrementGamma(double i = 0.01)
{
Gamma += i;
}
}
*我在IDE上写了这个,所以请原谅任何语法错误
答案 1 :(得分:0)
您首先可以构建一个包含所有pacman.py命令的临时批处理文件。使用标准方法在C#中创建文件。使用标准CMD.EXE管道功能附加到文件(下面的myfile.txt)。
您的临时.BAT文件如下:
cd \mydirectory
pacman.py -q -p PacmanQAgent -x 2000 -n 2010 -l smallGrid -a epsilon=0.08,alpha=0.3,gamma=0.7 >> myfile.txt
pacman.py -q -p PacmanQAgent -x 2000 -n 2010 -l smallGrid -a epsilon=0.08,alpha=0.3,gamma=0.7 >> myfile.txt
pacman.py -q -p PacmanQAgent -x 2000 -n 2010 -l smallGrid -a epsilon=0.08,alpha=0.3,gamma=0.7 >> myfile.txt
然后以与您已使用的方法类似的方式运行它:
var command = "mytemp.bat"
processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
process = Process.Start(processInfo);
process.WaitForExit();
如果你不想在批处理文件中输入它,你也可以让Process重定向它的标准输出并将其读入C#中的字符串变量。