介绍
我需要使用设置的两个值(在本例中为重量和体积)拆分一个填充有某种类型(例如,我们以水桶为例)的数组,同时将总重量之间的差异保持在最小(首选)和小于 1000 的总卷之间的差异(必需)。这不需要是一个完整的遗传算法或类似的东西,但它应该比我目前拥有的更好......
当前实施
由于不知道如何做得更好,我首先将数组拆分为两个长度相同的数组(数组可以填充奇数个项目),用两个值都为 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)计算两侧的绝对差,作为参数的常数决定计算差的值
main.DifferenceAfter(i, j, const)模拟两个桶之间的交换,i 是左边的桶,j 是右边的桶,然后计算得到的绝对差,然后常量再次确定要检查的值
解释:
基本上这是从优化权重开始的,这是第一个 for 循环所做的。在每次迭代中,它都会尝试可以切换的桶的所有可能组合,如果之后的差异小于当前差异(导致更好的分布),它会切换它们。如果权重不再变化,它就会跳出 for 循环。虽然不完美,但效果很好,我认为这对于我想要完成的事情是可以接受的。
然后应该是根据体积优化分布,所以总的差异小于1000。这里我尝试更加小心,并在切换之前搜索一次运行中的最佳组合。因此,它搜索导致最大容量变化的铲斗开关,并且也应该在这之间进行权衡,尽管我看到第一个铲斗组合尝试的缺陷将设置升和重量变量,从而导致下一个可能的组合被大量减少。
结论
我想我需要在这里包含更多的数学,但老实说我被困在这里并且不知道如何继续在这里,所以我想从你那里得到一些帮助,基本上可以帮助我在这里是受欢迎的。