Notesæt til Optimering i Microsoft Excel



Relaterede dokumenter
Kapitel 9. Optimering i Microsoft Excel 97/2000

! #!! $ % $! & " &'"! & *+ "! " $ $ ""!,-! $!.! $! " # 1!! &' "

% &$ # '$ ## () %! #! & # &, # / # 0&. ) / & #& #

Noter til kursusgang 8, IMAT og IMATØ

Portal Registration. Check Junk Mail for activation . 1 Click the hyperlink to take you back to the portal to confirm your registration

Noter til kursusgang 9, IMAT og IMATØ

IBM Network Station Manager. esuite 1.5 / NSM Integration. IBM Network Computer Division. tdc - 02/08/99 lotusnsm.prz Page 1

Linear Programming ١ C H A P T E R 2

Start Excel Du skal starte med at åbne Excel. I Excel åbner du herefter en tom projektmappe.

! " # $% &'!& & ' '" & # ' "&()(*& + + +,-' "&( # &(! (! " )(!# &!! (!&!! * (! +& (!!! & " " & & / & & (!

Hent filoplysninger fra billeder og filer

Boligsøgning / Search for accommodation!

' #$*# ' # #) * #& #& ' # #* #, #$--

Opret en Powerpoint præsentation automatisk med VBA

how to save excel as pdf

$ %' ) * %' +,! - Myarray %' /0 / /0 /0

+ "&"' +,! ")& - )'.** /, )'.** 1 2 "&"' +,! 3 *4 5

Accessing the ALCOTEST Instrument Upload Data - NJSP Public Website page -

Privat-, statslig- eller regional institution m.v. Andet Added Bekaempelsesudfoerende: string No Label: Bekæmpelsesudførende

User Manual for LTC IGNOU

Vores mange brugere på musskema.dk er rigtig gode til at komme med kvalificerede ønsker og behov.

E-PAD Bluetooth hængelås E-PAD Bluetooth padlock E-PAD Bluetooth Vorhängeschloss

SPECIALTRYKKERIETS KUNDE WEBPORTAL KOM GODT I GANG

Generalized Probit Model in Design of Dose Finding Experiments. Yuehui Wu Valerii V. Fedorov RSU, GlaxoSmithKline, US

Help / Hjælp

LINEÆR PROGRAMMERING I EXCEL

Project Step 7. Behavioral modeling of a dual ported register set. 1/8/ L11 Project Step 5 Copyright Joanne DeGroat, ECE, OSU 1

TM4 Central Station. User Manual / brugervejledning K2070-EU. Tel Fax

Ugeseddel 12( )

Before you begin...2. Part 1: Document Setup...3. Part 2: Master Pages Part 3: Page Numbering...5. Part 4: Texts and Frames...

Skriftlig Eksamen Beregnelighed (DM517)

Skriftlig Eksamen Kombinatorik, Sandsynlighed og Randomiserede Algoritmer (DM528)

Aktivering af Survey funktionalitet

Værktøjer fra værktøjskassen. Søren Breddam, Stevns Kommune

Vina Nguyen HSSP July 13, 2008

PMDK PC-Side Basic Function Reference (Version 1.0)

The purpose of our Homepage is to allow external access to pictures and videos taken/made by the Gunnarsson family.

2013 SP1. Konfiguration af koncernindblik. Configuration Guide

Det er muligt at chekce følgende opg. i CodeJudge: og

StarWars-videointro. Start din video på den nørdede måde! Version: August 2012

MS Visual Studio Basic En kort vejledning

"# $%$ " # $ % $ $ " & ( ) *+!,! Sum_Cost >= 5000SirName = Beltov Continue = %!- + ( ( - True) Continue *! If Antal <= 20 Then EnhedsOmk = 1.

Aarhus Universitet, Science and Technology, Computer Science. Exam. Wednesday 27 June 2018, 9:00-11:00

! "# $$ &'()*"* +*, & &"*0* & "# % %- %

Vejledning PROPHIX 11. Driftsbudgettering ved åbning af templates (Kun til Avanceret-brugere)

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13

Skriftlig Eksamen Beregnelighed (DM517)

FORMLER OG FUNKTIONER I EXCEL

ISCC. IMM Statistical Consulting Center. Brugervejledning til beregningsmodul til robust estimation af nugget effect. Technical University of Denmark

WIKI & Lady Avenue New B2B shop

Unitel EDI MT940 June Based on: SWIFT Standards - Category 9 MT940 Customer Statement Message (January 2004)

Vejledning i udtræk af input-output data fra Statistikbanken

vil jeg blive mindet om det af VBA allerede mens jeg skriver koden, da der er tale om en såkaldt kompileringsfejl:

Status på det trådløse netværk

Opsætning af Backup. Hvis programmet registreres korrekt vises nedenstående skærmbillede. Genstart herefter programmet.

On the complexity of drawing trees nicely: corrigendum

Workshop G4 MicroStation V8 XM edtion nye værktøjer 2

Black Jack --- Review. Spring 2012

Løsning af skyline-problemet

BentleyUser.dk 2009 MicroStation tips og tricks. Tine Lai Andersen Bentley Institute Instructor

ALMINDELIGT ANVENDTE FUNKTIONER

IBM WebSphere Operational Decision Management

Skriftlig Eksamen Diskret matematik med anvendelser (DM72)

CS 4390/5387 SOFTWARE V&V LECTURE 5 BLACK-BOX TESTING - 2

DM559/DM545 Linear and integer programming

Sortering fra A-Z. Henrik Dorf Chefkonsulent SAS Institute

Opsætning af Backup. Dette er en guide til opsætning af backup med Octopus File Synchronizer.

CHAPTER 8: USING OBJECTS

Besvarelser til Lineær Algebra Reeksamen Februar 2017

Fejlbeskeder i SMDB. Business Rules Fejlbesked Kommentar. Validate Business Rules. Request- ValidateRequestRegist ration (Rules :1)

ECE 551: Digital System * Design & Synthesis Lecture Set 5

" #" $ " "!% &'% ' ( ) * " & #

Praktiske Maple kommandoer og arbejdsmåde

1. Opbygning af et regneark

Emneopgave: Lineær- og kvadratisk programmering:

Bilag 8. TDC technical requirements for approval of splitterfilters and inline filters intended for shared access (ADSL or VDSL over POTS).

Advanced Word Template Brugermanual

GIS. Guide til indlæsning af data i ArcGIS herunder KMS-data fra internettet

GIS indlæsning af kreditorer og betalingsform. Brugervejledning 1.0

ArbejsskadeAnmeldelse

UNISONIC TECHNOLOGIES CO.,

HOFTEALLOPLASTIK - DATAUDTRÆK OG IMPORT TIL EXCEL

DET KONGELIGE BIBLIOTEK NATIONALBIBLIOTEK OG KØBENHAVNS UNIVERSITETS- BIBLIOTEK. Index

WT-1011RC Programmer User Guide

Kursusbeskrivelse Microsoft Excel Grundkursus

WT-1011RC Programmer User Guide

Under 'Microsoft Block Editor', klik 'New project' for at åbne block editor-værktøjet.

Business Rules Fejlbesked Kommentar

HTX, RTG. Rumlige Figurer. Matematik og programmering

3D NASAL VISTA TEMPORAL

MicroStation tips & tricks

Sitecore Glossary. Sitecore Training. Sitecore glossary in Danish and English. Sitecore Training Sitecore Glossary Rev:

Udvikling af DOTNET applikationer til MicroStation i C#

SPØRGSMÅL TIL UDBUD AF SYSTEMUNDERSTØTTELSE AF GEODANMARK PRÆKVALIFIKATIONSFASEN

Fejlbeskeder i Stofmisbrugsdatabasen (SMDB)

REDIGERING AF REGNEARK

KUNDE-WEBPORTAL KOM GODT I GANG

DMX styring med USB-interface

3D NASAL VISTA 2.0

3. PROJEKT, 2 SEMESTER

Transkript:

Tor Beltov - Side 1/44 Syddansk Universitet, Odense Universitet Institut for Organisation og Ledelse Notesæt til Optimering i Microsoft Excel

