第3章:机位优化算法

做风电场微观选址这么多年,我最大的感触就是——机位排布这事儿,光靠经验真不行。你想想看,一个风电场少说几十台风机,多则上百台,每台之间还有尾流影响,地形起伏、风向变化、噪音限制……这么多因素搅在一起,人工排布基本就是碰运气。

所以,我们得靠算法。这一章,我就把几种常用的机位优化算法掰开揉碎了讲给你听。

3.1 贪婪算法在机位排布中的应用

贪婪算法,说白了就是「每次选当下最好的」。我在早期项目中经常用它做初步排布,速度快,结果也还算靠谱。

核心思路:

  • 把风电场划分成网格,每个网格就是一个候选机位
  • 先选发电量最高的那个点
  • 然后排除掉受尾流影响严重的区域
  • 在剩下的点里再选最好的
  • 重复,直到机位数量够了

关键点:每次选完一个机位,都要重新计算尾流影响。我见过有人偷懒不更新,结果排出来的机位全挤在一起,发电量还不如随机排的。

# 伪代码示例
def greedy_placement(wind_farm, n_turbines):
    placed = []
    for _ in range(n_turbines):
        best_pos = None
        best_energy = -inf
        for pos in candidate_positions:
            if pos not in placed:
                energy = calculate_energy(wind_farm, placed + [pos])
                if energy > best_energy:
                    best_energy = energy
                    best_pos = pos
        placed.append(best_pos)
    return placed

我的经验:贪婪算法适合做初筛,能快速给出一个「不差」的方案。但别指望它找到最优解——它容易陷入局部最优。我曾经在一个复杂山地项目里用它,结果排出来的机位全在山脊上,山谷里一个都没放,后来用遗传算法重新跑了一遍,发电量提升了8%。

3.2 遗传算法基础

遗传算法,我习惯叫它「进化算法」。它的灵感来自生物进化——优胜劣汰,适者生存。

基本流程:

  1. 编码:把每个机位方案表示成「染色体」。比如用二进制串表示哪些网格放了风机
  2. 适应度函数:计算每个方案的发电量(或者综合成本)
  3. 选择:挑出表现好的方案,让它们「繁殖」
  4. 交叉:两个方案交换部分基因,产生新方案
  5. 变异:随机改变某些基因,保持多样性
  6. 迭代:重复2-5步,直到收敛

注意:遗传算法不是跑得越久越好。我见过有人让它跑1000代,结果第200代就已经收敛了,后面800代纯属浪费电。建议设置早停条件,比如连续50代适应度没提升就停止。

# 遗传算法核心参数
population_size = 100    # 种群大小
mutation_rate = 0.01     # 变异率
crossover_rate = 0.8     # 交叉率
generations = 500        # 最大迭代次数

这里有个坑——变异率不能设太大。我曾经设了0.1,结果算法变成了随机搜索,永远收敛不了。一般0.01到0.05比较合适。

3.3 粒子群算法调参

粒子群算法(PSO)是我个人比较喜欢的一种。它模拟鸟群觅食的行为,每个「粒子」代表一个候选方案,粒子之间共享信息,共同向最优解靠近。

PSO的关键参数:

参数 含义 推荐范围 我的经验
w 惯性权重 0.4 - 0.9 开始时设大一点(0.9),后期减小到0.4
c1 个体学习因子 1.5 - 2.0 设太大容易陷入局部最优
c2 社会学习因子 1.5 - 2.0 设太小收敛慢,设太大容易早熟
粒子数 种群规模 20 - 50 30个粒子基本够用

调参心得:我一般先用默认参数跑一遍,看看收敛曲线。如果收敛太快,说明c2太大或者w太小;如果一直不收敛,说明c1太大或者粒子数太少。调参这事儿,说白了就是「看曲线说话」。

3.4 多目标优化:发电量+成本

实际项目中,我们不可能只盯着发电量。你想想看,把风机全放在发电量最高的地方,可能电缆成本暴涨,或者征地费用高得离谱。所以,我们需要多目标优化。

常见的做法:

  • 加权求和法:给发电量和成本各设一个权重,合成一个目标函数。简单,但权重怎么定是个问题
  • Pareto前沿法:不合并目标,而是找出一组「非支配解」。比如方案A发电量比B高,成本也比B高,那A和B谁更好?说不清,它们都在Pareto前沿上
  • NSGA-II:目前最流行的多目标遗传算法,能同时优化多个目标

我的建议:别一上来就用多目标优化。先单目标跑几遍,摸清楚发电量和成本的大致范围,再用多目标去细化。我曾经在一个项目里直接上NSGA-II,跑了三天三夜,结果发现参数设错了,白跑。

下面这张图展示了多目标优化的核心逻辑——在发电量和成本之间找平衡:

多目标优化:发电量 vs 成本 成本(万元) 发电量(万kWh) Pareto前沿 可行解 理想方向

这张图里,红色点是Pareto前沿上的解。你选哪个?取决于项目需求。如果预算紧张,就选成本低的;如果追求发电量,就选发电量高的。没有绝对的好坏,只有适合不适合。

避坑指南:多目标优化结果往往是一堆方案,别指望算法直接给你「最优解」。你需要结合工程经验去选。我曾经给业主提供了10个Pareto解,对方说「你直接告诉我选哪个」。嗯,这时候就需要你根据实际情况拍板了。

好了,这一章的内容就到这里。算法这东西,光看没用,得动手跑。建议你拿一个实际风电场的数据,把贪婪、遗传、粒子群都跑一遍,对比一下结果。你会发现,不同算法给出的方案差异还挺大的。


公众号:蓝海资料掘金营,微信deep3321