介绍
我需要使用两个值集(在这种情况下为重量和体积)将填充有某种类型(例如水桶)的数组拆分,同时将权重的总和保持在最小值(首选)和卷总数之间的差异小于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是右侧的存储桶,并计算所得的绝对差,然后,该常数再次确定要检查的值
结论
我想我需要在这里包括更多的数学信息,但是老实说,我一直呆在这里,不知道如何继续在这里,所以我想从您那里得到一些帮助,基本上可以在这里为我提供帮助。
人到中年有点甜
相关分类