Tor Beltov - Side 2/44 Optimering i Microsoft Excel 97/2000 Dette afsnit introducerer nogle af de principper som løseren i Microsoft Excel er bygget på: Typer af problemer der kan løses, typiske applikationer, hvorledes løsningsmodeller konstrueres, og praktiske hints så løseren anvendes effektivt. Hvad kan løseren? Problemløseren i Microsoft Excel kan anvendes til egentlig lignings-løsning, også kaldet goalseeking eller back-solving, og funktionsoptimering med bibetingelser. Metoderne til at løse optimeringsproblemer med bibetingelser er lineær programmering, ikke-lineær programmering og heltallig programmering. Lignings-løsning. I en normal what-if operation i et regneark, indtastes eller ændres input værdier, og regnearket udregner output værdierne, f.eks. forskellige formelværdier som afhænger direkte af indtastede inputs. Løseren kan betragtes som en metode til at udføre en modsat what-if analyse. Hvis output værdierne for forskellige formler specificeres, kan løseren bestemme de inputværdier som netop giver de output værdier som blev specificeret. Når løseren anvendes til at finde inputværdierne som resulterer i en specificeret formelværdi, løses en ligning i flere ubekendte. Dette kaldes også goalseeking eller backsolving. Løseren i Microsoft Excel kan løse en mængde af simultane ligninger i flere ubekendte på én gang. De ubekendte er regnearkets input celler ( hvilket også kaldes de redigerbare celler i den danske version af Excel) og ligningerne har formen A1 = B1 hvor A1 og B1 indeholder formler som indeholder de ubekendte. Optimering under bibetingelser. Man kan anvende løseren til at finde en mængde af inputværdier som opfylder en mængde af simultane ligninger og uligheder. Når dette forsøges, eksisterer der typisk mere end et sæt af brugbare input værdier. Løseren kan derfor anvendes til at finde den bedste mængde af inputværdier som enten minimerer eller maksimerer en bestemt målfunktion som specificeres. Løseren kan sagtens maksimere eller minimere en formel uden at der skal være bibetingelser

Tor Beltov - Side 3/44 tilstede. Hvis løseren anvendes til at finde A1 sådan at (A1/2-1)^2 minimeres, vil løseren finde A1=2, hvor formlen er lig 0. Input værdierne som løseren skal finde kaldes beslutningsvariablene, og disse repræsenteres i Excel som celler indeholdende tal. Ligningerne repræsenteres i Excel ved dels en celle som udregner en formel, dels en relation (=, >=, <=), og en anden celle som udregner en formel. Målfunktionen /objektivfunktionen, som enten skal maksimeres eller minimeres, er simpelthen en anden celle indeholdende en formel. Formulering af en model. For at formulere en optimeringsmodel i et regneark, skal følgende trin følges: 1. Reserver en celle til at holde værdien af hver beslutningsvariabel 2. Vælg en celle til at repræsentere objektfunktionen, og indtast formlen som udregner objektivfunktionsværdien i denne celle. 3. Vælg andre celler og anvend dem til at indtaste formlerne som udregner venstresiderne af ligningerne 4. Højresiderne kan indtastes som tal i andre celler, eller indtastes direkte i løserens tilføj ligning dialog boks. Indenfor denne struktur er der stor fleksibilitet for layout-valg og formatering af celler, som repræsentere variable og ligninger, og hvilke formler og indbyggede funktioner der anvendes. For eksempel kan alle formler i et lineært programmeringsproblem altid formuleres ved hjælp af SUMPRODUCT (SUMPRODUKT i den danske versione) funktionen. Et varesammensætningseksempel I Excel findes et antal eksempelfiler som dette afsnit vil trække på. Disse ligger som regel under.\samples kataloget i Microsoft Office hovedkataloget. Eksempel filen SOLVAMP.XLS indeholder blandt andet et Product mix problem (Product mix problemet i eksempelfilen er en smule mere komplex, idet problemet er ikke-lineært.). I Produkt mix eksemplet skal der for et firma som producerer TV-apparater, stereoanlæg og højttalersystemer ved at samle enkeltkomponenter som strømforsyninger, højttalere m.v., bestemmes den mest rentable varesammensætning.

Tor Beltov - Side 4/44 For at samle et TV skal der anvendes et kabinet, et billedrør, to højtalerenheder, en strømforsyning og to elektronikdele. For at samle et stereoanlæg skal der anvendes et kabinet, to højtalerenheder, en strømforsyning og en elektronikdel. For at samle en højtaler skal der anvendes en højtalerenhed og en elektronikdel. Profitten ved at sælge TV-apparater er på $75 per enhed, $50 per stereo-anlæg og $35 per højtaler. På lageret er der pt. 450 kabinetter, 250 billedrør, 800 højtalerenheder, 450 strømforsyninger og 600 elektronikdele. Før oplysningerne indtastes i et regneark, skal den matematiske formulering af problemet lige formuleres. Lad x 1 være antallet af TV-apparater, x 2 antallet af stereo-anlæg og x 3 antallet af højtalere. Profitten kan formuleres som: Profit: Max 75x + 50x + 35x 1 2 3 For at samle hvert produkt, skal et bestemt antal halvfabrikata anvendes, og dette formulerer vi som: 1x + 1x + 0x 450 ( kabinetter) 1 2 3 1x + 0x + 0x 250 ( billedrør) 1 2 3 2x + 2x + 1x 800 ( højtalerenheder) 1 2 3 1x + 1x + 0x 450 ( strømforsyninger) 1 2 3 2x + 1x + 1x 600 ( elektronikdele) 1 2 3 Og da antallet af hver produkt ikke kan være negativt indfører vi ligeledes ligningerne at: x1, x 2, x 3 0 I Excel vil ovenstående problem se således ud:

Tor Beltov - Side 5/44 Det næste skridt er at lavet et regneark hvor formlerne for objektivfunktionen og bibetingelserne udregnes. I det ovenstående regneark, er cellerne D9, E9 og F9 reserveret til at holde vores beslutningsvariable x 1, x 2 og x 3. Læg ligeledes mærke til at cellerne D17, E17 og F17 holder profitten for varerne. Disse informationer tillader dermed at objektivfunktionsværdien i celle D18 kan udregnes som: SUMPRODUKT(D17:F17;D9:F9) eller SUMPRODUCT(...) i den engelske version I tableauet D11:F15 indtastes koefficientmatricen, altså de tal som beskriver antallet af delelementer der skal anvendes til at lave et givet produkt. For eksempel udsiger tallet 2 i celle D13 at vi skal anvende 2 højtalerenheder for at samle et TV-apparat. Som det ses, er disse tal de samme som dem der er givet i den matematiske model ovenfor. Disse informationer tillader dermed at bibetingelserne formuleres. F.eks vil den første bibetingelse i celle C11 se således ud: SUMPRODUKT(D11:F11;$D$9:$F$9)

Tor Beltov - Side 6/44 Bemærk her $-tegnene som jo angiver at cellereferencen er fast. Kopiering af formlen til de fire nedenstående celler C12:C15 er dermed mulig. I cellerne B15:F15 indtastes vores højresider, altså de mængder af delelementer vi pt. har på lager. Disse informationer tillader dermed at vi kan specificere vores bibetingelser vist tidligere som: C11:C15 <= B11:B15 Som er short hand for C11 <= B11, C12 <= B12,..., C15 <= B15. Denne form kan indtastes direkte i Løser-dialog boxen, hvor vi ligeledes indtaster ligningerne: D9:F9 >= 0 for at sikre at vores beslutningsvariable forbliver positive. Brug af Løser Dialog bokse For at give løseren informationer om hvilke celler i regnearket som repræsenterer beslutningsvariablene, ligningerne og objektivfunktionen, vælges Funktioner Problemløser i Excel, som får en løserens dialogboks til at springe op. I Angiv målcelle boksen, skal objektivfunktionen dvs. celle D18 indtastes eller vælges med musen. I Ved redigering af cellerne boksen skal cellerne D9:F9 indtastes eller vælges med musen. For at tilføje bibetingelserne skal der vælges Tilføj og indtastes i Cellereference boksen C11:C15, og B11:B15 i Betingelse boksen. Default relationen <= er OK.

