序章
特定のタイプ(たとえば、水バケツを取り上げます)で満たされた配列を、2つの値(この場合は重量と体積)を設定して分割する必要があります。 1000未満のボリュームの合計の差(必須)。これは、完全にフェッチされた遺伝的アルゴリズムなどである必要はありませんが、私が現在持っているものよりも優れているはずです...
現在の実装
どうすればよいかわからないため、配列を2つの同じ長さの配列に分割し(配列は不均一な数のアイテムで埋めることができます)、空白の可能性のあるスポットを両方の値が0のアイテムに置き換えることから始めました。サイドは同じ量のアイテムを持っている必要はありません、私はそれ以外の方法でそれを処理する方法を知らなかっただけです。
これらを配布した後、私は次のようにそれらを最適化しようとしています:
func (main *Main) Optimize() {
for {
difference := main.Difference(WEIGHT)
for i := 0; i < len(main.left); i++ {
for j := 0; j < len(main.right); j++ {
if main.DifferenceAfter(i, j, WEIGHT) < main.Difference(WEIGHT) {
main.left[i], main.right[j] = main.right[j], main.left[i]
}
}
}
if difference == main.Difference(WEIGHT) {
break
}
}
for main.Difference(CAPACITY) > 1000 {
leftIndex := 0
rightIndex := 0
liters := 0
weight := 100
for i := 0; i < len(main.left); i++ {
for j := 0; j < len(main.right); j++ {
if main.DifferenceAfter(i, j, CAPACITY) < main.Difference(CAPACITY) {
newLiters := main.Difference(CAPACITY) - main.DifferenceAfter(i, j, CAPACITY)
newWeight := main.Difference(WEIGHT) - main.DifferenceAfter(i, j, WEIGHT)
if newLiters > liters && newWeight <= weight || newLiters == liters && newWeight < weight {
leftIndex = i
rightIndex = j
liters = newLiters
weight = newWeight
}
}
}
}
main.left[leftIndex], main.right[rightIndex] = main.right[rightIndex], main.left[leftIndex]
}
}
関数:
main.Difference(const)は、2つの辺の間の絶対差を計算します。引数として取られる定数は、の差を計算するための値を決定します。
main.DifferenceAfter(i、j、const)は、2つのバケット間のスワップをシミュレートします。iは左側のバケットで、jは右側のバケットであり、結果の絶対差を計算します。定数は、チェックする値を再度決定します。
説明:
基本的に、これは重みを最適化することから始まります。これは、最初のforループが行うことです。すべての反復で、切り替えることができるバケットのすべての可能な組み合わせを試行し、その後の差が現在の差よりも小さい場合(より良い分散をもたらす)、それらを切り替えます。重みがそれ以上変化しない場合は、forループから抜け出します。完璧ではありませんが、これは非常にうまく機能し、私が達成しようとしていることに対してこれは許容できると思います。
次に、ボリュームに基づいて分散を最適化することになっているため、合計の差は1000未満です。ここでは、切り替える前に、より注意深く、実行で最適な組み合わせを検索しようとしました。したがって、最大の容量変更をもたらすバケットスイッチを検索し、これの間のトレードオフも検索することになっていますが、最初に試行したバケットの組み合わせがリットルと重量の変数を設定し、次の可能な組み合わせになるという欠陥があります。大幅に削減されています。
結論
ここにもう少し数学を含める必要があると思いますが、正直にここで立ち往生していて、ここで続行する方法がわからないので、あなたから助けを求めたいと思います。基本的に、ここで私を助けることができます。