Seite 1 von 1

OPL: Sortieren mal anders

Verfasst: 25. Aug 2008 14:52
von SmilingJ
Hallo, ich habe grad' nochmal versucht aus dem Kopf raus zu sortieren und mir ist dabei eine Frage aufgekommen:

Im Script wird die Bedingung, dass jedes assignment genau einmal vorkommt auf folgende weise erzwungen:

forall (i in indices) i <> j => assignment <> assignment[j];

ich habe mich gefragt, ob folgende bedingung äquivalent ist:

forall (i in numbers) sum(j in numbers) (assignment[j] = i) = 1;

Re: OPL: Sortieren mal anders

Verfasst: 25. Aug 2008 15:02
von Ultr1
In der ersten Codezeile wird j nicht angegeben.

Im Grunde funktioniert dein Vorschlag, aber nur für bestimme Arrays. Es kann nur das Array sortieren, das in irgendeiner Reihenfolge die Zahlen 1 bis n beinhaltet.Das resultiert aus dem forall (i in numbers). Für eine Array wie z.B. [1,2,3,5,6,7] wird das nicht funktionieren, weil du nacheinander prüfst, ob die Zahlen eins bis sechs abgebildet worden sind.

Gruß

Re: OPL: Sortieren mal anders

Verfasst: 25. Aug 2008 15:11
von SmilingJ
oh.. so war das nicht gemeint.. ich sollte doch besser mal den code posten ... dann wird das klarer ...

Code: Alles auswählen

int+ length = ...;

range numbers = 1..length;

int+ input[numbers] = ...;

var int+ out[numbers] in 1..MAX_INT;
var int+ assignment[numbers] in numbers;

solve {
	forall(i in numbers) out[i] = in[assignment[i]];
	
	forall(i in numbers-1) out[i] <= out[i+1];
	
	forall(i in numbers) sum(j in numbers) (assignment[j] = i) = 1;
};

dass sollte doch aussagen, dass im assignment array alle nummern von 1 bis length genau einmal vorkommen, was ja einen ähnlichen zweck erfüllt wie die zeile aus den folien

Re: OPL: Sortieren mal anders

Verfasst: 25. Aug 2008 15:26
von Ultr1
Ah dann habe ich das falsche verstanden, nehme alles zurück, stimmt alles :oops: