首页 > 解决方案 > 收到错误 - 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];

标签: linear-programmingminizinc

解决方案


这是来自 Gecode 求解器的错误。Gecode 仅对 Float 变量的支持有限,抛出错误表示浮点变量的域之一超出了 Gecode 可以支持的范围。

正如评论所示,当您的模型包含浮点变量时,约束规划求解器通常不是最佳求解器。相反,您可能想尝试基于混合整数编程的求解器。MiniZinc 包包括 OsiCBC 并支持 Gurobi 和 CPLEX,这些求解器很可能更擅长求解您的模型。


推荐阅读