linear-programming - 收到错误 - Minizinc 建模语言上的“数量超出限制”
问题描述
我正在尝试在 Minizinc 中创建模型,但出现以下错误:
Error: Gecode: Float::linear: Number out of limits
我正在使用 Minizinc 版本“2.2.3”和求解器“Geocode 6.1.0”。
谁能解释我为什么会收到此错误?模型或求解器是否有错误?
这段代码试图优化电池,最大化产生的收入。
约束描述了电池在一段时间内可以放电/充电多少以及多少能量
这是代码:
%enumerators
enum ACTION = {charging, discharging, no_action};
%paramters
int: Num_intervals;
float: start_battery_state;
float: battery_max_charge;
float: battery_max_discharge;
float: battery_max_storage;
float: battery_min_storage;
array[int] of float: charge_prices;
array[int] of float: discharge_prices;
%sets
set of int: TIME = 1..Num_intervals;
set of int: TIME2 = 2..Num_intervals;
%variables
array[TIME] of var -4.0..4.0: battery_activity;
array[TIME] of var float: battery_state;
array[TIME] of var ACTION: choice;
array[TIME] of var float: revenue_generated;
var float: total_revenue = sum(t in TIME)(revenue_generated[t]);
%constraints - determining battery state - cannot go below min or above max
constraint battery_state[1] = start_battery_state;
constraint forall(t in TIME2)(battery_state[t] = battery_state[t-1] + battery_activity[t]);
constraint forall(t in TIME2)(battery_state[t] >= battery_min_storage);
constraint forall(t in TIME2)(battery_state[t] <= battery_max_storage);
%constraints - if charging, calculate revenue/cost using charge_prices
%if discharging, calculate revenue/cost using discharge prices
constraint forall(t in TIME)(if choice[t] = charging then revenue_generated[t] = -battery_activity[t] * charge_prices[t]
elseif choice[t] = discharging then revenue_generated[t] = battery_activity[t] * discharge_prices[t]
else revenue_generated[t] = 0 endif);
%setting the the choice variable (charging, discharging, no-action)
%depending on battery activity
constraint forall(t in TIME)(if battery_activity[t] > 0 then choice[t] = charging
elseif battery_activity[t] < 0 then choice[t] = discharging
else choice[t] = no_action endif);
solve maximize total_revenue;
我正在使用以下输入文件:
% number of time intervals
Num_intervals = 5;
start_battery_state = 8.0;
battery_max_charge = 4.0;
battery_max_discharge = -4.0;
battery_min_storage = 0.0;
battery_max_storage = 7.0;
%charge_efficiency = 0.85;
%discharge_efficiency = 1.0;
charge_prices = [35.0,20.0,60.0,-5.0,20.0];
discharge_prices = [35.0,20.0,60.0,-5.0,20.0];
解决方案
这是来自 Gecode 求解器的错误。Gecode 仅对 Float 变量的支持有限,抛出错误表示浮点变量的域之一超出了 Gecode 可以支持的范围。
正如评论所示,当您的模型包含浮点变量时,约束规划求解器通常不是最佳求解器。相反,您可能想尝试基于混合整数编程的求解器。MiniZinc 包包括 OsiCBC 并支持 Gurobi 和 CPLEX,这些求解器很可能更擅长求解您的模型。
推荐阅读
- c - 在编译时在 C 中生成嵌套常量数组
- dependency-injection - Legacy code & Dependency Injection - 两者通信有什么妥协吗?
- mysql - MySQL 返回日期/时间现在减去 1 小时的记录?
- javascript - 对象克隆和 eval() 的 Javascript 问题
- javascript - 动态 Vue Router 变量,事先不知道变量
- javascript - 如何在javascript中增加日期以及如何禁用以前的日期?
- javascript - 将只读输入值发送到服务器(MEAN 堆栈)
- javascript - 如何使用 HTML 元素属性将数据从 Blade.php 文件传递到反应组件?
- python - 在字符串python中的“(数据)”中删除
- apache-spark - Pyspark 将所有嵌入式结构展平到同一级别