2 van 2

Re: Sudoku

Geplaatst: zo 26 feb 2012, 18:06
door Jaimy11
Je gebruikt een procedure eliminate_rij en je geeft daar 2 argumenten mee (de dingen tussen de haakjes). De procedure die je geschreven hebt verwacht echter 3 argumenten, je gebruikt ze dus niet juist.
En hoe voorkom ik dat dan?

Ik neem aan dat de 3 argumenten staat voor de bovenste rijen van de 3 matrices (3x3)?

Dit is hoe hij gedefinieerd is:

eliminate_rij := procedure(A, ~cand_rij)

Dus zag al dat ik het "~"-teken miste.

Aangepast.

Nu is het deze foutmelding:

Code: Selecteer alles

>> eliminate_rij := procedure(A, ~cand_rij)

   ^

User error: Imported environment value 'eliminate_rij' cannot be used as a local

Re: Sudoku

Geplaatst: zo 26 feb 2012, 18:51
door Xenion
Post je volledige code voor die procedure eens en hoe je ze aanroept.

Re: Sudoku

Geplaatst: zo 26 feb 2012, 19:13
door Jaimy11
Post je volledige code voor die procedure eens en hoe je ze aanroept.


Dit is de code:

Code: Selecteer alles

eliminate_rij := procedure(A, ~cand_rij)

for a in [1..9] do

  for b in [1..9] do

	if A[a][b] ne 0 then

	Exclude(cand_rij[a],A[a][b]);

	end if;

  end for;

end for;

print cand_rij;

end procedure;


En hier gaat het mis denk ik:

Code: Selecteer alles

oplossing_sudoku := procedure(A)

cand_rij := [ [1..9] : a in [1..9] ];

cand_kolom := [ [1..9] : b in [1..9] ];

cand_vierkant := [ [1..9] : g in [1..9] ];

cand := [ [ [] : h in [1..9] ] : i in [1..9] ];

eliminate_rij(A, ~cand_rij);

eliminate_kolom(A, ~cand_kolom);

eliminate_vierkant(A, ~cand_vierkant);

sequence := [ [] : j in [1..81] ];

defsequence := [ [] : k in [1..81] ];

eliminate_cand(A, cand_rij, cand_kolom, cand_vierkant, ~cand, ~sequence, ~defsequence);

cand := defsequence;

print cand;

opties_cand(~A, ~cand);

opties_cand(~A, ~cand);

eliminate_rij := procedure(A, ~cand_rij)

for a in [1..9] do

  for b in [1..9] do

	if A[a][b] ne 0 then

	Exclude(~cand_rij[a],A[a][b]);

	end if;

  end for;

end for;

print cand_rij;

end procedure;

Re: Sudoku

Geplaatst: zo 26 feb 2012, 19:20
door Xenion
Mijn gok is dat je ergens al een andere definitie van eliminate_rij hebt, maar ik ben niet bekend met Magma, dus ik weet niet wat er allemaal mag/kan.

Re: Sudoku

Geplaatst: za 24 aug 2013, 10:20
door NicoW
Typhoner schreef: ma 16 jan 2012, 22:29
ik heb zelf ooit zoiets geschreven: het werkte in ieder geval met alle sudoku's uit de krant :)

...

Verrassend genoeg is dit voldoende voor de meeste sudoku's. Ik heb nog iets geavanceerdere methoden bedacht, maar die heb ik nooit getest.
De krant koopt Sudoku's en andere puzzels, van een bedrijf. Daarbij wordt onderhandeld over de eigenschappen van de puzzels. Bijvoorbeeld het AD stelt dat de puzzels 'echt heel eenvoudig' moeten zijn. Hun 'sudoku light' bevalt de technieken: naked single, hidden single. Meer niet. Hun 'sudoku heavy' bevat ook de row/block interaction (ook wel pointing pairs genoemd) óf naked pairs. Vaak gaat dat per serie aangekochte sudoku's.

Als je bedenkt dat het totaal aantal bekende technieken ongeveer 34 is, dan zie je dat dit heel simpele sudoku's zijn.

Menselijke logica werkt anders dan computerlogica.

Bedenk maar eens, hoeveel hersencellen actief zijn, als je 1+3 probeert uit te rekenen!

Het programmeren van mensenlogica in sudoku's is niet altijd tijdsefficiënt.

Re: Sudoku

Geplaatst: za 24 aug 2013, 15:37
door Benm
Het stuk van Norvig (http://norvig.com/sudoku.html) legt het behoorlijk goed uit.

Constraint Propagation is iets dat mensen ook doen, alleen pakken ze dat anders aan dan een computer - meer met nadenken zonder wat te noteren dan domweg de constraints na gaan voor ieder vakje. Voor een computer is alle contstrains voor alle 81 vakjes bepalen een klusje van niets, maar wil je het handmatig doen ben je waarschijnlijk een middag verder.

De volgende stap is net zo goed een aanval waarbij van de snelheid van computer gebruik gemaakt wordt, maar slimmer dat brute force: Omdat je weet welke vakjes het minst aantal mogelijkheden hebben, is het handig die als eerste te 'brute forcen'.

Interssant is wel dat er een aantal puzzels zijn die voor dit algorithme blijkbaar bijzonder zwaar zijn: gemiddeld 0.01 seconde voor een random soduko, maar 1439 voor de moeilijkste.

Bijgedachte: Zijn er puzzels die de gemiddelde mens sneller oplost dan de gemiddelde pc? Uiteraard onder voorwaarde dat ze uberhaupt op te lossen zijn via een computer.