Tor Beltov - Side 7/44 Dernæst vælges tilføj igen og ikke-negativitetsbetingelserne for beslutningsvariablene defineres. Alle informationer til løseren er nu stede, og Problemløserparametre boksen ser nu således ud: Løsning af problemet For at finde den optimale løsning, skal Løs knappen trykkes! Efter et stykke tid returnerer løseren den optimale løsning: 200 i celle D9 og E9, og 0 i celle F9. Oversat vil det sige, at der skal samles 200 TV-apparater, 200 Stereo-anlæg og ingen højtalere, for at tjene en profit på $25000 (vist i celle D18). Ligeledes springer Problemløserresultat boksen op, som ser således ud:

Tor Beltov - Side 8/44 Hvis der klikkes på Svar i Rapporter listboksen bliver der produceret en svarrapport. Rapporten, som er listet herunder viser the oprindelige og endelige værdier for objektfunktionen, beslutningsvariablene samt status for hver bibetingelse i den optimale løsning. Bemærk, at ligningerne for højtalerenheder og elektroniskdele er bindende og derfor har en slack værdi (overskydende) på 0. Alt hvad der er på lager af disse to delprodukter anvendes, hvorimod der er overskydende varer på lager for de andre delprodukter. På kort sigt kan det konkluderes, at der kan samles yderligere produkter og derfor genereres yderligere profit, hvis ekstra højtalerenheder og elektronikdele fremskaffes. Hvis man er interesseret i at vide hvor meget man i så fald er villig til at betale for disse to delelementer, skal vi have fat i følsomhedsanalyse rapporten. Modellen skal da løses igen (hvis man da ikke valgte at generere denne rapport fra begyndelsen). Når rapporten er genereret vil den i dette tilfælde se således ud:

Tor Beltov - Side 9/44 Som det kan ses i afsnittet for betingelserne, er skyggeprisen for netop højtalerenheder og elektronikdele strengt positive, og angiver groft sagt hvor meget man er villig til at betale for en enhed af hver. I rapporten angives endvidere hvor stor det tilladelige fald og hvor stor den tilladelige forøgelse må være, for hver højreside, uden at den optimale løsning ændres. Hvis du er kommet frem til det samme resultat, ved du nu hvordan man løser LP - problemer i Excel!. I det efterfølgende bliver nogle gode råd til hvordan læselige og håndterbare modeller kan genereres i Excel. Gode råd til modelbygning Mange af de problemer der opstår når modeller løses i Excel kan adresseres til den valgte, dårlige, struktur modelbyggeren har konstrueret. Der kan spares mange timers hovedpine ved nøje at overveje hvordan modellen skal tage sig ud. Nedenstående, som igen baserer sig på Product mix eksemplet fra før, giver nogle enkle råd til hvordan man undgår at generere såkaldte spaghetti modeller.

Tor Beltov - Side 10/44 Et modeleksempel Betragt igen Product mix eksemplet som herunder er gengivet: Identifikation af indeksmængderne Indeksmængder er et koncept som anvendes i algebraiske modelleringssprog som GAMS og AMPL. Konceptet er også i regnearksregi meget anvendeligt, idet disse mængder, når de er defineret gør det nemmere at bestemme og holde styr på antallet af beslutningsvariable og antallet af ligninger. F.eks. er indeks mængderne i ovenstående Product mix eksempel Produkter ( TVapparater, Stereo-anlæg og højtalere) og delelementer (Kabinetter, Billed rør, Højtalerenheder, Strømforsyninger og Elektronikdele ).

Tor Beltov - Side 11/44 Indeksmængde layout i kolonner og rækker. Som illustreret ovenfor, er det en god idé at vælge et layout hvor indeks mængderne okkuperer kolonner og rækker. Normalt skrives indeks medlemmerne som labels over hver kolonne eller til venstre for hver række. Når modellen er defineret over to indeks mængder er det ligeledes en god idé at orientere den ene mængde rækkevis og den anden mængde kolonnevis. Hvis en model er indekseret over tre eller flere mængder, kan man konstruere to-dimensionale tabeller og enten kopiere dem igennem workbook en, dvs. oprette et nyt regneark for hver yderligere medlem af den tredie (eller højere) dimension eller kopiere tabellen ned under i samme regneark. Alloker celler til beslutningsvariablene og ligningerne. Det næste der skal gøres er, at allokere celler i kolonnerne og rækkerne til at holde værdierne af beslutningsvariablene og venstre- og højresiderne for ligningerne. Når det er muligt, skal disse celler placeres ved de labels som repræsenterer indeks mængde medlemmerne. I ovenstående problem, er beslutningsvariablene allokeret i cellerne D9:F9 direkte under produkt labelene. Ligningernes højresider (delelementer på lager) er i cellerne B11:B15, og venstresiderne er i cellerne C11:C15. Med dette layout skal vi udelukkende indsætte en kolonne hvis vi udvider produktionen med en ny vare, eller indsætte en ny række hvis vi får andre delelementer på lager, som skal indgå i produktionen. Allokér celler til koefficientmatricen og andre parametre. I lineær programmering, kan objektfunktionen og ligningerne skrives på følgende form: a x + a x + + a x 1 1 2 2 n n Men istedet for at skrive hele formlen explicit i en celle, er det tilrådeligt at placere koefficienterne dvs. a i erne i deres egne celler og derefter anvende SUMPRODUKT funktionen til at udregne den aktuelle værdi. Husk på, at formlen for celle D18 var: SUMPRODUKT(D17:F17;D9:F9) og for venstresiderne: SUMPRODUKT(D11:F11;$D$9:$F$9)

Tor Beltov - Side 12/44 i celle C11, og derefter denne formel kopieret til de efterfølgende fire celler (C12:C15). I ikke-lineære modeller er koefficienterne typisk ikke på samme form, men der vil stadig være parametre som er konstante i en givet iteration. Placer derfor også disse parametre i deres egne celler, det letter arbejdet senere. Anvende fonte, rammer og skyggeeffekter. Som de sidste råd omkring det at lave læsevenlige og administrationsmæssige lette modeller, kan nævnes fonte, rammer og skyggeeffekter. I product mix eksemplet anvendes rammer til at angive beslutningsvariablene, venstresiderne, højresider og objektkoefficienterne i cellerne D17:F17. Kursiveret tekst anvendes til at angive labelene for indeks mængde medlemmerne, så disse afviger fra almindelig tekst og andre labels. Ligeledes kan man ved at anvende diverse skyggeeffekter yderligere fremhæve bestemte dele af modellen. Der er faktisk kun fantasien, som sætter begrænsningerne. Anvend Ranges for variablene og ligningerne. En smart feature i de fleste regnearksprogrammer er muligheden for at navngive de såkaldte ranges. Et range er en sammenhængende liste af celler, som beskriver et eller andet - tænk foreksempel på vektorer og matricer. I product mix eksemplet er ranget D9:F9 produkterne der produceres. Så hvorfor ikke kalde dette range for Produkter? Måden hvorpå dette gøres i Excel er, at markere ranget D9:F9 og vælge Indsæt - Navn og vælge definér. Herefter fås følgende dialogboks:

Tor Beltov - Side 13/44 Indskriv Produkter og tryk OK eller Tilføj hvis du vil addere flere. Navnet produkter refererer herefter til ranget $D$9:$F$9 i arket Varesammensætning. Hvis alle ranges nu defineres på tilsvarende måde - dvs. DeleAnvendt = C11:C15, LagerBeh = B11:B15, Profit = D17:F17, og TotalProfit = D18 får Definer navn dialogboksen følgende udseende: Disse Ranges kan nu anvendes med regnearkets GoTo funktion, hvilket gør det lettere at indentificere og manipulere elementerne i modellen. En anden benefit ved at navngive ranges er, at vi i løsningen af modellen nu ikke behøver at huske på de forskellige cellers placering og derfor kan skrive formler som: SUMPRODUKT(Profit; Produkter) for objektfunktionen. Også i problemløserparameter dialogboksen kan dette anvendes. En model udelukkende formuleret vha. ranges vil da se således ud:

