【编程题】最小农田浇水费用

题目描述

一块农田又n块地,为了能给n块地顺利的浇上水,对于每块地可以选择在本地打井,也可以修管道从另一块地(这块地可能打了井,它的水也是从其他地引过来的)将水引过来。
当然打井和修管道的费用有差别。已知在第i块地打井需要耗费wi元,在第i、j间修管道要pij元。由于地较多,需要选择在哪些地打井,哪些地之间修管道。请编程做决策,求出最小费用。

输入输出描述

以下n行(第一个输入),一次给出整数w1, …, wn(每块地的打井费用)。紧接着是一个n*n的整数矩阵,矩阵的第i行第j列的数代表pij(两块地之间建立管道的费用)。每行的两个数之间有一个空格隔开。

6
5
4
4
3
1
20
0 2 2 2 9 9
2 0 3 3 9 9
2 3 0 4 9 9
2 3 4 0 9 9
9 9 9 9 0 9
9 9 9 9 9 0

输出最小费用值

16

代码

初步思路及实现,有错误的地方烦请指正!

def func(dig_prices, matrix):
    min_price = min(dig_prices)
    min_connected = float('inf')
    idx = [0, 0]
    for i in range(n):
        for j in range(n):
            if matrix[i][j] < min_price and matrix[i][j] < min_connected:
                min_connected = matrix[i][j]
                idx[0], idx[1] = i, j

    visited = []
    res = 0
    if min_connected != float('inf'):
        visited.append(idx[0])
        visited.append(idx[1])
        res += matrix[idx[0]][idx[1]]
        for x in range(n):
            if x in visited:
                continue
            else:
                index, dig = compare_price(x, visited, dig_prices, matrix)
                if dig:
                    res += dig_prices[x]
                    visited.append(x)
                else:
                    res += matrix[x][index]
                    visited.append(index)
    else:
        visited.append(dig_prices.index(min_price))
        res += min_price
        for x in range(n):
            if x in visited:
                continue
            else:
                index, dig = compare_price(x, visited, dig_prices, matrix)
                if dig:
                    res += dig_prices[x]
                    visited.append(x)
                else:
                    res += matrix[x][index]
                    visited.append(index)
    return res


def compare_price(i, visit, dig_price, mat):
    dig_cost = dig_price[i]
    flag = True
    idx = -1
    min_cost = float('inf')
    for j in visit:
        if mat[i][j] < dig_cost and mat[i][j] < min_cost:
            idx = j
            flag = False
            min_cost = mat[i][j]

    return idx, flag


n = int(input())
dig_prices = []
for _ in range(n):
    dig_prices.append(int(input()))

matrix = []
for _ in range(n):
    matrix.append(list(map(int, input().split())))

# print(dig_prices)
# print(matrix)

res = func(dig_prices, matrix)
print(res)
农田浇水模糊控制算法实现的基本步骤如下: 1. 确定模糊控制系统的输入变量和输出变量。输入变量可以是农田的土壤湿度、气温、降雨量等,输出变量可以是浇水的时间、水量等。 2. 设计模糊控制器的模糊规则库,包括“如果……就……”的条件语句和相应的结论语句。例如,“如果土壤湿度过低,就增加浇水时间”。 3. 对输入变量进行模糊化,将其转换为模糊集合。可以采用三角形、梯形等形状的隶属函数。 4. 对规则库中的条件语句进行模糊推理,得到相应的结论语句。可以采用最大值法、平均值法等进行合成。 5. 对输出变量进行去模糊化,将其转换为具体的数值。可以采用重心法、面积法等进行计算。 以下是一个简单的农田浇水模糊控制算法的C语言实现: ``` #include <stdio.h> // 定义输入变量和输出变量 float soil_humidity, temperature, rainfall; float water_time, water_amount; // 模糊控制器的模糊规则库 float rule1(float x) { if (x < 0.2) return 1; else if (x < 0.3) return (0.3 - x) / 0.1; else return 0; } float rule2(float x) { if (x < 10) return 0; else if (x < 20) return (x - 10) / 10; else if (x < 30) return (30 - x) / 10; else return 0; } float rule3(float x) { if (x < 10) return 0; else if (x < 20) return (x - 10) / 10; else return 1; } float rule4(float x, float y, float z) { if (x > 0.7 && y > 25 && z < 50) return 1; else if (x > 0.4 && y > 20 && z < 100) return (0.7 - x) / 0.3; else if (x > 0.2 && y > 15 && z < 150) return (0.4 - x) / 0.2; else return 0; } // 模糊化函数 float fuzzy(float x, float a, float b, float c) { if (x < a) return 0; else if (x < b) return (x - a) / (b - a); else if (x < c) return (c - x) / (c - b); else return 0; } // 去模糊化函数 float defuzzy(float a, float b, float c) { return (a + b + c) / 3; } int main() { // 输入变量 soil_humidity = 0.5; temperature = 30; rainfall = 80; // 模糊化 float low_humidity = fuzzy(soil_humidity, 0, 0.2, 0.3); float medium_humidity = fuzzy(soil_humidity, 0.2, 0.3, 0.4); float high_humidity = fuzzy(soil_humidity, 0.3, 0.4, 1); float low_temperature = fuzzy(temperature, 10, 20, 30); float medium_temperature = fuzzy(temperature, 0, 0, 0); float high_temperature = fuzzy(temperature, 0, 0, 0); float low_rainfall = fuzzy(rainfall, 0, 50, 100); float medium_rainfall = fuzzy(rainfall, 50, 100, 150); float high_rainfall = fuzzy(rainfall, 100, 150, 1000); // 模糊推理 float rule1_result = rule1(low_humidity); float rule2_result = rule2(low_temperature); float rule3_result = rule3(high_rainfall); float rule4_result = rule4(soil_humidity, temperature, rainfall); // 去模糊化 water_time = defuzzy(rule1_result, rule2_result, rule3_result); water_amount = defuzzy(rule4_result, rule4_result, rule4_result); // 输出结果 printf("water time: %f\n", water_time); printf("water amount: %f\n", water_amount); return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值