>source

저는 일상에서 미니아연을 사용할 수 있는지 알아보려는 초보자일 뿐입니다. 내가 만들려고 하는 첫 번째 모델은 데이터 파일입니다.

기본적으로 내가 하려는 것은 이것이다. 한편으로는 다수의 코어, RAM 등과 같은 일부 속성을 가진 가상 머신 세트가 있습니다. 다른 한편으로는 클라우드 제공업체에서 가져온 VM 세트가 있습니다. 그것들도 비슷한 속성과 가격을 가지고 있습니다. 내가 하려는 것은 그것들을 일치시킨 다음 클라우드에서 해당 VM의 크기와 가격 사이에서 최적의 균형을 찾는 것입니다.

예를 들어, 2개의 코어와 8GB의 RAM이 있는 VM이 ​​있는 경우. 이를 일치시키기 위해 2개 이상의 코어와 8GB 이상의 RAM이 있어야 하는 클라우드 공급자의 몇 가지 종류의 VM을 잠재적으로 사용할 수 있습니다. 그러나 이러한 VM 세트의 경우 전체 비용을 최소화하고 동시에 측정된 성능을 최대화하려고ACU클라우드 제공자 입장에서.

사용하고 싶었습니다var float: targetFunc= (0.9 * totalPrice) /(0.1 * totalACU);계수가 모델을 가격 대비 성능으로 미세 조정하는 데 도움이 된다고 가정하면 대상 함수로 사용합니다. 그러나 아마도 내가 잘못하고 있습니다.

간단함을 위해 아래 code를 복사하여 붙여넣습니다.

enum existingVMs;
enum vmSizes;
enum vmDisks;
array[existingVMs] of int: vmCPU;
array[existingVMs] of int: vmRAM;
array[existingVMs] of int: vmDisk;
array[existingVMs] of int: vmCpuToRamRatio;
array[vmSizes] of int: vmSizeCPU;
array[vmSizes] of float: vmSizeRAM;
array[vmSizes] of int: vmSizePrice;
array[vmSizes] of int: vmSizeACU;
array[vmSizes] of int: vmSizeCpuToRamRatio;
array[vmDisks] of int: vmDiskSizes;
array[vmDisks] of float: vmDiskPrice;
array[existingVMs] of var vmSizes: selectedSize;
array[existingVMs] of var vmDisks: selectedDiskSize;
constraint forall(vm in existingVMs)(
    vmSizeACU[selectedSize[vm]] > 50
);
constraint forall(vm in existingVMs)(
    vmSizeRAM[selectedSize[vm]] >= vmRAM[vm]
);
constraint forall(vm in existingVMs)(
   vmSizeCPU[selectedSize[vm]] >=  vmCPU[vm] * 0.8
);
var int: totalPrice= sum(vm in existingVMs)(vmSizePrice[selectedSize[vm]]);
var int: totalACU= sum(vm in existingVMs)( vmSizeACU[selectedSize[vm]] );
var float: targetFunc= (0.9 * totalPrice) /(0.1 * totalACU);
solve maximize targetFunc;
output [ "\(totalPrice); \(totalACU)\n" ++ join("\n", ["\(vm), \(vmCPU[vm]), \(vmRAM[vm]), " ++
                                           "\(vmDisk[vm]), \(selectedSize[vm]), \(vmSizeCPU[selectedSize[vm]]), " ++
                                           "\(vmSizeRAM[selectedSize[vm]]), \(vmDiskSizes[selectedDiskSize[vm]]), " ++
                                           "\(vmSizePrice[selectedSize[vm]]), \(vmSizeACU[selectedSize[vm]])" | vm in  existingVMs]) ]

다음과 같이 실행합니다.

minizinc.exe  -i --solver coin-bc -s -a C:\Work\tools\demo\graphs-n-minizinc-demo\vmCostsCalculation.mzn C:\Work\tools\demo\graphs-n-minizinc-demo\vmData.dzn

그리고 응답으로 다음을 얻으십시오.

82 POSTs [ 0,0,0,0,0,0,0,0,0,0, ], LINEQ [ 0,0,0,0,0,0,0,0,82, ], 82 /82 vars, 82 cliques, 1 /1 /1 NSubIntv m/a/m, 252 /252 /252 SubIntvSize m/a/m, 82+0(0) clq eq_encoded  ... % Generated FlatZinc statistics:
%%%mzn-stat: paths=0
%%%mzn-stat: flatIntVars=21158
%%%mzn-stat: flatFloatVars=20831
%%%mzn-stat: flatIntConstraints=412
%%%mzn-stat: flatFloatConstraints=20831
%%%mzn-stat: method="maximize"
%%%mzn-stat: flatTime=4.09564
%%%mzn-stat-end
MiniZinc: internal error: Error: solver backend cannot handle constraint: float_div

사용해 보았습니다.지code그러나 너무 느리고 최적의 솔루션에 도달하지 못합니다.

내가 어디에서 뭔가를 잘못하고 있습니까? 대상 기능을 다르게 설정해야 할 수도 있지만 무엇을 변경해야 하는지, 왜 이렇게 작동하지 않는지 이해할 수 없습니다.

