Minizinc 구문과 관련하여 간단한 질문이 있습니다.Minizinc,지도 또는 사전 데이터 구조를 만드는 방법
rates_index_0 = array2d(1..3, 1..501, [ 15, 20, 23, ....
rates_index_12 = array2d(1..3, 1..501, [ 21, 24, 27, ....
...
참고 : -
인덱스 번호는 그 격차 (> 20 예, 12)가 다음과 같이 파일 .dzn 내 입력, 2 개 dimentional 배열 (약 최대 30 배열)의 집합을 포함 선언내 모델에서는 변수의 값에 따라 이러한 배열 중 하나를 사용해야합니다. 공통 프로그래밍 언어에서는지도 또는 사전 데이터 구조를 사용하여이를 해결할 것입니다. 그러나 Minizinc에서 나는 다음과 같은 방법으로이 하드 코딩 오전 :
function var int: get_rate(int: index, var int: load, int: dc_size) =
if index == 0 then
rates_index_0[dc_size, load]
else if index == 12 then
rates_index_12[dc_size, load]
else if index == 16 then
rates_index_16[dc_size, load]
else if index == 20 then
rates_index_20[dc_size, load]
else
assert(false, "unknown index", 0)
endif endif endif endif;
이 코드를 가진 하나의 명백한 문제는 내가 모델에게 내가 입력을 변경할 때마다 변경해야한다는 것입니다. 이 코드를 일반적인 방식으로 코딩하는 더 좋은 방법이 있습니까?
감사합니다.
좋아요. 컴파일 시간과 메모리 사용에 대한 진술을 명확히 해 주시겠습니까? array3d (0..60, 1..3, 1..501)는 60 array2d (1..3, 1..501)보다 많은 계산/메모리 리소스를 사용합니까? 당신의 솔루션을 이해했습니다. 기본적으로 배열 2ds를 하나의 3d로 병합 한 다음 인덱스를 매핑합니다. 유일한 단점은 데이터가 인간에게 더 이해하기 어렵다는 것입니다. 그러나 당연히 모델을 바꾸지 않아도됩니다. 감사! – kirbo
나는 당신에게 요점이 있다고 생각한다! 메모리 소비에 관해서는 컴파일 된 3d 배열보다 2 차원 배열이 더 많은 메모리를 차지하지 않습니다. 그러나 변환 단계를 수행하고 싶지 않고 3d 배열에서 2 차원 배열이 아닌 여분의 (빈) 배열을 추가하도록 선택하면 큰 메모리 오버 헤드가 발생할 수 있습니다. – Dekker
, 감사합니다! – kirbo