Ik heb een procedure waarin ik een paar variabelen heb van hetzelfde type. Zodra ik 1 van die variabelen verander veranderen ze allemaal 
Ik vind het raar, maar ik maak denk ik een beginnersfout (ben ten slotte beginner
)
Het gaat om de volgende code:
Zodra ik 1 van "BesteZA, tmpZA, huidigeZA" deze drie verander veranderen ze allemaal, wat ik dus niet wil, anders had ik wel 1 variabele genomen. Wat gaat er verkeerd?
Voor degenen die het willen weten, dit is een procedure voor simulated annealing, een optimaliseringsmethode.
Ik vind het raar, maar ik maak denk ik een beginnersfout (ben ten slotte beginner
Het gaat om de volgende code:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
| procedure TfrMain.SimulatedAnnealing(ZA:ZoneArray); var Gevonden: boolean; VerwisselingenPerIt, i,Zone1,Zone2, Artikel1, Artikel2: integer; AfkoelingsFactor, StartTemp, StopTemp, Temp, BesteKosten, tmpKosten, HuidigeKosten, expn: double; BesteZA, tmpZA, huidigeZA: ZoneArray; tmpArtikel: ArtikelRec; begin {Eerst wordt de boel geinitialiseerd} VerwisselingenPerIt:=StrToInt(edtAantalVerwisselingenPerIteratie.text); AfkoelingsFactor:=StrToFloat(edtAfkoelingsfactor.text); StartTemp:=StrToFloat(edtStartTemperatuur.text); StopTemp:=StrToFloat(edtStopTemperatuur.text); temp:=StartTemp; BesteZA:=ZA; BesteKosten:=BerekenKosten(BesteZA); HuidigeZA:=BesteZA; HuidigeKosten:=BesteKosten; repeat tmpZA:=HuidigeZA; {Vervolgens worden er in tmpZA VerwisslingenPerIt verwisselingen gedaan} for i:=1 to VerwisselingenPerIt do begin {Kies twee verschillende zones waartussen verwisseld moet worden} Gevonden:=false; randomize; Zone1:=Random(High(tmpZA)); while NOT(Gevonden) do begin Zone2:=Random(High(tmpZA)); if (Zone1<>Zone2) then Gevonden:=true; end; {Kies een willekeurig artikel uit Zone1 en Zone2} Artikel1:=Random(High(tmpZA[Zone1])); Artikel2:=Random(High(tmpZA[Zone2])); {Verwissel de twee artikelen} tmpArtikel:= tmpZA[Zone1,Artikel1]; tmpZA[Zone1,Artikel1]:=tmpZA[Zone2,Artikel2]; tmpZA[Zone2,Artikel2]:=tmpArtikel; end; {Als de nieuwe toewijzing, tmpZA, betere kosten heeft dan de huidige kosten dan worden de verwisselingen geaccepteerd, zo niet dan worden de verwisselingen met een bepaalde kans geaccepteerd} tmpKosten:=BerekenKosten(tmpZA); if (tmpKosten < HuidigeKosten) then begin HuidigeKosten:=tmpKosten; //geaccepteerd HuidigeZA:=tmpZA; //geaccepteerd end else begin expn:= ((BesteKosten-tmpKosten)/(Temp)); if (exp(expn)>random) then begin HuidigeKosten:=tmpKosten; //geaccepteerd HuidigeZA:=tmpZA; //geaccepteerd end; end; {Als de huidige toewijzing beter is dan de beste dan wordt de beste de huidige} HuidigeKosten:=BerekenKosten(HuidigeZA); if (HuidigeKosten<BesteKosten) then begin BesteKosten:=HuidigeKosten; BesteZA:=HuidigeZA; end; {De temperatuur neemt af} Temp:= Temp*AfkoelingsFactor; {Stopcriterium} until temp<=StopTemp; ZA:=BesteZA; end; |
Zodra ik 1 van "BesteZA, tmpZA, huidigeZA" deze drie verander veranderen ze allemaal, wat ik dus niet wil, anders had ik wel 1 variabele genomen. Wat gaat er verkeerd?
Voor degenen die het willen weten, dit is een procedure voor simulated annealing, een optimaliseringsmethode.
[ Voor 3% gewijzigd door Oscar Mopperkont op 04-06-2003 16:56 . Reden: Aanvulling ]