2016-12-14 21 views
0

最近、Berkley Pacman AIコースで作業しています。アルファ、イプシロン、ガンマの変化する値が私たちのAIに与える影響を分析する必要があります。cmdで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); 

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)クラスを参照してください。 1つを受け入れる[Process.Start](https://msdn.microsoft.com/en-us/library/0w4h05yb(v = vs.110).aspx)のオーバーロードがあります。 –

答えて

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) 
} 

パックマン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; 
    } 
} 

私はあなたが最初にすべての構築できるので、任意の構文エラーを言い訳してください

+0

これは非常に顕著です!私は今日それに取り組む時間がないが、私が見ていることをたくさん感じる。 C#で他のプロセスを管理することは一度もありませんでしたので、私は自分でこれを行うことはできませんでした。 –

+0

ファイルパスに何か問題がありました。それを理解しようとしています。あなたは 'psi.UseShellExecute = false;'を追加するのを忘れていましたが、今はそれを修正しました。 –

+0

@RichardDirvenこれがあなたのために働いたのですか?私はProcessesで最近少ししか作業していませんでしたので、このコードをテストするためのセットアップはありませんでしたので、私は興味があります。 – JaredStroeb

0

IDEにこの外を書きました*すべての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

私のプログラムはまた、一時的なバットファイルを数回変更する必要がありますか? –

+0

私はあなたがそれを必要に応じて実行し、実行し、後でそれを削除することを想像します。つまり、上記のようにCMD.EXEコマンドをポンピングして閉じ、次にProcess.Start()でそれを実行すると、 'myfile.bat'というテキストファイルへのストリームを開きます。 –

関連する問題