satomi3951のプロフィール
- ベストアンサー数
- 98
- ベストアンサー率
- 71%
- お礼率
- 0%
- 登録日2010/11/16
- VC# 強化学習
VC#2010で強化学習のプログラムを作ろうと考えているのですが、 実行すると「NullReferenceExceptionはハンドルされませんでした。 オブジェクト参照がオブジェクト インスタンスに設定されていません。」 というエラーが出てプログラムが動きません。 ソースは static public Random rnd; static void Main(string[] args) { double[][] Qtable; //Qtable double Q_max = 0;//Q値の最大値 double reward = 0; //報酬 double alpha = 0.5;//学習係数 double gamma = 0.9;//減衰係数 int epsilon = 10;//行動を無作為に選ぶ確率[%] int trial_max = 100;//試行回数 int num_a = 2;//行動の数 int num_s = 2;//状態の数 int a = 0;//行動 int s = 0;//状態 int sd = 0;//行動の実行によって遷移する状態 int i, j; //メモリー空間の確保 Qtable = new double [num_s][]; for (i = 0; i < num_s; i++) { Qtable[i] = new double[num_a]; } //Q値の初期化 for (i = 0; i < num_s; i++) { for (j = 0; j < num_a; j++) { Qtable[i][j] = 0; Console.WriteLine("Q[{0}][{1}]={2}\n", i, j, Qtable[i][j]); } } //試行開始 for (i = 0; i < trial_max; i++) { //行動の選択 a = epsilon_greedy(epsilon, s, num_a, Qtable); a = 1; //行動の実行 reward = vending_machine(s, a, sd); //sdにおけるQ値の最大値を求める Q_max = max_Qval(sd, num_a, Qtable); //Q値の更新 Qtable[s][a] = (1 - alpha) * Qtable[s][a] + alpha * (reward + gamma * Q_max); s = sd; Console.WriteLine("i={0}\n", i); if (reward > 0) { Console.WriteLine("成功\n", a); } if (reward == 0) { Console.WriteLine("失敗\n", a); } } //Qtableの表示 for (i = 0; i < num_s; i++) { for (j = 0; j < num_a; j++) { Console.WriteLine("{0} ", Qtable[i][j]); } Console.Write("\n"); } return; } static double vending_machine(int s, int a, int sd) { double reward; if (a == 0) { if (s == 0) sd = 1; if (s == 1) sd = 0; reward = 0; } else { if (s == 1) { sd = s; reward = 10; } else { sd = s; reward = 0; } } return reward; } static double max_Qval(int s, int num_a, double [][] Qtable) { double max; int i = 0; max = Qtable[s][0]; for (i = 1; i < num_a; i++) { if (Qtable[s][i] > max) { max = Qtable[s][i]; } } return max; } static int select_action(int s, int num_a, double [][] Qtable) { double max; int i = 0; int[] i_max; i_max = new int[num_a]; int num_i_max = 1; int a; i_max[0] = 0; max = Qtable[s][0]; for (i = 1; i < num_a; i++) { if (Qtable[s][i] > max) { max = Qtable[s][i]; num_i_max=1; i_max[0]=i; } else if (Qtable[s][i] == max) { num_i_max++; i_max[num_i_max - 1] = i; } } int seed = Environment.TickCount; rnd = new Random(seed++); a = i_max[rnd.Next(num_i_max)]; return a; } static int epsilon_greedy(int epsilon, int s, int num_a, double [][] Qtable) { int a; if (epsilon > rnd.Next(100)) { //無作為に行動を選択 a = rnd.Next(num_a); } else { //最大のQ値を持つ行動を選択 a = select_action(s, num_a, Qtable); } return a; } のような感じです。 どなたか分かる方がいれば、教えていただけるとありがたいです。 よろしくお願いします。
- C#で開発できるかどうか教えてください part1
開発言語として、C#を選択し、GUIを作成しようと考えています。 ネットで検索しているとC#は'windows'向けというキーワードがたくさん みうけられるため、これからお話しする条件を満たすことが出来るのか 知りたくてご質問させていただきたく。 まず画面のレイアウト的な部分は抜きにして、ボタンを押した後の 処理について。 'linux'上であるスクリプトを作成しておき、そのスクリプトが一連の処理を 'linux'上でするとしてます。実行方法として、 スクリプトファイル名 引数1 引数2 である処理が流れるとします。 C#のGUIで、引数1 引数2を入力し、ボタンを押した瞬間に 'linux'のスクリプト処理が始まることを実現したいのですが できるのでしょうか? C#はwindows系ということからlinuxに連動させることができるのか どうも引っかかるのです。 よろしくおねがいいたします。
- ベストアンサー
- C・C++・C#
- torajiro123
- 回答数9
- VC# 強化学習
VC#2010で強化学習のプログラムを作ろうと考えているのですが、 実行すると「NullReferenceExceptionはハンドルされませんでした。 オブジェクト参照がオブジェクト インスタンスに設定されていません。」 というエラーが出てプログラムが動きません。 ソースは static public Random rnd; static void Main(string[] args) { double[][] Qtable; //Qtable double Q_max = 0;//Q値の最大値 double reward = 0; //報酬 double alpha = 0.5;//学習係数 double gamma = 0.9;//減衰係数 int epsilon = 10;//行動を無作為に選ぶ確率[%] int trial_max = 100;//試行回数 int num_a = 2;//行動の数 int num_s = 2;//状態の数 int a = 0;//行動 int s = 0;//状態 int sd = 0;//行動の実行によって遷移する状態 int i, j; //メモリー空間の確保 Qtable = new double [num_s][]; for (i = 0; i < num_s; i++) { Qtable[i] = new double[num_a]; } //Q値の初期化 for (i = 0; i < num_s; i++) { for (j = 0; j < num_a; j++) { Qtable[i][j] = 0; Console.WriteLine("Q[{0}][{1}]={2}\n", i, j, Qtable[i][j]); } } //試行開始 for (i = 0; i < trial_max; i++) { //行動の選択 a = epsilon_greedy(epsilon, s, num_a, Qtable); a = 1; //行動の実行 reward = vending_machine(s, a, sd); //sdにおけるQ値の最大値を求める Q_max = max_Qval(sd, num_a, Qtable); //Q値の更新 Qtable[s][a] = (1 - alpha) * Qtable[s][a] + alpha * (reward + gamma * Q_max); s = sd; Console.WriteLine("i={0}\n", i); if (reward > 0) { Console.WriteLine("成功\n", a); } if (reward == 0) { Console.WriteLine("失敗\n", a); } } //Qtableの表示 for (i = 0; i < num_s; i++) { for (j = 0; j < num_a; j++) { Console.WriteLine("{0} ", Qtable[i][j]); } Console.Write("\n"); } return; } static double vending_machine(int s, int a, int sd) { double reward; if (a == 0) { if (s == 0) sd = 1; if (s == 1) sd = 0; reward = 0; } else { if (s == 1) { sd = s; reward = 10; } else { sd = s; reward = 0; } } return reward; } static double max_Qval(int s, int num_a, double [][] Qtable) { double max; int i = 0; max = Qtable[s][0]; for (i = 1; i < num_a; i++) { if (Qtable[s][i] > max) { max = Qtable[s][i]; } } return max; } static int select_action(int s, int num_a, double [][] Qtable) { double max; int i = 0; int[] i_max; i_max = new int[num_a]; int num_i_max = 1; int a; i_max[0] = 0; max = Qtable[s][0]; for (i = 1; i < num_a; i++) { if (Qtable[s][i] > max) { max = Qtable[s][i]; num_i_max=1; i_max[0]=i; } else if (Qtable[s][i] == max) { num_i_max++; i_max[num_i_max - 1] = i; } } int seed = Environment.TickCount; rnd = new Random(seed++); a = i_max[rnd.Next(num_i_max)]; return a; } static int epsilon_greedy(int epsilon, int s, int num_a, double [][] Qtable) { int a; if (epsilon > rnd.Next(100)) { //無作為に行動を選択 a = rnd.Next(num_a); } else { //最大のQ値を持つ行動を選択 a = select_action(s, num_a, Qtable); } return a; } のような感じです。 どなたか分かる方がいれば、教えていただけるとありがたいです。 よろしくお願いします。
- 01722 数値が無効です
ドラえもん 2012-10-29(月) 10:30 ホームページで公開されていたVBAを流用して、EXCELからデータベースの更新、削除をしようとしています。 データベースの更新に関してはうまく動作するのですが、データ削除を実施すると、 440)データをフェッチ中にエラーが発生しました。ORA-01722数値が無効です。 というエラーが発生してしまいます。 01722のエラー内容をホームページ並びに、本サイトで検索したのですが、 データの型が違うという内容で、類似の内容が無い状況でした。 型が違うという内容に対して、何をどうしたらよいかが分かりません。 コーディングのミスを指摘いただきたく よろしくお願いいたします。 VBAまったくの初心者です。 下記は、マクロの構成です。 (1)B3からR***の領域にデータベースからダウンロードしたデータが表示される。 ***は列数でデータベースの項目数で変化する (2)B2からR2には項目名称が表示されている。 (3)編集用の領域はT2からAJ2に(2)と同じ項目名を表示する。 (4)編集用のデータ領域はT3からAJ20まで。 ※ID並びにパスワードは実際のものから変更しています。 ORACLE9.0 EXCEL2003 ------------------------------------------------------------- '「データの削除」ボタン押下後の処理 ' oo4o使用時 Private Sub btnDeleteDataoo4o_Click() On Error GoTo ERR_HANDLER 'oo4o用のオブジェクト変数の宣言 Dim OraSession As Object 'セッション Dim OraDatabase As Object 'データベース Dim rs As Object 'データセット(レコードセット) Dim rownum As Long Dim colnum As Integer Dim sSQL As String '削除対象のみを抽出するSQL文の作成 sSQL = "select * from M_TOOL_MEISAI where LINECD=" & ActiveSheet.Cells(3, 20) For rownum = 4 To 20 If ActiveSheet.Cells(rownum, 20) = "" Then Exit For End If sSQL = sSQL & " OR LINECD=" & ActiveSheet.Cells(rownum, 20) Next 'oo4oセッションオブジェクトの生成 Set OraSession = CreateObject("OracleInProcServer.XOraSession") 'oo4oデータベースオブジェクトの生成(DBへUserID:○、パスワード:×で接続) Set OraDatabase = OraSession.OpenDatabase(ActiveSheet.Cells(26, 1), "○/×", 0&) 'oo4oデータセット(レコードセット)の生成(削除対象データのみを返すレコードセットの生成) Set rs = OraDatabase.CreateDynaset(sSQL, 0&) 'レコードセット内の全レコードの削除 Do Until rs.EOF rs.Delete rs.MoveNext Loop 'オブジェクトのクローズ rs.Close 'データ表示の更新 btnGetDataoo4o_Click QUIT_OPER: 'オブジェクト変数用に確保したメモリの開放 Set rs = Nothing Set OraDatabase = Nothing Set OraSession = Nothing Exit Sub ERR_HANDLER: 'エラー処理 'エラー番号とエラー内容の表示 MsgBox Err.Number & ")" & Err.Description Err.Clear GoTo QUIT_OPER End Sub ------------------------------------------------------------------------------- 以上がエラーが発生するVBA 下記は、更新処理で正しく動作するVBA ------------------------------------------------------------------------------- '「データの更新」ボタン押下後の処理 ' oo4o使用時 Private Sub btnUpdateDataoo4o_Click() On Error GoTo ERR_HANDLER 'oo4o用のオブジェクト変数の宣言 Dim OraSession As Object 'セッション Dim OraDatabase As Object 'データベース Dim rs As Object 'データセット(レコードセット) Dim rownum As Long Dim colnum As Integer 'oo4oセッションオブジェクトの生成 Set OraSession = CreateObject("OracleInProcServer.XOraSession") 'oo4oデータベースオブジェクトの生成(DBへUserID:○、パスワード:×で接続) Set OraDatabase = OraSession.OpenDatabase(ActiveSheet.Cells(26, 1), "○/×", 0&) 'oo4oデータセット(レコードセット)の生成(全データを返すレコードセットの生成) Set rs = OraDatabase.CreateDynaset("select * from M_TOOL_MEISAI", 0&) 'データの更新 For rownum = 3 To 20 If ActiveSheet.Cells(rownum, 20) = "" Then Exit For End If '更新対象データの検索 rs.Findfirst ("LINECD=" & ActiveSheet.Cells(rownum, 20)) '編集モードに設定 rs.Edit For colnum = 1 To rs.Fields.Count - 1 Select Case rs(colnum).Type Case 10 rs(colnum).Value = ActiveSheet.Cells(rownum, colnum + 20) Case 8 rs(colnum).Value = CDate(ActiveSheet.Cells(rownum, colnum + 20)) Case Else rs(colnum).Value = ActiveSheet.Cells(rownum, colnum + 20) End Select Next rs.Update Next 'オブジェクトのクローズ rs.Close 'データ表示の更新 btnGetDataADO_Click QUIT_OPER: 'オブジェクト変数用に確保したメモリの開放 Set rs = Nothing Set OraDatabase = Nothing Set OraSession = Nothing Exit Sub ERR_HANDLER: 'エラー処理 'エラー番号とエラー内容の表示 MsgBox Err.Number & ")" & Err.Description Err.Clear GoTo QUIT_OPER End Sub
- EUC-JPのファイルをutf-8に変換したい
EUC-JPで書かれたデータをpythonで形態素解析しようと思っています。 pythonにはutf-8がデフォルトとなっているmecabが入っています。 名詞のみを取り出したいのですが、文字コードのせいなのか、条件分岐がうまくできません。 EUC-JPの文章をutf-8で形態素解析すれば整合性がとれてうまくいくとおもうのですが、どのようにすればいいのでしょうか。よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- thjki6624
- 回答数3