プロが教える店舗&オフィスのセキュリティ対策術

私は機会系の大学生のものです。

今回は
2次関数の最小値をプログラムのC言語と遺伝的アルゴリズム(GA)を用いて求めたいのですが
私がC言語が素人のためプログラムを作れません...。例として教えていただけると幸いです。

よろしくお願い致します。

質問者からの補足コメント

  • 補足失礼します。

    ・関数はy=(x-1)^2+2
    ・親個体は(-10<=X<=10)の中から選択
    この設定でお願いします。

      補足日時:2016/08/16 00:13
  • 遅くなってすいません、補足します。

    今回はアルゴリズムを作成せうる練習として、2次関数を例として取り組むのが目的でした。

    プログラムを実行することができました!
    それと関数を少数対応のものにしたいです。ご教授お願いします。

      補足日時:2016/08/23 01:39

A 回答 (5件)

作ってみた


https://gist.github.com/otaks/3c6eebea260ce1296d …

各遺伝子は5要素の配列から成っており、
[3][2][1][0]を2進数に見立てて、これを10進数に変換し
[4]を元に符号をつけている。

ユーザ入力は以下を参考に。
(平方完成後の値を入力するようになっています)
y=a(x+q)2+q
(minx<=x<=maxx)

50世代ぐらい回せば正解が出そう。

中学校当たりの問題は解けそうだけど、今の作りだとxが-15~15しか
表現できないし、精度は整数レベルなので、より難しい問題を解くならば
改造が必要。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
プログラムの説明も入れてもらいありがとうございます。

すいません、失礼なんですが自分の端末でプログラムを実行したところエラーがでてしまいました・・・。
niji.c: In function ‘getDeci’:
niji.c:34: error: ‘for’ loop initial declarations are only allowed in C99 mode
niji.c:34: note: use option -std=c99 or -std=gnu99 to compile your code
niji.c: In function ‘calcIndividual’:
niji.c:51: error: ‘INT_MIN’ undeclared (first use in this function)
niji.c:51: error: (Each undeclared identifier is reported only once
niji.c:51: error: for each function it appears in.)
niji.c:45: 警告: unused variable ‘item’
niji.c: In function ‘main’:
niji.c:162: 警告: unused variable ‘item’

すいませんバグ取りができないのでお手数ですが見てもらってもよろしいでしょうか...?

お礼日時:2016/08/16 00:28

No.3のそれっぽい修正してみた


https://ideone.com/cB8BQq
    • good
    • 0
この回答へのお礼

ありがとうございます!
関数と値を少数対応のものにしたいのですがどうずればよいでしょうか?ご教授お願いします。

お礼日時:2016/08/23 01:40

そもそも、なぜGAを使って1パラメータの2次関数の最小値を求めたいのですか?



というのも、このような単調な解空間での最適値を求める問題は、
ヒューリスティックアルゴリズムの中でもGAは最も適していない方法の一つだと思います。
    • good
    • 0

C言語が素人なのに、何故C言語とGAで求めたいのかが疑問なのですが……



それはさておき
C言語ができないのは分かりましたが、GAで最小値を求める方法はご存知なのですよね?
まず、その方法(というか仕様)をご提示ください。

ぱっと考えただけでも以下の不明点があります(他にもあるかもしれません)
・対象の2次関数をどうやってプログラムに与えるのか?
・2次関数f(x)において、xの範囲はどうするのか、それをどうやってプログラムに与えるのか?
・個体数は幾つか? それをどうやってプログラムに与えるのか?
・遺伝子として、何の情報をどのような表現で表すのか?
 ・それに伴い、淘汰、変異および交叉をどのような方法・確率で行うのか?
・何世代の計算をおこなうのか、それをどうやってプログラムに与えるのか?


何方かがC言語のプログラムを提示したいと思っていたとしても、仕様が不明ではプログラムを作成しようがありません。
お急ぎであるならば、それこそ詳しい仕様のご提示が必要となります。
    • good
    • 0

> C言語と遺伝的アルゴリズム



この2つは、別のカテゴリーのものです。
C言語で書かれた遺伝的アルゴリズム、というのも有ります。


まずは「2次関数の最小値を求める方法」を考えて、それをC言語で書きます。


y=ax^2 + bx + c ただし、 t≦x≦s
のときの最小値の求め方、わかりますよね?大学入試とかでも出てきますから。
一番簡単なのは、それをそのままC言語の条件分岐と計算式で書くことです。

他にも、数値解析的に解くとか、微分して増減表を作って解くとか、それこそ「遺伝的アルゴリズム」で解くとか。



そもそも、解き方の違いを明確にするものならば、C言語である必要はないはずです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!