初めまして。遺伝的アルゴリズムを使って最適配置を探すプログラムをC++にて作ろうとしています。
配列a[500]にランダムで0か1を入力し、要素が1ならばそこに配置というように符号化を考えています。
今回、配置する箇所の数的制限を作って、その数以内で配置したいと考えています。
つまり、a[500]の要素のうち、1の入る箇所をたとえば150箇所以内としたいのです。
私の考えた方法は、
①配列a[500]にランダムに0、1を入力
②配列a[500]の要素の総和を計算
③②の総和が150以上の場合、配列のどこかを(ランダムで)0に置き換える
④②へ繰り返し
という形です。
この方法の③の箇所、「配列のどこかを(ランダムで)0に置き換える」ことをしたいのですが、どのような方法がありますでしょうか?
また、上記の方法はとても効率的には見えません。もっと効率の良い方法があれば教えていただけると幸いです。
なお、配列内の要素の順番は入れ替えることはできません。(最適配置を探しているため)
また、0、1がすでにランダムで入力された状態であることが前提です。配列に入力する段階での工夫はできません。(アルゴリズム内で交叉させるため)
以上になります。お時間があれば返信をよろしくお願いします。
配列の要素にランダムで入力
Re: 配列の要素にランダムで入力
この方法はどうでしょうか?
1.a[500]のうちa[0]を1、a[1~149]をランダムに0か1とし、残りを0とする。
2.aの中身をシャッフルする。
コード
1.a[500]のうちa[0]を1、a[1~149]をランダムに0か1とし、残りを0とする。
2.aの中身をシャッフルする。
コード
► スポイラーを表示
Re: 配列の要素にランダムで入力
わざわざソースまでありがとうございます。
残念ながら、シャッフルする点で私の考えているものとズレが生じています。
配列に含まれる1、0は設備の配置を表しているため、順序を変えることはできません。
ランダムにa[500]まで0か1がすでにびっしり埋まっている状態から、工夫をしなければなりません。
すでに配列に含まれている1のうち、150個を超えた分をどうにかしてランダムで0に変換したいのです。
丁寧に書いていただいたのに、申し訳ないです。
わかりにくい問題ですいません。
残念ながら、シャッフルする点で私の考えているものとズレが生じています。
配列に含まれる1、0は設備の配置を表しているため、順序を変えることはできません。
ランダムにa[500]まで0か1がすでにびっしり埋まっている状態から、工夫をしなければなりません。
すでに配列に含まれている1のうち、150個を超えた分をどうにかしてランダムで0に変換したいのです。
丁寧に書いていただいたのに、申し訳ないです。
わかりにくい問題ですいません。
Re: 配列の要素にランダムで入力
②で1の個数を数えながら、vector<int>に1のindexをpush_back。
vectorをrandom_shuffle。
150を超えた分だけ、vectorの先頭のindexが指す要素を0にする。
vectorをrandom_shuffle。
150を超えた分だけ、vectorの先頭のindexが指す要素を0にする。
Re: 配列の要素にランダムで入力
beatleさんの方法でできるようです!
ありがとうございます!
その他、返信していただいた方々、返信しようと考えてくださった方々、ありがとうございました。
非常に助かりました。
難しいことではなかったですが、自分ではなかなか思いつけませんでした。
重ねてお礼申し上げます。
ありがとうございます!
その他、返信していただいた方々、返信しようと考えてくださった方々、ありがとうございました。
非常に助かりました。
難しいことではなかったですが、自分ではなかなか思いつけませんでした。
重ねてお礼申し上げます。