16.07. 最大数值

编写一个方法,找出两个数字ab中最大的那一个。不得使用if-else或其他比较运算符。

示例:

输入: a = 1, b = 2
输出: 2

运用数学公式:

ma x = ((a+b)+|a-b|)/2;

但是这里要考虑,a+b整形范围内可能会溢出,所以将其转换成long

 

int maximum(int a, int b) {
        long c = a;
        long d = b;
        return int(((c+d)+abs(c-d))/2);
    }

 

% 清除工作区 clear; clc; % 参数设置 T = 24; % 时间步数,代表一天的 24 小时 N = 4; % 水箱数量 V_total = [657.04, 254.79, 553.45, 337.30]; % 4 个水箱的总容量(m^3) V_start = 0.32 * V_total'; % 初始水量 = 总容积的32% % 其他非水箱供水节点在 24 个时刻的总用水流量(L/s) Q_other = [176.52 128.99 117.67 115.43 110.87 119.94 144.82 176.52 217.26 235.34 239.89 224.02 190.08 176.52 174.25 172.00 169.73 183.32 181.04 208.19 251.21 260.25 228.58 214.99 ]; % 4 个水箱在 24 个时刻后用水点的需水流量(L/s) Q_use = [29.17 21.32 19.45 19.07 18.33 19.82 23.94 29.17 35.90 38.90 39.64 37.03 31.42 29.17 28.80 28.42 28.05 30.29 29.92 34.41 41.51 43.01 37.77 35.53 ; 11.31 8.27 7.54 7.40 7.11 7.69 9.28 11.31 13.92 15.08 15.37 14.36 12.18 11.31 11.17 11.02 10.88 11.75 11.60 13.34 16.10 16.68 14.65 13.78 ; 24.57 17.96 16.38 16.07 15.44 16.70 20.16 24.57 30.24 32.76 33.39 31.19 26.46 24.57 24.26 23.94 23.63 25.52 25.20 28.98 34.97 36.23 31.82 29.93 ; 14.98 10.94 9.98 9.79 9.41 10.18 12.29 14.98 18.43 19.97 20.35 19.01 16.13 14.98 14.78 14.59 14.40 15.55 15.36 17.66 21.31 22.08 19.39 18.24 ]; % 将 Q_use 转换为 m^3/h(1 L/s = 3.6 m^3/h) Q_use = Q_use * 3.6; % 将 Q_other 转换为 m^3/h(1 L/s = 3.6 m^3/h) Q_other = Q_other * 3.6; % 定义优化变量 x = optimvar('x', T, N, 'LowerBound', 0); % 每时刻各水箱的进水流量(m^3/h) y = optimvar('y', T - 1, 1, 'LowerBound', 0); % 辅助变量,用于处理目标函数中的绝对值 % 定义优化问题 prob = optimproblem('ObjectiveSense', 'minimize'); prob.Objective = sum(y); % 目标是最小化 y 的 % 约束条件 % 1. 目标函数中的绝对值约束 for t = 2:T prob.Constraints.(['abs_constr_' num2str(t)]) = y(t - 1) >= (sum(x(t, :)) + Q_other(t)) - (sum(x(t - 1, :)) + Q_other(t - 1)); prob.Constraints.(['abs_constr_neg_' num2str(t)]) = y(t - 1) >= -((sum(x(t, :)) + Q_other(t)) - (sum(x(t - 1, :)) + Q_other(t - 1))); end % 2. 水箱后用水需求保障约束 for t = 1:T for n = 1:N prob.Constraints.(['demand_constr_' num2str(t) '_' num2str(n)]) = sum(x(1:t, n)) + V_start(n) >= sum(Q_use(n, 1:t)) + 0.1 * V_total(n); end end % 3. 水箱调蓄体积约束 for t = 1:T for n = 1:N prob.Constraints.(['volume_constr_' num2str(t) '_' num2str(n)]) = sum(x(1:t, n)) + V_start(n) <= 0.9 * V_total(n) + sum(Q_use(n, 1:t)); end end % 4. 调度周期约束 for n = 1:N prob.Constraints.(['cycle_constr_' num2str(n)]) = sum(x(:, n)) == sum(Q_use(n, :)); end % 求解优化问题 [sol, fval, exitflag] = solve(prob); % 输出结果 if exitflag > 0 disp('优化成功!'); disp('最优目标函数值:'); disp(fval); disp('各时刻各水箱进水量(m³/h):'); disp(sol.x); else disp('优化失败!'); disp(['退出标志:' num2str(exitflag)]); end QIN = sol.x 这段代码解决了什么问题,运用了什么优化算法,原理是什么
最新发布
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值