Tor Beltov - Side 14/44 Hvilket i mange sammenhænge virker mere overskueligt. I Microsoft Excel kan man hvis man f.eks. definerer hele blokken med koefficienter, som Koefficienter = D11:F15 skrive en array formel a la Ax T : {=MMULT(Koefficienter, TRANSPOSE(Produkter))} eller version. {=MPRODUKT(Koefficienter;TRANSPONER(Produkter))} i den danske hvilket udregner alle ligningerne i cellerne C11:C15 - Det er smart! Du opretter matrixformler på samme måde, som du opretter andre formler, bortset fra, at du skal trykke på CTRL+SKIFT+ENTER for at indsætte formlen. Disse definitioner af ranges vil generelt gøre det meget nemmere at udvide en model. I Product mix eksemplet kan produkter eller delelementer adderes uden at man så skal redefinere navnene og uden at man skal hen og respecificere Problemløserparametrene. Ligeledes er ranges et uundværligt stykke værktøj når man ønsker at kontrollere og anvende problemløseren fra VBA, hvilket er emnet for næste afsnit.

Tor Beltov - Side 15/44 Kontrol af Problemløseren med VBA Ethvert aspekt af Prolemløserens operationer kan kontrolleres ved hjælp af programmering. Man kan vise eller simpelthen skjule Problemløserens dialogbokse, oprette eller ændre valget af objektivet, variable og ligningerne, checke om den optimale løsning blev fundet og producere rapporter. Alt dette kan gøres ved simple kald til problemløser specifikke funktioner fra et VBA program., som kan programmeres direkte under Excel. Når der er reference til SOLVER.XLA, gives der adgang til en række funktioner som er listet i appendix I. For at få reference til SOLVER.XLA i VBA skal man vælge Tools menuen og derefter References og klikke i solver.xls boksen, når man har defineret sit modul. VBA - editoren laver herefter et ekstra punkt under punktet Modules, kaldet References: I det nedenstående vil de løserspecifikke VBA-funktioner blive eksemplificeret, men det er en god idé at konsultere hjælpe funktionen og få vist den basale syntax for problemløser funktionerne under VBA, inden man kaster sig ud i de helt store modeller. Product mix fra VBA I det første eksempel skal Product mix eksemplet løses ved at anvende en subrutine i VBA. Kald denne subrutine Solve_product_mix. Koden til at løse dette problem er faktisk ligetil og ser i alt sin enkelthed således ud:

Tor Beltov - Side 16/44 Sub Solve_Product_Mix() Range("C11:C15").Select Selection.FormulaArray = _ "=MMULT($D$11:$F$15,TRANSPOSE($D$9:$f$9))" SolverOk SetCell:="$D$18", MaxMinVal:=1, ValueOf:="0", ByChange:="$D$9:$F$9" SolverAdd CellRef:="$C$11:$C$15", Relation:=1, FormulaText:="$B$11:$B$15" SolverAdd CellRef:="$D$9:$F$9", Relation:=3, FormulaText:="0" SolverSolve userfinish:=true End Sub Koden trin for trin 1. Range("C11:C15").Select 2. Selection.FormulaArray ="=MMULT($D$11:$F$15,TRANSPOSE($D$9:$f$9))" ad 1) ad 2) Cellerne C11:C15 vælges Selection.FormulaArray betyder blot Lav en matrixformel og placer udtrykket i de celler der er markeret. Udtrykket er vores gamle ven Ax T bare skrevet ud med $?$? i stedet for rangelabelerne - det ser vi på senere. 3. SolverOk SetCell:="$D$18", MaxMinVal:=1, ValueOf:="0", ByChange:="$D$9:$F$9" 4. SolverAdd CellRef:="$C$11:$C$15", Relation:=1, FormulaText:="$B$11:$B$15" 5. SolverAdd CellRef:="$D$9:$F$9", Relation:=3, FormulaText:="0" 6. SolverSolve userfinish:=true ad 3) SolverOk svarer til at vælge problemløseren fra funktioner menuen og specificere forskellige options i problemløserparametre dialogboksene. Dialogboksen bliver ikke vist. SetCell bliver sat lig objektfunktionscellen = $D$18 MaxMinVal:=1 betyder Maksimering ValueOf:="0" bliver ikke anvendt når der maksimeres eller minimeres ByChange:="$D$9:$F$9" angiver beslutningsvariabelcellerne

Tor Beltov - Side 17/44 ad 4) SolverAdd svarer til at vælge problemløseren fra funktioner menuen og vælge Tilføj i problemløserparametre dialogboksen. Addere en ligning til problemet. CellRef:="$C$11:$C$15" angiver venstresiden Relation:=1 betyder mindre end ( <= ) FormulaText:="$B$11:$B$15" angiver højresiderne ad 5) Samme, men her er venstresiden lig beslutningsvariablene og højresiden blot angivet med et nul (0) - dvs. ikke-negativitetsbetingelserne. Ad 6) SolverSolve kalder løseren userfinish:=true - betyder at vi ikke vil se resultatboksen, men vi vil blot have løsningen indskrevet i de celler der før er blevet angivet - beslutningsvariabelcellerne. Hvad med Ranges? Hvis koden skal formuleres ved hjælp af de før tildelte ranges, vil den eneste forskel være at alle celle-referencerne nu erstattes med navnene for de enkelte ranges: Sub Solve_Product_Mix_with_ranges() SolverReset Range( DeleAnvendt ).Select Selection.FormulaArray = _ "=MMULT(Koefficienter,TRANSPOSE(Produkter))" SolverOk SetCell:="TotalProfit", MaxMinVal:=1, ValueOf:="0", ByChange:="Produkter" SolverAdd CellRef:="DeleAnvendt", Relation:=1, FormulaText:="LagerBeh" SolverAdd CellRef:="Produkter", Relation:=3, FormulaText:="0" SolverSolve userfinish:=true End Sub Altså ingen ændring - på nær den første linie - SolverReset - som sletter alle informationer vedrørende Problemløserens tidligere parametre.

Tor Beltov - Side 18/44 Indlæsning af data Hvis data ikke ligger i et Excel regneark, skal et såkaldt interface programmeres. Alternativt kan filen importeres, men typisk ligger data ikke i et særlig import-venligt format. Programmeringen af et interface er ikke særlig besværligt. En måde at gøre det på er at læse alt informationen ind som tekststrenge og derefter plukke de relevante informationer ud som hele matricen af strenge indeholder. Det vil vi prøve! Antag at vores inputfil har følgende udseende: * Product Mix example * Dimensions 5 3 * Profit coefficiens 75 50 35 * Constrains coefficiens order is a11 a12 a13 a21... a53 1 1 0 1 0 0 2 2 1 1 1 0 2 1 1 * Right hand sides 450 250 800 450 600 Det er måske ikke lige til at se, men disse data er identiske med de data vi har set på hele tiden. Hvordan læses denne ascii-fil ind i Excel? Det oplagte valg er at programmere en lille rutine sammen i VBA, som formaterer og tilrettelægger data på en ordentlig måde. Hvis ideen fra før skal forfølges, indlæses hele filen i en matrice af streng-typen. Herefter

Tor Beltov - Side 19/44 trækkes de værdier ud der er af interesse. En rutine som kan læse en ascii-fil og lægge indholdet ind i en matrice af strenge er listet herunder: (Dele af programmet genbruges senere - heri vil kommenteringen være bedre?) Sub Indlaes() Dim InputStrMat() As String Dim FilNumber As Integer, i As Integer Dim FileName As String FilNumber = FreeFile FileName = ".\Product_mix.inc" Open FileName For Input As #FilNumber i = 0 Do Until EOF(FilNumber) i = i + 1 ReDim Preserve InputStrMat(i) Input #FilNumber, InputStrMat(i) Loop Close #FilNumber End Sub Filens indhold er nu lagt over i matricen InputStrMat. Næste skridt er at få dette indhold over i et Excelregneark. Måden hvorpå dette kan gøres er rimelig mangfoldig, og det følgende er kun én blandt mange muligheder. Det er en god skik at lave et nyt regneark når der skal læses data ind i Excel. Efterfølgende kodelinier genererer et nyt regneark og kalder det Product_Mix. Dim currentbook As Object Set currentbook = Application.ActiveWorkbook currentbook.worksheets.add before:=currentbook.worksheets(1) currentbook.activesheet.name = "Product_Mix" De primære oplysninger i vores vektor af strenge er dimensionerne på vores indeks - her 5 og 3. Product-Mix problemet består som bekendt af 5 ligninger, i, og 3 kolonner, j. For at få disse tal ud og langt over i variablerne i og j kodes følgende linier: i = Val(InputStrMat(3)) j = Val(InputStrMat(4)) Dimensionen er dermed fastlagt, og resten af koden som lægger de indlæste værdier over i et regneark og løser for disse, kan derfor se således ud:

