修改1
This commit is contained in:
parent
3bcfafd02a
commit
d43e505b30
@ -1,29 +1,51 @@
|
||||
import numpy as np
|
||||
from typing import List, Tuple
|
||||
from typing import List, Dict, Tuple
|
||||
|
||||
import numpy as np
|
||||
|
||||
# 动态生成收益函数
|
||||
def revenue_functions(num_projects):
|
||||
functions = []
|
||||
for i in range(num_projects):
|
||||
# 这里可以根据实际需求调整系数
|
||||
a = -0.1 - 0.05 * i # 二次项系数,每次递减 0.05
|
||||
b = 2 + 0.5 * i # 一次项系数,每次递增 0.5
|
||||
def r(x, a=a, b=b):
|
||||
return a * x**2 + b * x
|
||||
functions.append(r)
|
||||
return functions
|
||||
|
||||
def dpsa(num_projects, total_resource, num_iterations, step_size):
|
||||
# 初始化每个项目的资源分配为 0
|
||||
resource_allocation = [0] * num_projects
|
||||
revenue_funs = revenue_functions(num_projects)
|
||||
|
||||
for _ in range(num_iterations):
|
||||
# 保存上一次的资源分配结果
|
||||
prev_allocation = resource_allocation.copy()
|
||||
|
||||
for i in range(num_projects):
|
||||
# 计算当前项目的梯度(导数)
|
||||
gradient = (revenue_funs[i](resource_allocation[i] + step_size) - revenue_funs[i](resource_allocation[i])) / step_size
|
||||
|
||||
# 更新资源分配
|
||||
resource_allocation[i] += gradient * step_size
|
||||
|
||||
# 确保资源分配不超过总资源
|
||||
if sum(resource_allocation) > total_resource:
|
||||
# 调整资源分配以满足约束条件
|
||||
excess = sum(resource_allocation) - total_resource
|
||||
# 按比例减少每个项目的资源分配
|
||||
factor = (total_resource - sum(resource_allocation[:i])) / (sum(resource_allocation[i:]))
|
||||
for j in range(i, num_projects):
|
||||
resource_allocation[j] *= factor
|
||||
|
||||
# 判断是否收敛
|
||||
if np.linalg.norm(np.array(resource_allocation) - np.array(prev_allocation)) < 1e-6:
|
||||
break
|
||||
|
||||
# 计算总收益
|
||||
total_revenue = sum(revenue_funs[i](resource_allocation[i]) for i in range(num_projects))
|
||||
|
||||
return resource_allocation, total_revenue
|
||||
|
||||
def bilinear_interpolation(
|
||||
X_NUM: int,
|
||||
Y_NUM: int,
|
||||
X: float,
|
||||
Y: float,
|
||||
X0: List[float],
|
||||
Y0: List[float],
|
||||
Z0: np.ndarray
|
||||
) -> Tuple[float, float, float, List[float]]:
|
||||
"""
|
||||
双线性插值计算
|
||||
:param X_NUM: X方向点数 (整数)
|
||||
:param Y_NUM: Y方向点数 (整数)
|
||||
:param X: 目标X坐标 (浮点数)
|
||||
:param Y: 目标Y坐标 (浮点数)
|
||||
:param X0: X坐标数组 (浮点数列表)
|
||||
:param Y0: Y坐标数组 (浮点数列表)
|
||||
:param Z0: 二维数据数组 (numpy.ndarray, 形状为 Y_NUM x X_NUM)
|
||||
:return: 元组 (Z, ZX, ZY, Z_OUT)
|
||||
"""
|
||||
X0_arr = np.array(X0) # 转换为NumPy数组
|
||||
Z = np.interp(Y, Y0, Z0[:, np.argmin(np.abs(X0_arr - X))])
|
||||
ZX = (np.interp(Y, Y0, Z0[:, np.argmin(np.abs(X0_arr - X + 0.1))]) - Z) / 0.1
|
||||
ZY = (np.interp(Y + 0.1, Y0, Z0[:, np.argmin(np.abs(X0_arr - X))]) - Z) / 0.1
|
||||
Z_OUT = Z0.flatten().tolist()
|
||||
return Z, ZX, ZY, Z_OUT
|
35
app/main.py
35
app/main.py
@ -1,8 +1,7 @@
|
||||
import numpy as np
|
||||
from flask import Flask, request, jsonify
|
||||
from flasgger import Swagger
|
||||
import json
|
||||
from algorithms import bilinear_interpolation
|
||||
from algorithms import *
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
@ -48,35 +47,21 @@ def calculate():
|
||||
input_data = json.loads(request_data["text"])
|
||||
|
||||
# 提取输入参数
|
||||
X_NUM = input_data["Par"][0]["Data"]
|
||||
Y_NUM = input_data["Par"][1]["Data"]
|
||||
X = input_data["Par"][2]["Data"]
|
||||
Y = input_data["Par"][3]["Data"]
|
||||
X0 = input_data["Par"][4]["Data"]
|
||||
Y0 = input_data["Par"][5]["Data"]
|
||||
Z0 = input_data["Par"][6]["Data"]
|
||||
|
||||
num_projects = input_data["Par"][0]["Data"]
|
||||
total_resource = input_data["Par"][1]["Data"]
|
||||
num_iterations = input_data["Par"][2]["Data"]
|
||||
resource_allocation, total_revenue = dpsa(num_projects, total_resource, num_iterations,0.1)
|
||||
# 调用算法函数
|
||||
Z, ZX, ZY, Z_OUT = bilinear_interpolation(
|
||||
X_NUM, Y_NUM, X, Y, X0, Y0, np.array(Z0).reshape(Y_NUM, X_NUM)
|
||||
)
|
||||
|
||||
# 构建输出JSON
|
||||
output_data = {
|
||||
"funcName": "calculate_main",
|
||||
"className": "",
|
||||
"par": [
|
||||
{"name": "X_NUM", "dataType": 0, "arrayType": 0, "isOut": 2, "data": X_NUM},
|
||||
{"name": "Y_NUM", "dataType": 0, "arrayType": 0, "isOut": 2, "data": Y_NUM},
|
||||
{"name": "X", "dataType": 1, "arrayType": 0, "isOut": 2, "data": X},
|
||||
{"name": "Y", "dataType": 2, "arrayType": 0, "isOut": 2, "data": Y},
|
||||
{"name": "X0", "dataType": 1, "arrayType": 1, "isOut": 2, "data": X0},
|
||||
{"name": "Y0", "dataType": 1, "arrayType": 1, "isOut": 2, "data": Y0},
|
||||
{"name": "Z0", "dataType": 1, "arrayType": 1, "isOut": 2, "data": Z0},
|
||||
{"name": "Z", "dataType": 1, "arrayType": 0, "isOut": 1, "data": float(Z)},
|
||||
{"name": "ZX", "dataType": 1, "arrayType": 0, "isOut": 1, "data": float(ZX)},
|
||||
{"name": "ZY", "dataType": 1, "arrayType": 0, "isOut": 1, "data": float(ZY)},
|
||||
{"name": "Z_OUT", "dataType": 1, "arrayType": 1, "isOut": 1, "data": Z_OUT}
|
||||
{"name": "num_projects", "dataType": 0, "arrayType": 0, "isOut": 2, "data": num_projects},
|
||||
{"name": "total_resource", "dataType": 1, "arrayType": 0, "isOut": 2, "data": total_resource},
|
||||
{"name": "num_iterations", "dataType": 0, "arrayType": 0, "isOut": 2, "data": num_iterations},
|
||||
{"name": "resource_allocation", "dataType": 1, "arrayType": 1, "isOut": 1, "data": resource_allocation},
|
||||
{"name": "total_revenue", "dataType": 1, "arrayType": 0, "isOut": 1, "data": total_revenue}
|
||||
]
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
flask==3.0.3
|
||||
numpy==2.2.4
|
||||
numpy==1.26.4
|
||||
flasgger==0.9.7.1
|
||||
werkzeug==3.0.3
|
||||
jinja2==3.1.4
|
||||
|
Loading…
Reference in New Issue
Block a user