Minizin c ошибка: недопустимый тип-экземпляр: ожидаемый `float ', фактический` var float' - PullRequest
0 голосов
/ 16 марта 2020

У меня есть следующая программа Minizin c, которая находится в стадии разработки для решения проблемы коммивояжера (TSP). Я знаю, что в ней отсутствует нечто большее, чем просто исправление этой ошибки, но я все же хотел бы понять, почему я получаю эту ошибку. Воспроизводимый пример ниже:

include "globals.mzn";

% Input Parameters 
int: NUM_POINTS;
float: MAX_TOTAL_DISTANCE;
array[0..NUM_POINTS-1] of int: points;
array[0..NUM_POINTS-1, 0..NUM_POINTS-1] of float: distance_matrix;

% Decision Variable: where to go next, from each point (indexed on points)
array[0..NUM_POINTS-1] of var 0..NUM_POINTS-1: next_point;  

% Constraints that define a valid tour
constraint alldifferent(next_point);  % each point only visited once
constraint next_point[NUM_POINTS-1] == points[0];  % not sure if this is helpful or not?

% see if we can find a feasible solution below max-total-distance
float: total_distance = sum(p in points)(distance_matrix[points[p],next_point[p]]);
constraint total_distance < MAX_TOTAL_DISTANCE;
solve satisfy;

output[show(total_distance) ++ "\n" ++ show(next_point)];

Я получаю ошибку:

MiniZin c: ошибка типа: значение инициализации для 'total_distance' имеет недопустимый тип-inst: ожидаемый 'float', фактический 'var float'

Я думаю, это говорит, потому что next_point используется в расчете total_distance, а next_point является переменной решения (var) что значит total_distance тоже должно быть? Но если я изменяю float: total_distance... на var float: total_distance..., я получаю новую ошибку в других точках:

MiniZin c: ошибка типа: значение инициализации для 'точек' имеет недопустимый тип: inst: ожидаемый 'array [int] of int', фактический 'array [int, int] of float'

Могу ли я просто не определять переменную на основе функции (например, суммы через) параметра и решения переменная? Я думаю, что мне здесь не хватает чего-то фундаментального. (Пример данных ниже для воспроизводимого примера):

% DATA (in my setup this is in a dzn file)
NUM_POINTS = 5;
points = [|
0, 0|
0, 0.5|
0, 1|
1, 1|
1, 0|];
distance_matrix = [|
0.0, 0.5, 1.0, 1.41, 1.0 |
0.5, 0.0, 0.5, 1.12, 1.12 |
1.0, 0.5, 0.0, 1.0, 1.41 |
1.41, 1.12, 1.0, 0.0, 1.0 |
1.0, 1.12, 1.41, 1.0, 0.0 |];

1 Ответ

0 голосов
/ 16 марта 2020

Одна проблема в том, как вы используете и объявляете points: он объявлен как отдельный массив, но в разделе «ДАННЫЕ» он определен как двумерная матрица. Какая польза от второго столбца, который содержит значение 0,5?

...