課題1が
Individual *create_generation(void) { return (Individual *)malloc(sizeof(Individual) * num_ind); }というのはわかったのですが, 課題2以降から手も足も出ず, 四苦八苦しています.
ほぼ丸投げのような状態で大変恐縮ですが, どうか皆さんのお力添えを頂きたく存じます.
長くなりますので, プログラム本体は別で投稿いたします.
長文で申し訳ないですが, 何卒宜しくお願い申し上げます.
遺伝的アルゴリズムで巡回セールスマン問題を解く ・ 遺伝的アルゴリズムにおける処理の流れ Step0: 巡回セールスマン問題を遺伝的アルゴリズムで解くための前処理(課題2) ↓ Step1: 親の世代に属する全個体と、子の世代に属する全個体を生成(課題1) ↓ Step2: 親の世代に属する各個体の遺伝子型(都市の巡回経路)、適応度を設定(課題3,4,5) ↓ Step3: 交叉(両親の遺伝子型を混ぜ合わせる)に参加する親(2個体)を選択(課題6,7) ↓ Step4: 交叉を実行し、子(2個体)の遺伝子型を仮決定(課題10) ↓ Step5: 子の遺伝子を突然変異させ(課題8)、子の遺伝子型を最終決定 ↓ Step6: 複数の親に対してStep3-5を実行し、次世代の子(子の世代)を決定(課題11) ↓ Step7: 子を新たな親にする(copy_generation関数) ↓ Step8: 新たな親の世代で適応度が最大、最小の個体を決定(課題9) ↓ Step9: Step3へ (Step3-9の処理を1世代。これをN世代繰り返す) ・ 巡回セールスマン問題 課題は各都市を0から9で表し, 都市iと都市j間の距離をdouble型配列distの(i, j)要素に格納する(i, jは0から9). ・ 配列dist 0 1 2 3 4 5 6 7 8 9 → j 0 0.0 0.2 0.001 1.4 2.1 9.1 20.1 29.0 9.0 10.0 1 0.2 0.0 45.5 1.0 0.1 0.01 22.1 2.1 0.1 120.0 2 0.001 45.5 0.0 55.0 10.0 0.01 0.002 0.01 2.01 200.1 3 1.4 1.0 55.0 0.0 4.0 2.1 0.01 1.1 20.1 40.0 4 2.1 0.1 10.0 4.0 0.0 22.1 90.0 22.0 1.0 1.0 5 9.1 0.01 0.01 2.1 22.1 0.0 79.0 2.1 0.1 2.0 6 20.1 22.1 0.002 0.01 90.0 79.0 0.0 0.1 4.1 0.01 7 29.0 2.1 0.01 1.1 22.0 2.1 0.1 0.0 3.1 30.1 8 9.0 0.1 2.01 20.1 1.0 0.1 4.1 3.1 0.0 10.1 9 10.0 120.0 200.1 40.0 1.0 2.0 0.01 30.1 10.1 0.0 ↓ i ・ 最短巡回経路 都市0→都市1→都市5→都市8→都市4→都市9→都市6→都市3→都市7→都市2→都市0 ・ 巡回経路距離の例 ある個体のgenoが|0|2|3|5|1|9|4|7|8|6|のとき セールスマンの巡回径路: 都市0→都市2→都市3→都市5→都市1→都市9→都市4→都市7→都市8→都市6(→都市0) 巡回経路距離 = dist[0][2] + dist[2][3] + dist[3][5] + dist[5][1] + dist[1][9] + dist[9][4] + dist[4][7] + dist[7][8] + dist[8][6] + dist[6][0] ・ 距離データファイル データの区切り: ホワイトスペース データの並びと距離データd[j]の関係: ・ 1行目から始める. i,jの初期値は0. ・ 左端から右端に向けて, データがある毎にjを1ずつ増加する. ・ jがNum_City-1なったら, iを1増やし, jは0にする. ・ 行末まで来たら, 次の行の左端へ行く. ・ 距離データファイルの例(Num_City = 10) 0.0 0.2 0.001 1.4 2.1 9.1 20.1 29.0 9.0 10.0 0.2 0.0 45.5 1.0 0.1 0.01 22.1 2.1 0.1 120.0 0.001 45.5 0.0 55.0 10.0 0.01 0.002 0.01 2.01 200.1 1.4 1.0 55.0 0.0 4.0 2.1 0.01 1.1 20.1 40.0 2.1 0.1 10.0 4.0 0.0 22.1 90.0 22.0 1.0 1.0 9.1 0.01 0.01 2.1 22.1 0.0 79.0 2.1 0.1 2.0 20.1 22.1 0.002 0.01 90.0 79.0 0.0 0.1 4.1 0.01 29.0 2.1 0.01 1.1 22.0 2.1 0.1 0.0 3.1 30.1 9.0 0.1 2.01 20.1 1.0 0.1 4.1 3.1 0.0 10.1 10.0 120.0 200.1 40.0 1.0 2.0 0.01 30.1 10.1 0.0 ・ 突然変異 二つの遺伝子(都市)をランダムに選び交換する操作 例. 遺伝子2,6に突然変異 ↓ ↓ 遺伝子型: |0|2|4|3|6|1|7|5|8|9| → |0|6|4|3|2|1|7|5|8|9| 遺伝子(都市)2と6を交換
以上が課題の説明文です. 加えて, 適応度に関する画像も添付しておきます.