鱼C论坛

 找回密码
 立即注册
楼主: 乱世老高

多线程运行情况下的字典赋值——水资源优化配置

[复制链接]
回帖奖励 25 鱼币 回复本帖可获得 5 鱼币奖励! 每人限 1 次(中奖概率 20%)
发表于 2024-4-2 07:59:53 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-4-2 10:05:50 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-4-2 10:37:49 | 显示全部楼层
123
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-4-2 18:35:52 | 显示全部楼层
这是Python吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2024-4-13 22:10:20 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2024-4-13 22:10:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2024-4-13 22:12:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2024-4-13 22:15:55 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2024-4-13 22:21:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-4-19 22:19:26 | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-4-25 21:07:35 | 显示全部楼层
重新输入一下代码

  1. # -*- coding: utf-8 -*-
  2. import numpy as np
  3. import os
  4. import pandas as pd
  5. from deap import base, creator, tools, algorithms
  6. import subprocess
  7. import random
  8. import openpyxl
  9. from netCDF4 import Dataset
  10. import multiprocessing
  11. import configparser
  12. import shutil


  13. global result_list
  14. result_list = {}
  15. excel_template = r'E:\cwat_new\diversion_optimization\diversion_template.xlsx'
  16. ini_file = r'E:\cwat_new\diversion_optimization\optim.ini'
  17. total_water = 15128
  18. used_ids = set()


  19. def generate_unique_id():
  20.     unique_id = random.randint(1, 100000000)
  21.     while unique_id in used_ids:
  22.         unique_id = random.randint(1, 100000000)
  23.     used_ids.add(unique_id)
  24.     return unique_id

  25. def read_initial_values(excel_file_path, column_name):
  26.     workbook = openpyxl.load_workbook(excel_file_path)
  27.     sheet = workbook.active
  28.     # 查找指定列的索引
  29.     column_index = None
  30.     for cell in sheet[1]:
  31.         if cell.value == column_name:
  32.             column_index = cell.column_letter
  33.             break
  34.     if column_index is None:
  35.         print(f"找不到名为 '{column_name}' 的列标题")
  36.         return []
  37.     # 获取指定列下的所有值
  38.     column_values = []
  39.     for cell in sheet[column_index][1:]:
  40.         column_values.append(cell.value)
  41.     return column_values

  42. def evaluate_model_output(nc_file):
  43.     with Dataset(nc_file, 'r') as nc:
  44.         times = nc.variables['time'][:]
  45.         data_var = nc.variables['unmetDemandM3_annualavg']  
  46.         # 遍历每个时间段,计算总和
  47.         for i, _ in enumerate(times):
  48.             data_at_time = data_var[i, :, :]
  49.             data_at_time = data_at_time * 365
  50.             # 计算当前时间段的总和
  51.             total = np.sum(data_at_time)
  52.             #print(f"Time {i} total: {total}")
  53.     total = tuple([total])
  54.     return total

  55. # 更新Excel文件中的月份分配数据
  56. def update_excel_data(filename, allocations):
  57.     df = pd.DataFrame(allocations, columns=['Allocation'])
  58.     df['Month'] = range(1, 13)
  59.     with pd.ExcelWriter(filename, engine='openpyxl', mode='w') as writer:
  60.         df.to_excel(writer, index=False)

  61. def mutate_individual(individual, mutation_probability):
  62.     for i in range(len(individual)):
  63.         if random.random() < mutation_probability:
  64.             individual[i] += random.gauss(0, 100)  # 变异操作

  65.             # 修正子代,确保在非负范围内
  66.             individual[i] = max(individual[i], 0)

  67.     return [individual]

  68. def cxBlendBounded(ind1, ind2, alpha=0.5, low=0):
  69.     """执行cxBlend交叉操作,并确保子代的值位于[low, up]范围内。"""
  70.     for i in range(len(ind1)):
  71.         gamma = (1. + 2. * alpha) * random.random() - alpha
  72.         ind1[i] = (1. - gamma) * ind1[i] + gamma * ind2[i]
  73.         ind2[i] = gamma * ind1[i] + (1. - gamma) * ind2[i]
  74.         # 确保值不小于下限
  75.         ind1[i] = max(low, ind1[i])
  76.         ind2[i] = max(low, ind2[i])
  77.     return ind1, ind2

  78. # 运行水文模型的命令行函数
  79. def run_hydrological_model(unique_id, monthly_allocation):
  80.     folder_name = f'E:\\cwat_new\\diversion_optimization\\{unique_id}'
  81.     os.makedirs(folder_name, exist_ok=True)
  82.     output_folder = os.path.join(folder_name, 'output')
  83.     os.makedirs(output_folder, exist_ok=True)   
  84.     excel_file = os.path.join(folder_name, f'diversion_{unique_id}.xlsx')   
  85.     # 使用模板文件创建新的Excel
  86.     shutil.copy(excel_template, excel_file)   
  87.     #创建新的ini文件
  88.     config = configparser.ConfigParser()
  89.     config.optionxform = lambda option: option
  90.     config.read(ini_file)
  91.     # 修改参数值
  92.     config.set('WATERDIVERSION', 'monthly_water_quota', excel_file)
  93.     config.set('FILE_PATHS', 'PathOut', output_folder)
  94.     # 保存修改后的ini文件
  95.     ini_fileC = os.path.join(folder_name, f'optim_{unique_id}.ini')
  96.     with open(ini_fileC, 'w') as configfile:
  97.         config.write(configfile)
  98.     # 更新Excel文件以供模型使用
  99.     update_excel_data(excel_file, monthly_allocation)
  100.    
  101.     # 运行水文模型,假设模型的可执行文件名为 "hydro_model",并且它使用excel文件
  102.     subprocess.run(['python', r'E:\cwat_new\CWatM-main\run_cwatm.py', ini_fileC], check=True)
  103.     nc_file = os.path.join(output_folder, 'unmetDemandM3_annualavg.nc')
  104.     result_list[int(evaluate_model_output(nc_file)[0])] = unique_id
  105.     # 从生成的nc文件中读取评价指标
  106.     return evaluate_model_output(nc_file), unique_id


  107. # 评价函数,目标是最小化评价指标
  108. def evaluate(individual):
  109.    
  110.     unique_id = generate_unique_id()
  111.     # 确保分配水量不超过限制
  112.     if not isinstance(individual, list):
  113.         individual = list(individual)
  114.     # 确保 individual 中的元素都是整数
  115.     individual = [int(x) for x in individual]
  116.    
  117.     # 计算分配方案的总和
  118.     allocation_sum = sum(individual)
  119.     penalty = abs(allocation_sum - total_water) * 1000000
  120.    
  121.     if allocation_sum > total_water:
  122.         return 1e10,  # 返回一个很大的值,表示不可行的解

  123.     result, unique_id = run_hydrological_model(unique_id, individual)

  124.     return result[0] + penalty,

  125. # 设置遗传算法
  126. creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
  127. creator.create("Individual", list, fitness=creator.FitnessMin)

  128. toolbox = base.Toolbox()
  129. toolbox.register("attr_float", random.uniform, 0, total_water/12)  # 假设平均每月分配
  130. toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=12)
  131. toolbox.register("population", tools.initRepeat, list, toolbox.individual)

  132. toolbox.register("evaluate", evaluate)
  133. toolbox.register("mate", tools.cxBlend, alpha=0.5)
  134. toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=100, indpb=0.2)
  135. toolbox.register("select", tools.selTournament, tournsize=3)

  136. # 遗传算法参数
  137. population_size = 1
  138. crossover_probability = 0.7
  139. mutation_probability = 0.2
  140. number_of_generations = 0
  141. toolbox.register("mutate", mutate_individual, mutation_probability=mutation_probability)
  142. toolbox.register("mate", cxBlendBounded, alpha=0.5, low=0)

  143. if __name__ == "__main__":
  144.     manager = multiprocessing.Manager()
  145.     result_list = manager.dict()
  146.     pool_size = int(multiprocessing.cpu_count() * 0.8)
  147.     pool = multiprocessing.Pool(processes=pool_size)
  148.     toolbox.register("map", pool.map)
  149.     population = toolbox.population(n=population_size)
  150.     #设置初始值
  151.     initial_values = read_initial_values(excel_template, 'Allocation')   
  152.     population[0][:] = initial_values
  153.    
  154.     final_population, logbook = algorithms.eaSimple(population, toolbox, cxpb=crossover_probability, mutpb=mutation_probability, ngen=number_of_generations, verbose=True)
  155.     # 找到最优解
  156.     best_ind = tools.selBest(population, 1)[0]
  157.     best_fitness = best_ind.fitness.values[0]
  158.     best_unique_id = result_list[int(best_fitness)]
  159.     print("Best Individual is: ", best_ind)
  160.     print("Best Individual fitness:", best_fitness)
  161.     print("Best Individual ID is:", best_unique_id)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-13 13:14:02 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-7 08:46:36 | 显示全部楼层
6
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-17 16:58:12 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-17 16:58:56 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-19 15:53:03 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-20 15:00:51 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-9-3 18:20:51 | 显示全部楼层
谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-9-4 15:44:45 | 显示全部楼层
谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2025-2-3 13:37:51 | 显示全部楼层

感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-6 05:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表