2016-12-14 5 views
0

Недавно мы работали с курсом Berkley Pacman AI. Мы должны проанализировать, какие изменения альфа, эпсилон и гамма влияют на наш ИИ.Выполнение серии команд с C# в 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); 

Altough он открывает CMD, кажется, ничего не делать. Также каталог CMD - это каталог моего решения. Это должно быть довольно просто (с Windows API достаточно сложно работать)

Может ли кто-нибудь помочь или дать мне общее решение?

+1

http://stackoverflow.com/questions/1469764/run-command-prompt-commands? – FakeCaleb

+0

Подождите, каков ваш вопрос? Вы заявили о проблеме, но не указали, что хотите. – Frecklefoot

+1

Во-первых, вам действительно не нужно запускать cmd.exe - вы можете просто запустить 'pacman.py' напрямую. Чтобы установить рабочий каталог, просмотрите класс [ProcessStartInfo] (https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo (v = vs.110) .aspx). Существует перегрузка [Process.Start] (https://msdn.microsoft.com/en-us/library/0w4h05yb (v = vs.110) .aspx), которая принимает ее. –

ответ

1

Попробуйте класс ProcessStartInfo. MSDN ProcessStartInfo

Поскольку это для курса ИИ. Я мог бы сделать класс 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 Агент Класс:

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 поэтому, пожалуйста, простите синтаксические ошибки

+0

Это замечательно! У меня сегодня нет времени, чтобы работать над этим, но делает много смысла, что я вижу. Я не мог бы сделать это сам, так как я никогда не работал с управлением другими процессами с помощью C# –

+0

Что-то не так с файловой дорожкой сейчас. Попытка понять это. Вы также забыли добавить 'psi.UseShellExecute = false;' но исправили это сейчас. –

+0

@RichardDirven В итоге это работает для вас? Недавно я недавно работал с Processes, и у меня не было ничего, чтобы проверить этот код, поэтому мне интересно. – JaredStroeb

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(); 

Вы можете также сделать процесс перенаправления это стандартный вывод и прочитайте его в строковой переменной в C#, если вы не хотите ее пересылать в пакетном файле.

+0

Итак, моя программа также должна будет изменить временный файл bat пару раз? –

+0

Я бы хотел создать его на ходу, как вам нужно, выполнить его и удалить его впоследствии. Таким образом, вы открываете поток в текстовый файл с именем «myfile.bat», перекачиваете команды CMD.EXE, как описано выше, закрываете его, а затем запускаете его с помощью Process.Start() –

 Смежные вопросы

  • Нет связанных вопросов^_^