감사합니다!

오류 솔버 백엔드가 제약 조건을 처리할 수 없는 이유: float_div는 CBC 솔버가 div 제약 조건과 같은 비선형 제약 조건을 지원하지 않고 선형 제약 조건만 지원하기 때문입니다. Gecode, JaCoP, OptiMathSAT 및 Choco와 같이 비선형 부동 소수점 제약 조건을 지원하는 솔버가 있습니다. 모델을 실행할 수 있도록 질문에 작은 데이터 세트를 추가하면 속도를 높일 수 있는 더 나은 팁을 얻을 수 있습니다.

hakank2021-11-25 20:06:11

데이터 세트는 여기 링크에 있습니다

Eosfor2021-11-25 20:06:11

더 작은 데이터 세트가 있습니까?

hakank2021-11-25 20:06:11

안녕하세요, @hakank 저는 데이터 세트를 줄이고 파일을 git repo에 푸시했습니다. 실제로 "소스 VM" 세트는 동일합니다. "클라우드 공급자" 집합을 줄였습니다. 내가 해결하려고 할 때 totalPrice 최소화; coin-bc를 사용하면 거의 즉시 반환됩니다. gecode와 같은 것은 결코 끝나지 않습니다. 마지막 솔루션은 내가 해결할 때 coin-bc에서 찾은 솔루션보다 훨씬 뒤떨어져 있습니다. 여기서 targetFunc는 var float: targetFunc= (0.9 * totalPrice) /(0.1 * totalACU); 축소된 데이터 세트에서 coin-bc는 실패하지 않고 반환 및 응답합니다. 지code는 끝나지 않습니다.

Eosfor2021-11-25 03:04:36
  • 답변 # 1

    CBC 솔버에서 오류가 발생하는 이유백엔드가 제약 조건을 처리할 수 없음: float_div이 솔버는 다음과 같은 비선형 제약 조건을 지원하지 않습니다.div목표의 제약타겟 기능. 선형 제약 조건만 지원합니다.

    Gecode, JaCoP, OptiMathSAT 및 Choco와 같이 비선형 부동 제약 조건을 지원하는 솔버가 있습니다.

    Gecode 솔버의 속도를 높이려면 검색 휴리스틱을해결하다다음과 같은 기능:

    solve :: int_search(selectedDiskSize,first_fail,indomain_split) maximize targetFunc;
    

    검색 주석에 대한 설명은 다음과 같습니다.

    내가 더 작은 데이터 세트를 요청한 이유는 이러한 경우에 다른 휴리스틱을 시도할 수 있고 더 작은 데이터 세트가 좋은 선택을 얻기 위해 훨씬 더 빠르기 때문입니다.

    데이터 및 모델에서 부동 소수점 값을 사용하면 사용할 수 있는 FlatZinc 솔버의 범위가 제한됩니다. 정수 변수와 값만 있는 모델을 처리하는 솔버가 몇 개 더 있습니다.

    따라서 다른 접근 방식은 모든 부동 소수점 값을 정수로 변환하는 것입니다(일부 상수를 곱하고 그에 따라 다른 값을 조정). 그런 다음 다른 모든 FlatZinc 솔버를 사용할 수 있습니다. Chuffed, OR-tools, PicatSAT 등

    예, 나는 그것을 깨닫고 float를 int로 변환하여 문제를 해결했다고 생각합니다. 그러나 다음 과제는 "다목적 최적화"입니다. 하나의 매개변수인 비용을 최소화하고 "성능"을 최대화해야 하기 때문입니다. @hakank. gecode 또는 cbc에 대한 그러한 모델의 예가 있습니까?

    Eosfor2021-11-25 08:10:00

    OptiMathSAT와 관련하여 Windows 시스템에서 minizinc와 함께 작동하도록 만들 수 없었습니다. 그들이 제공하는 문서는 매우 열악합니다

    Eosfor2021-11-25 08:11:20

    @Eosfor 다중 목표 최적화(MiniZinc에서)를 수행하는 가장 좋은 방법은 원래 모델에서 수행한 작업을 수행하는 것입니다. 두 목표의 합인 결정 변수 생성(중요도에 따라 가중치가 다름). 또 다른 접근 방식은 먼저 한 매개변수에 대해 최적화하고 이를 제약 조건으로 추가한 다음 다른 매개변수에 대해 최적화하는 것입니다. 그러나 이것은 일반 MiniZinc에서 수행할 수 없지만 일종의 래퍼가 필요합니다. MiniZinc-Python: minizinc-python.readthedocs.io/en/latest .

    hakank2021-11-25 09:39:12

    @Eosfor 그리고 내 대답이 문제를 해결했다고 생각한다면 해결책으로 받아들이십시오.

    hakank2021-11-25 09:39:54
  • 이전 html : 사이드바 축소를 선형으로 만들고 수직 오정렬 방지
  • 다음 ID가 NodeJS를 사용하여 MongoDB의 컬렉션 B에 로컬인 컬렉션 A의 항목 이름 일치