You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何最小化布井均匀性系数R?求更优井位优化算法

区块内井位均匀布置的优化算法问题

需求:在区块轮廓内均匀布置井位,明确井的数量与坐标,需满足井间最小/最大距离、布井密度要求,布井均匀性由布井均匀性系数R衡量,需最小化R以提升均匀性。

问题:我已编写迭代井坐标的代码,是否存在更优的最小化R的算法?

现有代码

import json
import numpy as np
from matplotlib.path import Path


def load_data(filename):
    with open(filename, 'r') as file:
        data = json.load(file)
    return data

def calculate_area(coords):
    x = [p['x'] for p in coords]
    y = [p['y'] for p in coords]
    return 0.5 * np.abs(np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1)))

def get_bounding_box(coords):
    x_min = min(coord['x'] for coord in coords)
    x_max = max(coord['x'] for coord in coords)
    y_min = min(coord['y'] for coord in coords)
    y_max = max(coord['y'] for coord in coords)
    return x_min, x_max, y_min, y_max

def point_in_polygon(point, polygon):
    path = Path(polygon)
    return path.contains_point(point)

def plan_wells(coords, target_density):
    x_min, x_max, y_min, y_max = get_bounding_box(coords)
    num_wells = int(calculate_area(coords) * target_density)
    wells = []
    k = 0

    while (k==0):
        while len(wells) < num_wells:
            x = np.random.uniform(x_min, x_max)
            y = np.random.uniform(y_min, y_max)
            if point_in_polygon((x, y), [(coord['x'], coord['y']) for coord in coords]):
                wells.append({'x': x, 'y': y})
                
      
        for i in range(len(wells)):
            nearest_distances = sorted([np.sqrt((wells[i]['x'] - w['x'])**2 + (wells[i]['y'] - w['y'])**2) for w in wells if w != wells[i]])[:3]
            
            if (nearest_distances[0] < rms_min or nearest_distances[0] >= rms_max ):
                wells = []  
                break
            else: 
                k = 1
                    
    return wells

def evaluate_wells(wells):
    distances = []
    for i in range(len(wells)):
        nearest_distances = sorted([np.sqrt((wells[i]['x'] - w['x'])**2 + (wells[i]['y'] - w['y'])**2) for w in wells if w != wells[i]])[:3]
        if len(nearest_distances) > 0:
            average_distance = np.mean(nearest_distances)
            distances.append(average_distance)
    mean_distance = np.mean(distances)
    R = np.sqrt(np.mean((distances - mean_distance)**2))
    return R

def minimize_R(coords, target_density, iterations):
    best_wells = None
    best_R = float('inf')

    for _ in range(iterations):
        wells = plan_wells(coords, target_density)
        R = evaluate_wells(wells)
        if R < best_R:
            best_R = R
            best_wells = wells

    return best_wells, best_R

def save_solution(wells, task_number):
    solution_data = {
        "holeCoords": wells
    }
    filename = f'solution-{task_number}.json'
    with open(filename, 'w', encoding='utf-8') as file:
        json.dump(solution_data, file, ensure_ascii=False, indent=4)
    print(f"Solution saved to {filename}")

data = load_data('/task-1.json')

rms_min = data['rmsMin']
rms_max = data['rmsMax']
print(rms_min)

area = calculate_area(data['blockContour'])
print(f": {area}")


best_wells, best_R = minimize_R(data['blockContour'], data['targetDensity'], 1)
print(f" R: {best_R}")

save_solution(best_wells, 1)

更优的最小化R算法推荐

1. Voronoi图+Lloyd松弛算法

  • 核心逻辑:先生成满足基础约束的初始井位,然后迭代将每个井移动到其Voronoi单元的重心,直到位置不再明显变化。这个过程会让井位自然趋向均匀分布,有效降低R值。
  • 优势:比随机迭代收敛更快,最终分布的均匀性更稳定,能天然适配区块轮廓的边界约束。
  • 注意点:每次迭代后要检查井位是否仍在区块内、是否满足井距限制,若不满足则将井拉回合法区域或微调位置。

2. 模拟退火算法

  • 核心逻辑:引入“温度”参数,允许迭代初期接受R值暂时上升的解,避免陷入局部最优;随着温度逐步降低,只保留更优解,最终收敛到全局较优的井位分布。
  • 优势:能跳出随机迭代容易卡住的局部最优,适合复杂不规则区块的场景。
  • 注意点:设计合理的邻域扰动方式(比如单井小范围随机移动)和温度衰减策略,每次扰动后必须验证约束条件。

3. 粒子群优化(PSO)算法

  • 核心逻辑:将一组井位视为一个“粒子”,通过粒子间的信息共享,并行搜索使R值最小的最优位置组合。
  • 优势:多粒子同时探索解空间,井数量较多时效率优于单路径迭代。
  • 注意点:需将井位坐标编码为粒子的位置向量,设计以最小化R为目标的适应度函数,同时处理区块边界和井距约束。

现有代码的即时改进点

  • plan_wells函数中,只要有一口井不满足约束就清空全部重生成,效率极低,可改为仅调整不满足约束的井位,而非全部重来。
  • minimize_R仅靠多次随机生成碰运气,极易陷入局部最优,建议用上述优化算法替代单纯的随机迭代逻辑。

内容的提问来源于stack exchange,提问作者Владислав

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:54:59