Tor Beltov - Side 20/44 Sub Indlaes() ' Variable til input filen Dim FilNumber As Integer Dim FileName As String ' Dynamisk vektor til input Dim InputStrMat() As String ' Forskellige taellervariable Dim i As Integer, j As Integer, j_max As Integer, i_max As Integer ' Range variabel Dim myrange As Range ' Objektvariabel Dim currentbook As Object ' Aaben et nyt regneark Set currentbook = Application.ActiveWorkbook currentbook.worksheets.add before:=currentbook.worksheets(1) currentbook.activesheet.name = "Product_Mix" ' Skriver lidt Set myrange = Range("a1:g4") myrange.borderaround ColorIndex:=5, Weight:=xlMedium Range("a1:a4").Font.Size = 8 Cells(1, 1).Value = "Firmaet fremstiller TV-apparater, stereoanlæg og højttalersystemer ved at samle enkeltkom-" Cells(2, 1).Value = "ponenter som strømforsyninger, højttalere m.v. Firmaet har kun et begrænset antal kompo-" Cells(3, 1).Value = "nenter, så den mest rentable varesammensætning ønskes fundet. Men avancen pr. færdig-" Cells(4, 1).Value = "vare falder med antallet, fordi prisnedsættelser er nødvendige for at sælge flere produkter." ' Tegn nogle rammer Range("a8:f15").BorderAround ColorIndex:=5, Weight:=xlMedium Range("b11:c15").BorderAround ColorIndex:=9, Weight:=xlMedium Range("b17:f18").BorderAround ColorIndex:=9, Weight:=xlMedium 'Nu begynder input FilNumber = FreeFile FileName = "c:\myfiles\laerebog\product_mix.inc" Open FileName For Input As #FilNumber i = 0 Do Until EOF(FilNumber) i = i + 1 ReDim Preserve InputStrMat(i) Input #FilNumber, InputStrMat(i) Loop Luk filen igen Close #FilNumber ' Definer stoerrelsen af problemet ved at laese i InputStrMat ' pa pladserne 3 og 4 i_max = Val(InputStrMat(3)) j_max = Val(InputStrMat(4)) ' Definer beslutningsvariabel cellerne With Cells(9, 4).Offset(0, -2).Value = "Antal, der skal samles".offset(0, -2).Font.Size = 8 Set myrange = Range(.Offset(0, 0),.Offset(0, j_max - 1)) myrange.name = "Produkter" myrange.borderaround ColorIndex:=4, Weight:=xlThick

Tor Beltov - Side 21/44 ' Indlaes vaerdier til hoejresiderne - i kolonne 2 = kolonner B With Cells(11, 2).Offset(-1, 0).Value = "På lager".offset(-1, 0).Font.Size = 8 Set myrange = Range(.Offset(0, 0),.Offset(i_max - 1, 0)) myrange.name = "LagerBeh" For i = 0 To i_max - 1.Offset(i, 0).Value = Val(InputStrMat(26 + i)) Next ' Indlaeser koefficienterne... With Cells(11, 4) Set myrange = Range(.Offset(0, 0),.Offset(i_max - 1, j_max - 1)) With myrange.name = "Koefficienter".HorizontalAlignment = xlcenter ' og placer dem ordentligt For i = 0 To i_max - 1 For j = 0 To j_max - 1.Offset(i, j).value = Val(InputStrMat(j + 10 + (i * j_max))) Next j Next i ' Indlaeser profit koefficienterne With Cells(17, 4).Offset(0, -2).Value = "Profit pr. stk.".offset(0, -2).Font.Size = 8 Set myrange = Range(.Offset(0, 0),.Offset(0, j_max - 1)) myrange.name = "Profit" For j = 0 To j_max - 1.Offset(0, j).value = Val(InputStrMat(6 + j)) Next ' Definer Profitfunktionen Set myrange = Range("D18") With myrange.name = "TotalProfit".Offset(0, -1).Value = "Total".Offset(0, -1).Font.Size = 8.Formula = "=SUMPRODUCT(Profit,Produkter)".BorderAround ColorIndex:=5, Weight:=xlThick 'Definer venstresiderne i ligningerne with Cells(11,2) Set myrange = Range(.Offset(0,0),.Offset(i_max - 1,0)) With myrange.name = "DeleAnvendt".Offset(-1, 0).Value = "Antal brugt".offset(-1, 0).Font.Size = 8.Offset(0, 0).Font.Size = 10.FormulaArray = _ "=MMULT(Koefficienter,TRANSPOSE(Produkter))" 'Saa kan vi loese - denne del har vi set foer SolverOk SetCell:="TotalProfit", MaxMinVal:=1, ValueOf:="0", ByChange:="Produkter" SolverAdd CellRef:="DeleAnvendt", Relation:=1, FormulaText:="LagerBeh" SolverAdd CellRef:="Produkter", Relation:=3, FormulaText:="0" SolverOptions AssumeLinear:=True

Tor Beltov - Side 22/44 SolverSolve userfinish:=true 'Program slut End Sub Koden er rimelig selv-dokumenteret, og mange af kommandoerne selvforklarende. En god idé er at prøve programmet selv, det er mange gange nemmere at forstå hvad der egentlig foregår når koden gennemløbes trinvis ved at anvende F8 - tasten. Ovenstående gav et eksempel på hvorledes et generelt LP - problem kunne indlæses og løses, når man anvender VBA. I det efterfølgende skal vi se på hvordan man alene ud fra en afstandsmatrice kan stille et TSP problem op. Et TSP problem. Alfred Jensen er rejsende i vin og tobak og bor i Odense. Han planlægger at skulle besøge nogle tobaks- og vinhandlere i Bogense, Fåborg, Kerteminde og Svendborg på sin næste tur. Et af hans problemer i den forbindelse er at finde ud af i hvilken rækkefølge, de fire byer skal besøges, i det Jensen ønsker at minimere det samlede antal kørte kilometer og dermed sit benzinforbrug. De relevante afstandsdata er gengivet i skemaet nedenfor: Odense Bogense Fåborg Kerteminde Svendborg Odense 29 38 20 44 Bogense 29 62 48 80 Fåborg 38 62 56 26 Kerteminde 20 48 56 48 Svendborg 44 80 26 48 Lad Odense været indekseret 1, Bogense 2, Fåborg 3, Kerteminde 4 og Svendborg 5. Lad os x ij i, j = 1,..., 5 introducere en binær variabel, til hver kant (vej) imellem knuderne (byerne), der antager værdien 1' hvis og kun hvis kanten fra knude i til knude j traverseres i retningen fra i til j. Den binære variabel x 35 svarer altså til kanten, der forbinder Fåborg med Svendborg, og den vil antage værdien 1' hvis og kun hvis Jensen på sin tur kører fra Fåborg direkte videre til Svendborg.

