Optimization 约束单目标优化 介绍
我需要拆分一个填充了特定类型(以水桶为例)的数组,并设置两个值(在本例中为“重量”和“体积”),同时将总重量之间的差值保持在最小(首选)和总体积之间的差值小于1000(必需)。这不需要是一个完整的遗传算法或类似的东西,但它应该比我目前拥有的更好 当前实施 由于不知道如何做得更好,我首先将数组拆分为两个长度相同的数组(数组中可以填充数量不均匀的项),用两个值都为0的项替换可能的空白点。双方不需要有相同数量的物品,我只是不知道如何处理它,否则 在分发这些文件之后,我将尝试如下方式对其进行优化:Optimization 约束单目标优化 介绍,optimization,go,Optimization,Go,我需要拆分一个填充了特定类型(以水桶为例)的数组,并设置两个值(在本例中为“重量”和“体积”),同时将总重量之间的差值保持在最小(首选)和总体积之间的差值小于1000(必需)。这不需要是一个完整的遗传算法或类似的东西,但它应该比我目前拥有的更好 当前实施 由于不知道如何做得更好,我首先将数组拆分为两个长度相同的数组(数组中可以填充数量不均匀的项),用两个值都为0的项替换可能的空白点。双方不需要有相同数量的物品,我只是不知道如何处理它,否则 在分发这些文件之后,我将尝试如下方式对其进行优化: fu
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]
}
}
func(main*main)优化(){
为了{
差异:=主要差异(重量)
对于i:=0;i1000{
leftIndex:=0
rightIndex:=0
升:=0
重量:=100
对于i:=0;i 如果newlills>lills&&newWeight在您的案例中,重量差异似乎是客观的,而体积差异只是一个约束,这意味着您正在寻求优化重量属性差异(尽可能小)的解决方案,并满足体积属性差异的条件(总量<1000).在这种情况下,这是一个单目标约束优化问题
然而,如果你对多目标优化感兴趣,也许你想看看帕累托前沿的概念:。它有助于在不同的目标中保持多个具有优势的好解,即不丢失多样性。如前所述,你的问题实际上是一个约束优化问题,约束条件为yo你的体积不同
从数学上讲,这将是在体积差小于1000的约束条件下最小化体积差。将其表示为线性优化问题的最简单方法是:
min weights . x
subject to volumes . x < 1000.0
for all i, x[i] = +1 or -1
minweights.x
以卷为准。x<1000.0
对于所有i,x[i]=+1或-1
其中,a.b
是向量点积。解决此问题后,x=+1
中的所有索引对应于第一个数组,而x=-1
中的所有索引对应于第二个数组
不幸的是,这是已知的。解决这一问题的最简单方法是对空间进行彻底的暴力探索,但它需要测试所有2^n
可能的向量x
(其中n
是原始权重和体积向量的长度),很快就会失控。有很多关于这个主题的文献,有更高效的算法,但它们通常非常特定于一组特定的问题和/或约束。你可以通过谷歌“线性整数规划”来了解在这个主题上做了些什么
我认为最简单的可能是执行基于启发式的蛮力搜索,在搜索树将使您摆脱容量限制时,您可以提前修剪搜索树,并保持接近限制(一般来说,线性优化问题的解决方案位于可行空间的边缘)
以下是一些关于此类优化的文章:
如果您一般不熟悉优化文章或数学,则提供了一个很好的介绍,但有关此主题的大多数文章都会快速显示一些(伪)代码,您可以立即进行调整
如果您的n
很大,我想在某个时候您必须在您的解决方案的最优程度和计算速度之间进行权衡。您的解决方案可能是次优的,但比穷举搜索快得多。根据问题的具体配置,可能会有更好的权衡。谢谢为了指出这一点,我似乎走错了方向。不过,似乎没有针对Go的优化库,因此我可以使用更多关于如何尝试使用Go(golang)的信息。@Big Blue我没有尝试过,但搜索了“optimiz”on给出了一些似乎有用的结果。值得注意的是,math3d
,一个用于编程语言go的线性代数库;pso go
,一个用于golang的pso(粒子群优化)库,