webForumDet fria alternativet

Ampl, villkor

7 svar · 672 visningar · startad av P

PMedlem sedan jan. 20012 204 inlägg
#1

Har en variabel matris på formen [a,b]. Som är 10x5, alltså 10 rader och 5 kolumner( om det nu är tvärtom man skriver). Med 1/0 som möjliga värden.

Skulle vilja sätta upp en villkorssumma som kontrollerar så att minst 7 av raderna i varje kolumn innehåller en 1:a och att dessa är i följd. Sliter mitt hår... :(

Peter SMedlem sedan dec. 20025 483 inlägg
#2

Om vi antar att raderna ligger i den första dimensionen:

int total = 0;

for (int i = 0; i < 5; ++i){
  int j = 0;
  while (j < 10 && arr[j++][i] != 1);
  // we might have found the first '1'
  // now, if the position j is greater than 3, 7 straight 1's cannot be found and thus we exit
  if (j > 3){
    // take appropriate action
    exit;
  }

  // so we're at a 1, let's count 'em!
  --j; // make sure we get the first finding
  int count = 0;
  while (arr[j++][i] == 1) ++count;

  if (count < 7){ // number of 1's less than 7
    exit;
  } else { ++total; }
}

if (total == 5){
  // happy!
}
PMedlem sedan jan. 20012 204 inlägg
#3

Peter S skrev:

Om vi antar att raderna ligger i den första dimensionen:

int total = 0;

for (int i = 0; i < 5; ++i){
  int j = 0;
  while (j < 10 && arr[j++][i] != 1);
  // we might have found the first '1'
  // now, if the position j is greater than 3, 7 straight 1's cannot be found and thus we exit
  if (j > 3){
    // take appropriate action
    exit;
  }

  // so we're at a 1, let's count 'em!
  --j; // make sure we get the first finding
  int count = 0;
  while (arr[j++][i] == 1) ++count;

  if (count < 7){ // number of 1's less than 7
    exit;
  } else { ++total; }
}

if (total == 5){
  // happy!
}

Är detta verkligen AMPL-kod? får en hel del kompileringsfel när jag försöker köra den. Sen skulle jag helst vilja använda mig av en linjär lösningsmetod (lp-solve) och då använder man sig av "subject to ..." för att ange villkor, känns som om man skulle använda koden ovan så skulle det inte bli linjärt, eller har jag fel?

Peter SMedlem sedan dec. 20025 483 inlägg
#4

Nej, det är inte AMPL-kod. Jag har själv aldrig använt det språket, utan koden ovan var endast tänkt som pesudokod på ditt problem. :)

PMedlem sedan jan. 20012 204 inlägg
#5

Peter S skrev:

Nej, det är inte AMPL-kod. Jag har själv aldrig använt det språket, utan koden ovan var endast tänkt som pesudokod på ditt problem. :)

:) Tack för svaret då, tyvärr så löser det nog inte "mitt" problem så får väl jobba vidare...

DannyMedlem sedan juli 200412 913 inlägg
#6

Du håller inte på att göra en Sudoku lösare som jag?! Isåfall har jag en bra pascal-sats:

  // Kollar om Num existerar på kolumnen
  function ExistsInCol(Num, Col: ShortInt): Boolean;
    var Row : ShortInt;
        NumString : ShortString;
  begin
    NumString := IntToStr(Num);
    Result    := False;
    For Row := 0 to 8 do
      If StringGrid1.Cells[Col,Row] = NumString Then
      Begin
        Result := True;
        Exit;
      End Else
        Result := False;
  end;

Sedan har jag en likadan nästan som kör Radvis. En som kollar om siffran finns i 3x3 rutan. Sedan körs dessa procedurer nästlade på följande vis:

    For Col := 0 to 8 Do
      For Rad := 0 to 8 Do
        For Num := 1 to 9 Do
        Begin
          ExistsInCol(Num,Col);
          ExistsInRow(Num,Row);
          ExistsInRegion(Num,Col,Row);
        End;

/red: lagt till lite

PMedlem sedan jan. 20012 204 inlägg
#7

Tyvärr inte håller på och försöker optimera ett schema, 1 symboliserar att man jobbar och 0 att man är ledig men jag vill inte ha några 0:or bland 1:orna utan jag vill att man ska arbeta konstant utan uppehåll under en dag. Så själva koden att kontrollera det i efterhand är inga problem utan det är just att sätta upp det villkoret som strular, så att det kommer med under genereringen

PMedlem sedan jan. 20012 204 inlägg
#8

Får väl markera som klart, hittade en lösning som jag kanske kan använda mig av på https://www.ampl.com .

128 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)