Tor Beltov - Side 23/44 Målfunktionen til dette problem kan skrives som: 29x + 38x + 20x + 44x + 12 13 14 15 29x + 62x + 48x + 80x + 21 23 24 25 38x + 62x + 56x + 26x + 31 32 34 35 20x + 48x + 56x + 48x + 41 42 43 45 44x + 80x + 26x + 48x 51 52 53 54 Idet enhver by skal besøges netop en gang, og turen skal slutte i Odense, skal Jensen køre til hver af de fem byer netop en gang: x + x + x + x = 1 21 31 41 51 x + x + x + x = 1 12 32 42 52 x + x + x + x = 1 13 23 43 53 x + x + x + x = 1 14 24 34 54 x + x + x + x = 1 15 25 35 45 Hvor første ligning angiver en kant som fører ind i Odense, anden ligning angiver en kant som fører ind i Bogense, den tredie ind i Fåborg, den fjerde ind i Middelfart, og den femte en kant som fører ind i Svendborg. Enhver by skal tilsvarende forlades præcis en gang: x + x + x + x = 1 12 13 14 15 x + x + x + x = 1 21 23 24 25 x + x + x + x = 1 31 32 34 35 x + x + x + x = 1 41 42 43 45 x + x + x + x = 1 51 52 53 54

Tor Beltov - Side 24/44 Hvor første ligning angiver en kant som fører ud fra Odense, anden ligning angiver en kant som fører ud fra Bogense, den tredie ud fra Fåborg, den fjerde ud fra Middelfart, og den femte en kant som fører ud fra Svendborg. En første version af Alfred Jensens problem kan derfor formuleres: Min S.t. x ij = 0 / 1, i, j = 1,..., 5, i j 29x + 38x + 20x + 44x + 12 13 14 15 29x + 62x + 48x + 80x + 21 23 24 25 38x + 62x + 56x + 26x + 31 32 34 35 20x + 48x + 56x + 48x + 41 42 43 45 44x + 80x + 26x + 48x 51 52 53 54 x + x + x + x = 1 21 31 41 51 x + x + x + x = 1 12 32 42 52 x + x + x + x = 1 13 23 43 53 x + x + x + x = 1 14 24 34 54 x + x + x + x = 1 15 25 35 45 x + x + x + x = 1 12 13 14 15 x + x + x + x = 1 21 23 24 25 x + x + x + x = 1 31 32 34 35 x + x + x + x = 1 41 42 43 45 x + x + x + x = 1 51 52 53 54 Lad os få disse oplysninger ind i Excel. Mange gange ligger afstandsmatricen i et ascii-format, så lad os antage at det også er tilfældet med denne, og at filen har følgende udseende: *afstandsmatrice til TSP-problem 1.2 29 1.3 38 1.4 20 1.5 44 2.3 62 2.4 48 2.5 80 3.4 56 3.5 26 4.5 48

Tor Beltov - Side 25/44 Som det ses, er kun den øvre del af afstandsmatricen angivet, men da begge veje er lovlige skal vores indlæsning også definere den nedre del af afstandsmatricen. VBA koden til at indlæse og løse for disse oplysninger er gengivet herunder: Public Sub indlaes_tsp() Dim FilNumber As Integer Dim FileName As String Dim Nr As String, tmpnr1 As String, tmpnr2 As String Dim Nr1 As Integer, Nr2 As Integer, IO As Double Dim Afstand(1 To 5, 1 To 5) As Double, Pos1 As Long, L As Long Dim i As Integer, j As Integer, Max_ij As Integer, Max_i As Integer Dim Offset_Col As Integer, Offset_Row As Integer ' Dynamisk vektor til input Dim InputStrMat() As String ' Range variabel Dim myrange As Range ' Objektvariabel Dim currentbook As Object ' Aaben et nyt regneark Set currentbook = Application.ActiveWorkbook currentbook.worksheets.add before:=currentbook.worksheets(1) currentbook.activesheet.name = "TSP-Problem" Offset_Col = 3 'Skriv fra og med kolonne D Offset_Row = 5 'Skriv fra og med række 5 FilNumber = FreeFile FileName = "c:\myfiles\laerebog\tsp.inc" Open FileName For Input As #FilNumber i = 0 Do Until EOF(FilNumber) i = i + 1 ReDim Preserve InputStrMat(i) Input #FilNumber, InputStrMat(i) Loop Max_i = i Close #FilNumber ' Find max node nummer Pos1 = InStr(InputStrMat(Max_i), " ") L = Pos1-1 tmpnr1 = Left(InputStrMat(Max_i), Pos1-1) Pos1 = InStr(tmpNr1, ".") Max_ij = Val(Right(String:=tmpNr1, Length:=L - Pos1)) ' Assign vaerdier laest til regnearket og matricen For i = 1 To Max_i If Left(InputStrMat(i), 1) <> "*" Then Pos1 = InStr(InputStrMat(i), " ") L = Pos1-1 tmpnr1 = Left(InputStrMat(i), Pos1-1) tmpnr2 = Right(InputStrMat(i), Len(InputStrMat(i)) - Pos1) Pos1 = InStr(tmpNr1, ".")

Tor Beltov - Side 26/44 Nr1 = Val(Left(String:=tmpNr1, Length:=Pos1-1)) Nr2 = Val(Right(String:=tmpNr1, Length:=L - Pos1)) ' Offset bruger vi ikke her - istedet anvendes Cells ' Vi skriver + Offset_row og + Offset_row for at begynde i celle D6 Cells(Offset_Row, Offset_Col + Nr2 + (Nr1-1) * Max_ij).Value = Val(tmpNr2) Cells(Offset_Row, Offset_Col + Nr1 + (Nr2-1) * Max_ij).Value = Val(tmpNr2) ' Afstandmatricen skal vi anvende senere til ligningsgenerering Afstand(Nr1, Nr2) = Val(tmpNr2) Afstand(Nr2, Nr1) = Val(tmpNr2) End If Next i 'Skriv lige et par labels For i = 1 To Max_ij For j = 1 To Max_ij Cells(Offset_Row - 1, Offset_Col + j + (i - 1) * Max_ij).Value = "x" & Str(i) & Str(j) Next j Next i ' Initialiser regnearket For j = 1 To Max_ij * Max_ij If IsEmpty(Cells(Offset_Row, Offset_Col + j)) Then Cells(Offset_Row, Offset_Col + j).value = 1000 End If Next j ' definerer koefficienterne... With Cells(Offset_Row + 3, Offset_Col + 1) Set myrange = Range(.Offset(0, 0),.Offset(Max_ij + Max_ij - 1, Max_ij * Max_ij - 1)) With myrange.name = "Koefficienter".HorizontalAlignment = xlcenter.borderaround ColorIndex:=5, Weight:=xlThick.Value = 0 ' Nu til ligningsgenereringen Offset_Row = 7 For j = 1 To Max_ij For i = 1 To Max_ij ' Er der en vej fra by j til i? If Afstand(j, i) > 0 Then ' Saa skriv i kolonne xji Cells(Offset_Row + j, Offset_Col + j + (i - 1) * Max_ij).Value = 1 End If Next i Next j For i = 1 To Max_ij For j = 1 To Max_ij ' Er der en vej fra by i til j If Afstand(i, j) > 0 Then ' Saa skriv i kolonne xij Cells(Offset_Row + Max_ij + i, Offset_Col + j + (i - 1) * Max_ij).Value = 1 End If Next j Next i Hoejreside definitioner For i = 1 To Max_ij + Max_ij Cells(Offset_Row + i, 2).Value = 1 Next i With Cells(6, Offset_Col + 1).Offset(0, -2).Value = "Beslutningsvariable"

