それでは、始める前に、この TSP 問題について詳しく説明しましょう。デジタル モデリングを行ったことがある友人や、インテリジェントな最適化や機械学習を経験したことがある友人は、このことを知っているはずです。もちろん、この記事を広く読んでいただけるよう、可能な限り完璧かつ明確にするよう最善を尽くします。ここで実際に問題を解決できるようにします。
したがって、問題は実際には単純で、次のようになります:
N 次元平面では、今日はこの 2 次元平面を使用します。 , この平面上には多くの都市があり、それらの都市は相互に接続されています。次に、すべての都市を訪問するための最短経路を見つける必要があります。たとえば、都市 A、B、C、D、E があるとします。都市間の座標がわかったので、これは都市間の距離を知ることと同じです。次に、すべての都市 A、B、C、D、E への最短経路を作成できるシーケンスを見つけることができます。例えば、計算するとB→A→C→E→Dとなる場合があります。つまり、この順序を求めてください。
この問題を最初に解決したい場合、実際には多くの解決策がありますが、率直に言うと、パスの合計が最小になる順序を見つける必要があるだけです。たとえば、最初に A を実行し、次に A に最も近いものが B であるかどうかを確認し、次に B に移動し、次に B から移動します。もちろん、これは局所的な貪欲な戦略であり、局所的な最適値に到達するのは簡単です。その後、この時点で DP を検討できます。つまり、A から開始し、その後 2 つの都市が確実に存在することを前提とします。 3 都市が最も短く、4 と 5 が最も短い。最後に、B からも同じことを仮定します。または、すべての状況を直接列挙して距離を計算します。しかし、いずれにせよ、都市の数が増加するにつれてその複雑さは増大するため、現時点では人間の専門知識をコンピューティングに利用させる方法を見つけなければなりません。私はそれを「盲目」と呼んでいます。
次に、このインテリジェント アルゴリズムと、それを使用する理由について説明します。前のソリューションでは、大量のデータに対して大量の計算が必要になると述べました。必ずしもそうとは限りませんが、簡単に書くことができます。したがって、現時点では、まず TSP 問題に関して言えば、私たちが望んでいるのはシーケンス、つまり繰り返されないシーケンスです。それでは、現時点では、より単純な解決策はあるのでしょうか? データが十分に大きい場合、それに近いものであれば、必ずしも完全に正確で完全に最小の解決策は必要ありません。したがって、現時点では、従来のアルゴリズムを使用すると、1 つは 1 です。ルールに従って計算するだけで、標準的な答えが何であるかは実際にはわかりません。また、計算を停止するためのしきい値を設定することも困難です。従来のアルゴリズム。しかし、私たち人間には「運」というものがあり、あまりに幸運すぎて、魂に入った瞬間に答えが分からなくなってしまう人もいます。つまり、私たちのインテリジェントなアルゴリズムは実際には「Monkey」に少し似ています。しかし、人々はスキルに注目します。たとえば、経験上、3 つの長いものと 1 つの短いものが最も短いことがわかります。このテクニックを使用して答えを推測することができます。または、ブロガーと同じくらいハンサムなボーイフレンドを探している場合、必要なのは40シリーズの一枚だけです(30でも大丈夫です) グラフィックカードは簡単に取り外せます。孟にはスキルが必要であり、私たちはこれを戦略と呼びます。
つまり、先ほど話したテクニック、このトリックです。インテリジェント アルゴリズムでは、このマスクが戦略の 1 つです。解決策をより合理的にするには、どうすればそれを取り除くことができるでしょうか?そしてこの時百の花が咲き始める ここではお経は唱えません 最も古典的な 2 つのアルゴリズムを例として取り上げましょう。1 つは遺伝的アルゴリズム、もう 1 つは粒子群アルゴリズム (PSO) です。一例として、彼らは遺伝的アルゴリズムなどのマスク戦略を使用しました。自然選択をシミュレートすることによって、最初にランダムに一連の解と一連の配列を生成し、次に自然選択戦略に基づいてこれらの解をスクリーニングし、次にこれらのソリューションを使用して、新しくてより良いソリューションを見つけてください。このように行ったり来たりした後、最終的に良い解決策を見つけました。粒子群も同様ですが、この部分については実際に使用する際に詳しく説明します。
この戦略についてはすでに理解しましたが、アルゴリズムとは何でしょうか?実際、これはこれらの戦略を実装するためのステップであり、コード、ループ、データ構造です。私たちは、TSP のような自然選択、大量の解をランダムに生成する方法など、今述べたことを理解する必要があります。
わかりました。ここでいくつかの基本的な概念についての説明は終わりました。この時点で、この TSP 問題をどのように表現するかを見てみましょう。これは実際には非常に簡単です。ここでは、テスト データを準備するだけです。ここには 14 の都市があると仮定します。これらの都市のデータは次のとおりです:
1 2 3 4 |
|
このデータ セットは、後でテストに使用します。すでに14都市になっています。
それでは、解決策を始めましょう
わかりました。次に、遺伝的アルゴリズムとは何なのかについて話しましょう。それから、これを使ってこの TSP 問題を解決します。 。
それでは、遺伝的アルゴリズムがどのように騙されるかを見てみましょう。
遗传算法其实是在用计算机模拟我们的物种进化。其实更加通俗的说法是筛选,这个就和我们袁老爷爷种植水稻一样。有些个体发育良好,有些个体发育不好,那么我就先筛选出发育好的,然后让他们去繁衍后代,然后再筛选,最后得到高产水稻。其实也和我们社会一样,不努力就木有女朋友就不能保留自己的基因,然后剩下的人就是那些优秀的人和富二代的基因,这就是现实呀。所以得好好学习,天天向上!
那么回到主题,我们的遗传算法就是在模拟这一个过程,模拟一个物竞天择的过程。
所以在我们的算法里面也是分为几大块
首先我们的种群需要先繁殖。这样才能不断产生优良基于,那么对应我们的算法,假设我们需要求取
Y = np.sin(10 * x) * x + np.cos(2 * x) * x
的最大值(在一个范围内)那么我们的个体就是一组(X1)的解。好的个体就会被保留,不好的就会被pass,选择标准就是我们的函数 Y 。那么问题来了如何模拟这个过程?我们都知道在繁殖后代的时候我们是通过DNA来保留我们的基因信息,在这个过程当中,父母的DNA交互,并且在这个过程当中会产生变异,这样一来,父母双方的优秀基于会被保存,并且产生的变异有可能诞生更加优秀的后代。
所以接下来我们需要模拟我们的DNA,进行交叉和变异。
这个交叉过程和我们的生物其实很像,当然我们在我们的计算机里面对于数字我们可以将其转化为二进制,当做我们的DNA
交叉的方式有很多,我们这边选择这一个,进行交叉。
那这个在我们这里就更加简单了
我们只需要在交叉之后,再随机选择几个位置进行改变值就可以了。当然变异的概率是很小的,并且是随机的,这一点要注意。并且由于变异是随机的,所以不排除生成比原来还更加糟糕的个体。
最后我们按照一定的规则去筛选这个些个体就可以了,然后淘汰原来的个体。那么在我们的计算机里面是使用了两个东西,首先我们要把原来二进制的玩意,给转化为我们原来的十进制然后带入我们的函数运算,然后保存起来,之后再每一轮统一筛选一下就好了。
这个咋说呢,说好听点叫逆转,难听点就算,对于一些新的生成的不好的解,我们是要舍弃的。
那么这部分用代码描述的话就是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
|
这个代码是以前写的,逆转没有写上(下面的有)
ok,刚刚的例子是拿的解方程,也就是说是一个连续问题吧,当然那个连续处理的话并不是很好,只是一个演示。那么我们这个的话其实类似的。首先我们的DNA,是城市的路径,也就是A-B-C-D等等,当然我们用下标表示城市。
首先我们确定了使用城市的序号作为我们的个体DNA,例如咱们种群大小为100,有ABCD四个城市,那么他就是这样的,我们先随机生成种群,长这个样:
1 2 3 4
2 3 4 5
3 2 1 4
...
那个1,2,3,4是ABCD的序号。
这里面的话,值得一提的就是,由于暂定城市需要是不能重复的,且必须是完整的,所以如果像刚刚那样进行交叉或者变异的话,那么实际上会出点问题,我们不允许出现重复,且必须完整,对于我们的DNA,也就是咱们瞎蒙的个体。
由于咱们每一步在代码里面都有注释,所以的话咱们在这里就不再进行复述了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 |
|
ok,我们来看看运行的结果:
以上がPython を使用して遺伝的アルゴリズムを実装し、巡回セールスマン問題 (TSP) を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。