Tor Beltov - Side 27/44.Offset(0, -2).Font.Size = 8 Set myrange = Range(.Offset(0, 0),.Offset(0, Max_ij * Max_ij - 1)) myrange.name = "Beslutningsvar" myrange.borderaround ColorIndex:=4, Weight:=xlThick ' Indlaes vaerdier til hoejresiderne - i kolonne 2 = kolonner B With Cells(Offset_Row, 2).Offset(0, 0).Value = "Højresiden".Offset(0, 0).Font.Size = 8 Set myrange = Range(.Offset(1, 0),.Offset(Max_ij + Max_ij, 0)) myrange.name = "hoejreside" For i = 1 To Max_ij + Max_ij.Offset(i, 0).Value = 1 Next ' definerer profit koefficienterne With Cells(Offset_Row - 2, Offset_Col + 1).Offset(0, -2).Value = "Omkostning pr. stk.".offset(0, -2).Font.Size = 8 Set myrange = Range(.Offset(0, 0),.Offset(0, Max_ij * Max_ij - 1)) myrange.name = "omkostninger" ' Definer Profitfunktionen Set myrange = Range("c3") With myrange.name = "Totalomkostninger".Offset(0, -1).Value = "Total".Offset(0, -1).Font.Size = 8.Formula = "=SUMPRODUCT(omkostninger,Beslutningsvar)".BorderAround ColorIndex:=5, Weight:=xlThick 'Definer venstresiderne i ligningerne With Cells(Offset_Row - 2,3) Set myrange = Range(.Offset(0,0),.Offset(Max_ij + Max_ij,0)) With myrange.name = "venstresiderne".formulaarray = _ "=MMULT(Koefficienter,TRANSPOSE(Beslutningsvar))" 'Saa kan vi loese SolverOk SetCell:="Totalomkostninger", MaxMinVal:=2, ValueOf:="0", ByChange:="Beslutningsvar" SolverAdd CellRef:="venstresiderne", Relation:=2, FormulaText:="hoejreside" SolverAdd CellRef:="Beslutningsvar", Relation:=5, FormulaText:="binær" SolverOptions AssumeLinear:=True SolverSolve userfinish:=true 'Program slut End Sub Løsningen af modellen giver følgende resultat: x = 1, x = 1, x = 1, x = 1, x = 1, resten nul. 14 42 21 35 53 Denne løsning indebærer 2 subture:

Tor Beltov - Side 28/44 dels turen: Odense - Kerteminde - Bogense - Odense, eller den modsatte vej. og dels turen: Fåborg - Svendborg - Fåborg. Den samlede tilbagelagte vej er 149 km, men løsningen er ikke brugbar fordi turen ikke er sammenhængende. Vi må derfor opstille yderligere betingelser så enhver brugbar løsning til problemet er en sammenhængende tur, der altså ikke involverer subture. Dette kan ske på flere måder. En af disse indebærer termer af eksemplet introduktion af det følgende sæt af yderligere bibetingelser: u u + 5 x 5 1 2 3 23 u u + 5 x 5 1 2 4 24 u u + 5 x 5 1 2 5 25 u u + 5 x 5 1 3 2 32 u u + 5 x 5 1 3 4 34 u u + 5 x 5 1 3 5 35 u u + 5 x 5 1 4 2 42 u u + 5 x 5 1 4 3 43 u u + 5 x 5 1 4 5 45 u u + 5 x 5 1 5 2 52 u u + 5 x 5 1 5 3 53 u u + 5 x 5 1 5 4 54 2 u 5, i = 2,..., 5 i Det ses, at der for enhver by bortset fra depotet i Odense er introduceret en kontinuert variabel u i,i = 2,..., 5 der ikke må antage værdier mindre end 2 eller større end 5, og at der for enhver

Tor Beltov - Side 29/44 kant, der forbinder 2 af de byer, der skal besøges, er introduceret en begrænsning. Grunden til at u erne restringeres til at ligge mellem værdierne 2 og 5 er kun, at de i så fald får en pæn fortolkning. Lad u 2 = 2, fordi knude {2} (Bogense) er den anden by (Odense er jo den første ) u 3 = 3 fordi knude {3} (Fåborg) er den tredie osv. Vi får dermed mulighed for at Koefficienten til den binære variabel i hver af disse begrænsningers venstreside er sat lig med antal knuder i problemet og højresiden er sat lig med antal knuder minus 1. Bemærk, at der ikke er introduceret en u variabel for depotet og, at der ikke er introduceret nogen begrænsninger for kanter der forbinder depotet med de øvrige byer. Lad os se hvordan disse variable og ligninger kan introduceres i den tidligere VBA - kode. Følgende kode skal indsættes lige før problemløseren kaldes ( der er ikke nogen grund til at lave en ny kode - vi kan sagtens genanvende den forgående assignment kode): ' Skriv u labelerne - j begynder med 2 - depotnoden For j = 2 To Max_ij Cells(Offset_Row - 3, Offset_Col + Max_ij * Max_ij + j - 1).Value = "u" & Str(j) Next j With Cells(Offset_Row - 1, Offset_Col + 1) Set myrange = Range(.Offset(0, 0),.Offset(0, Max_ij * Max_ij + Max_ij - 2)) With myrange.name = "Miller_b_v" ' foerst saettes Offset_Row til den sidste linie + 1 Offset_Row = Offset_Row + 2 * Max_ij With Cells(Offset_Row + 1, Offset_Col + 1) Set myrange = Range(.Offset(0, 0),.Offset((Max_ij - 1) * (Max_ij - 2) - 1, (Max_ij - 2) + Max_ij * Max_ij)) With myrange.name = "MillerKoef1".HorizontalAlignment = xlcenter.borderaround ColorIndex:=5, Weight:=xlThick.Font.ColorIndex = 15.Value = 0 For i = 2 To Max_ij For j = 2 To Max_ij If Afstand(i, j) > 0 Then Offset_Row = Offset_Row + 1 Cells(Offset_Row, Offset_Col + j + (i - 1) * Max_ij).Font.ColorIndex = 1 Cells(Offset_Row, Offset_Col + j + (i - 1) * Max_ij).Value = Max_ij Cells(Offset_Row, Max_ij * Max_ij + Offset_Col + i - 1).Font.ColorIndex = 1 Cells(Offset_Row, Max_ij * Max_ij + Offset_Col + i - 1).Value = 1 Cells(Offset_Row, Max_ij * Max_ij + Offset_Col + j - 1).Font.ColorIndex = 1 Cells(Offset_Row, Max_ij * Max_ij + Offset_Col + j - 1).Value = -1 Cells(Offset_Row, Offset_Col - 1).Value = Max_ij - 1

Tor Beltov - Side 30/44 End If Next j Next i 'Definer nye venstresider With Cells(Offset_Row + 1 - (Max_ij - 1) * (Max_ij - 2), 3) Set myrange = Range(.Offset(0, 0),.Offset((Max_ij - 1) * (Max_ij - 2) - 1, 0)) With myrange.name = "Miller_v_s".FormulaArray = _ "=MMULT(MillerKoef1,TRANSPOSE(Miller_b_v))" With Cells(Offset_Row + 1 - (Max_ij - 1) * (Max_ij - 2), 2) Set myrange = Range(.Offset(0, 0),.Offset((Max_ij - 1) * (Max_ij - 2) - 1, 0)) With myrange.name = "Miller_h_s" Og følgende ændringer laves i løserkaldet: Range("a2").Value = Max_ij Range("a2").Name = "n" 'Saa kan vi loese - men med nye beslutningsvariable og ligninger SolverOk SetCell:="Totalomkostninger", MaxMinVal:=2, ValueOf:="0", ByChange:="Miller_b_v" SolverAdd CellRef:="venstresiderne", Relation:=2, FormulaText:="hoejreside" SolverAdd CellRef:="Miller_v_s", Relation:=1, FormulaText:="Miller_h_s" SolverAdd CellRef:="Miller_b_v", Relation:=3, FormulaText:="2" SolverAdd CellRef:="Miller_b_v", Relation:=1, FormulaText:="n" SolverAdd CellRef:="Beslutningsvar", Relation:=5, FormulaText:="binær" SolverOptions AssumeLinear:=True SolverSolve userfinish:=true Programmet løser problemet og finder følgende løsning: x = 1, x = 1, x = 1, x = 1, x = 1, resten nul. 14 21 32 45 53 Denne løsning indebærer turen: Odense - Kerteminde - Svendborg - Fåborg - Bogense - Odense hvor den samlede tilbagelagte vej er 185 km. Turen kan med valget af værdier for u erne også direkte læses af disse. Værdierne er der har fået u 4 u = 5, u = 4, u = 2, u = 3, hvilket udsiger at byen 2 3 4 5 tilknyttet besøges som by nummer 2, osv.

Tor Beltov - Side 31/44 Afslutning. De foregående afsnit har givet en lille introduktion til hvordan Problemløseren kontrolleres i dels Excel og dels via VBA programmering. Noget af koden der er vist kan ved første øjekast virke noget uoverskuelig. Det bedste middel mod dette er at få fat i koden og udføre en stepvis afvikling, og dels aflæse de temporære variable og dels switche over i Excel og se hvad koden genererer.

Tor Beltov - Side 32/44 Appendix I SolverAdd SolverChange SolverDelete SolverFinish SolverFinishDialog SolverGet SolverLoad SolverOk SolverOkDialog SolverOptions SolverReset SolverSave SolverSolve SolverAdd Equivalent to choosing Solver... from the Tools menu and choosing the Add button in the Solver Parameters dialog box. Adds a constraint to the current problem. VBA Syntax SolverAdd(CellRef:=, Relation:=, FormulaText:=) CellRef is a reference to a cell or a range of cells on the active worksheet and forms the left hand side of the constraint. Relation specifies the arithmetic relationship between the left and right sides, or whether CellRef must have an integer value at the solution.

Tor Beltov - Side 33/44 Relation Relationship 1 <= 2 = 3 >= 4 Int (CellRef is an integer variable) FormulaText is the right hand side of the constraint and will often be a single number, but it may be a formula or a reference to a range of cells. If Relation is 4, FormulaText is ignored, and CellRef must be a subset of the By Changing Cells. If FormulaText is a reference to a range of cells, the number of cells in the range must match the number of cells in CellRef, although the shape of the areas need not be the same. For example, CellRef could be a row and FormulaText could refer to a column, as long as the number of cells is the same. Remarks The SolverAdd, SolverChange and SolverDelete functions correspond to the Add, Change, and Delete buttons in the Solver Parameters dialog box. You use these functions to define constraints. For many macro applications, however, you may find it more convenient to load the problem in a single step using the SolverLoad function. Each constraint is uniquely identified by the combination of the cell reference on the left and the relationship (<=, =, >= or int) between its left and right sides. This takes the place of selecting the appropriate constraint in the Tools Solver Parameters dialog box. You can manipulate constraints with SolverChange and SolverDelete. SolverChange Equivalent to choosing Solver... from the Tools menu and choosing the Change button in the

Tor Beltov - Side 34/44 Solver Parameters dialog box. Changes the right side of an existing constraint. VBA Syntax SolverChange(CellRef:=, Relation:=, FormulaText:=) For an explanation of the arguments and constraints, see SolverAdd. Remarks If the combination of CellRef and Relation does not match any existing constraint, the function returns the value 4 and no action is taken. To change the CellRef or Relation of an existing constraint, use SolverDelete to delete the old constraint and then use SolverAdd to add the constraint in the form you want. SolverDelete Equivalent to choosing Solver... from the Tools menu and choosing the Delete button in the Solver Parameters dialog box. Deletes an existing constraint. VBA Syntax SolverDelete(CellRef:=, Relation:=, FormulaText:=) For an explanation of the arguments and constraints, see SolverAdd. Remarks If the combination of CellRef and Relation does not match any existing constraint, the function returns the value 4 and no action is taken. If the constraint is found, it is deleted, and the function returns the value 0.

Tor Beltov - Side 35/44 SolverFinish Equivalent to selecting options and clicking OK in the Solver Results dialog box that appears when the solution process is finished. The dialog box will not be displayed. VBA Syntax SolverFinish(KeepFinal:=, ReportArray:=) KeepFinal is the number 1 or 2 and specifies whether to keep or discard the final solution. If KeepFinal is 1 or omitted, the final solution values are kept in the changing cells. If KeepFinal is 2, the final solution values are discarded and the former values of the changing cells are restored. ReportArray is an array argument specifying what reports to create when Solver is finished. If ReportArray is Microsoft Excel creates {1} An Answer Report {2} A Sensitivity Report {3} A Limit Report A combination of these values produces multiple reports. For example, if ReportArray = {1,2}, Microsoft Excel creates an answer report and a sensitivity report. Use the Array function in VBA to create an array of constant values. SolverFinishDialog Equivalent to selecting options in the Solver Results dialog box that appears when the solution process is finished. The dialog box will be displayed, and the user will be able to change the options you initially specify. VBA Syntax

Tor Beltov - Side 36/44 SolverFinishDialog(KeepFinal:=, ReportArray:=) For an explanation of the arguments, see SolverFinish. SolverGet Returns information about the current Solver problem. The settings are specified in the Solver Parameters and Solver Options dialog boxes, or with the other Solver functions described on this page. VBA Syntax SolverGet(TypeNum:=, SheetName:=) TypeNum is a number specifying the type of information you want. The following settings are specified in the Solver Parameters dialog box. TypeNum Returns 1 The reference in the Set Cell box, or the #N/A error value if Solver has not been used on the active document 2 A number corresponding to the Equal To option 1 = Max 2 = Min 3 = Value Of 3 The value in the Value Of box 4 The reference in the By Changing Cells box 5 The number of constraints 6 An array of the left sides of the constraints in the form of text 7 An array of numbers corresponding to the relationships between the left and right sides of the constraints: 1 = <= 2 = = 3 = >= 4 = int

Tor Beltov - Side 37/44 8 An array of the right sides of the constraints in the form of text The following settings are specified in the Solver Options dialog box: TypeNum Returns 9 The maximum calculation time 10 The maximum number of iterations 11 The precision (as a decimal number) 12 The integer tolerance value (as a decimal number) 13 TRUE if Assume Linear Model or Assume LP/QP Model check box is selected; FALSE otherwise 14 TRUE if Show Iteration Result check box is selected; FALSE otherwise 15 TRUE if Use Automatic Scaling check box is selected; FALSE otherwise 16 A number corresponding to the type of estimates: 1 = Tangent 2 = Quadratic 17 A number corresponding to the type of derivatives: 1 = Forward 2 = Central 18 A number corresponding to the type of search: 1 = Newton 2 = Conjugate SheetName is the name of a worksheet that contains the Solver problem for which you want information. If SheetName is omitted, it is assumed to be the active sheet. SolverLoad Equivalent to choosing Solver... from the Tools menu, choosing the Options button from the

Tor Beltov - Side 38/44 Solver Parameters dialog box, and choosing the Load Model button in the Solver Options dialog box. Loads Solver problem specifications that you have previously saved on the worksheet. VBA Syntax SolverLoad(LoadArea:=) LoadArea is a reference on the active worksheet to a range of cells from which you want to load a complete problem specification. The first cell in LoadArea contains a formula for the Set Cell Box; the second cell contains a formula for the changing cells; subsequent cells contain constraints in the form of logical formulas. The last cell optionally contains an array of Solver option values (see SolverOptions). Although LoadArea must be on the active worksheet, it need not be the current selection. SolverOk Equivalent to choosing Solver... from the Tools menu and specifying options in the Solver Parameters dialog box. Specifies basic Solver options. The dialog box will not be displayed. VBA Syntax SolverOk(SetCell:=, MaxMinVal:=, Valueof:=, ByChange:=) SetCell corresponds to the Set Cell box in the Solver Parameters dialog box (the objective function in the optimization problem). SetCell must be a reference to a cell on the active worksheet. If you enter a cell, you must enter a value for MaxMinVal. In the macro language syntax, if you do not enter a cell, you must include three commas before the ByChanging value. MaxMinVal corresponds to the options Max, Min and Value Of in the Solver Parameters

Tor Beltov - Side 39/44 dialog box. Use this option only if you entered a reference for SetCell. MaxMinVal Option specified 1 Maximize 2 Minimize 3 Match specific value ValueOf is the number that becomes the target for the cell in the Set Cell box if MaxMinVal is 3. ValueOf is ignored if the cell is being maximized or minimized. ByChanging indicates the changing cells (decision variables), as entered in the By Changing Cells box. ByChanging must be a cell reference (usually a cell range or multiple reference) on the active worksheet. SolverOkDialog Equivalent to choosing Solver... from the Tools menu and specifying options in the Solver Parameters dialog box. The Solver Parameters dialog box will be displayed, and the user will be able to change the options you initially specify. VBA Syntax SolverOkDialog(SetCell:=, MaxMinVal:=, Valueof:=, ByChange:=) For an explanation of the arguments, see SolverOk. SolverOptions Equivalent to choosing Solver... from the Tools menu and then choosing the Options button in the Solver Parameters dialog box. Specifies the Solver algorithmic options.