|
> No.3476[元記事へ]
DEBUG ON
!---------------------------------------------------------------------
! TSP 問題 (Traveling Salesman Problem) の付録
!---------------------------------------------------------------------
! 先の投稿で、
! ・・都市配置が、等辺の格子状の場合は 特別で、
! 最短コースが、目視で直視でき、それを、100% の距離として・・・
! としたが、
! それを、任意な都市数 M_ で、順に表示してみるプログラム。
!
! 左クリック押し下げの間、一時停止。 右クリック終了。
!---------------------------------------------------------------------
! これを、初期 node とすれば、先のプログラムは、100% の最短距離へ
! 引き込めるけれども、node 移動パラメーター G_=1~1.4 くらいの時だけで、
! 吸引と言えるか否か、G_=40~50 では、形を失い、あまり意味はないようです。
! この実験をするには、先の投稿プログラムを以下のようにします。
!
!1)----------調整項目( 定数 )
! LET C_=M_
! LET G_=1~1.4
!2)----------調整項目( 都市 の並べ方)
! CALL set_grid(x) ← 投稿時の格子状のまま
! CALL shuffle(x) ←シャッフルの有無は、どちらでもよい
!3)----------調整項目( 初期 node の並べ方)
! CALL set_grid_order(c) ←このcall追加、他のcall停止。
!
!4)末尾に、今回の、SUB set_grid_order(x()) ~ END SUB を追加。
!---------------------------------------------------------------------
OPTION ARITHMETIC COMPLEX
LET hw=460
LET vw=460
SET BITMAP SIZE hw+41, vw+41
SET WINDOW -20, hw+20, -20, vw+20 !左,右, 下,上
!---
SET COLOR MIX(0) 0,0,0 !CLEAR 文で黒にする。
SET COLOR MIX(1) 1,1,1 !text,line, 初期カラーを白にする。
SET POINT STYLE 7
SET TEXT font "",14
SET TEXT COLOR 1
LET tx0=COMPLEX(0,vw-8) !文字列 左下端
!
OPTION BASE 0
DIM x(600) !都市 座標
!
!----------------------------------------
! メイン
!----------------------------------------
FOR M_=100 TO 1 STEP -1 !M_= 都市数
LET vn=INT( SQR(M_) )
LET hn=vn
IF vn*hn< M_ THEN LET hn=vn+1 !hn: 横列数 (端数列込み)
IF vn*hn< M_ THEN LET vn=vn+1 !vn: 縦行数
! LET ss1=vw/vn !距離の単位長 (格子の一辺の長さ) ※M_ が昇順の時。
IF ss1=0 THEN LET ss1=vw/vn !距離の単位長 (格子の一辺の長さ) ※最初の幅を固定
!--
CALL set_grid_order(x) !格子状配置 最短距離コース
!--
SET DRAW mode hidden
CLEAR
CALL pl_city_sts !表示
SET DRAW mode explicit
LET i=0
DO
mouse poll mox,moy,mlb,mrb
IF mrb=1 THEN EXIT FOR
LET i=i+1-mlb
WAIT DELAY .05
LOOP UNTIL 18<=i
NEXT M_
!----------------------------------------
! 描画
!----------------------------------------
SUB pl_city_sts !都市と、その連結線
SET POINT COLOR 6
SET LINE COLOR 5
LET TL=0
LET wb=x(0)
FOR i=M_-1 TO 0 STEP -1
LET w=x(i)
PLOT POINTS: w
PLOT LINES: wb;w
LET TL=TL+ABS(w-wb)
LET wb=w
NEXT i
!----都市数 距離
PLOT label,AT tx0 ,USING "都市数=#### 距離=###.##": M_,TL/ss1
END SUB
!-------------------------------
! 都市 格子状配置 最短距離コース
!-------------------------------
!--+----------------------------+------------------------
! ! 横:偶数 ! 横:奇数
!--+----------------------------+------------------------
! !・・・・・・ ┌┐┌┐┌┐ !・・・・・ ┌┐┌→┐
! !・・・・・・ ↑↓↑↓↑↓ !・・・・・ ↑↓↑┌┘
! !・・・・・・ ↑└┘└┘↓ !・・・・・ ↑└┘└┐
! !・・・・・・ └←←←←┘ !・・・・・ └←←←┘
! ! !
!縦!・・・・・ ┌┐┌┐ < !・・・・ ┌┐┌ <
! !・・・・・・ ↑↓↑↓↑> !・・・・・ ↑↓↑┌>
!偶!・・・・・・ ↑└┘└┘↓ !・・・・・ ↑└┘└┐
!数!・・・・・・ └←←←←┘ !・・・・・ └←←←┘
! ! !
! !・・・・・ ┌┐┌→┐ !・・・・ ┌┐┌┐
! !・・・・・ ↑↓↑┌┘ !・・・・ ↑↓↑↓
! !・・・・・・ ↑└┘└→┐ !・・・・・ ↑└┘└┐
! !・・・・・・ └←←←←┘ !・・・・・ └←←←┘
! ! !
! !・・・・・ ┌┐┌→┐ !・・・・ ┌┐┌┐ !・・・・ ┌┐┌┐
! !・・・・・ ↑↓↑┌┘ !・・・・ ↑↓↑↓ !・・・・ ↑↓↑↓
! !・・・・・ ↑└┘└ < !・・・・ ↑└┘ < !・・・・ ↑└┘↓
! !・・・・・・ └←←←←> !・・・・・ └←←←> !・・・・ └←←┘
!--+----------------------------+------------------------
! ! 横:偶数 ! 横:奇数
!--+----------------------------+------------------------
! !・・・・・・ ┌┐┌┐┌┐ !・・・・・ ┌┐┌→>
! !・・・・・・ ↑↓↑↓↑↓ !・・・・・ ↑↓↑ <┐
! !・・・・・・ ↑↓↑↓↑↓ !・・・・・ ↑↓↑┌┘
! !・・・・・・ ↑└┘└┘↓ !・・・・・ ↑└┘└┐
! !・・・・・・ └←←←←┘ !・・・・・ └←←←┘
! ! !
!縦!・・・・・ ┌┐┌┐ < !・・・・ ┌┐┌┐
! !・・・・・・ ↑↓↑↓↑> !・・・・・ ↑↓↑└┐
!奇!・・・・・・ ↑↓↑↓↑↓ !・・・・・ ↑↓↑┌┘
!数!・・・・・・ ↑└┘└┘↓ !・・・・・ ↑└┘└┐
! !・・・・・・ └←←←←┘ !・・・・・ └←←←┘
! ! !
! !・・・・・ ┌┐┌→┐ !・・・・ ┌┐┌┐
! !・・・・・ ↑↓↑┌┘ !・・・・ ↑↓↑ <
! !・・・・・・ ↑↓↑↓┌┐ !・・・・・ ↑↓↑┌>
! !・・・・・・ ↑└┘└┘↓ !・・・・・ ↑└┘└┐
! !・・・・・・ └←←←←┘ !・・・・・ └←←←┘
! ! !
! !・・・・・ ┌┐┌→┐ !・・・・ ┌┐┌┐
! !・・・・・ ↑↓↑┌┘ !・・・・ ↑↓↑↓
! !・・・・・ ↑↓↑↓ < !・・・・ ↑↓↑↓
! !・・・・・・ ↑└┘└┘> !・・・・・ ↑└┘└┐
! !・・・・・・ └←←←←┘ !・・・・・ └←←←┘
! !--------- 特2/------------!
! !・・・・・ ┌┐┌→> !・・・・ ┌┐┌┐ !・・・・ ┌┐┌┐
! !・・・・・ ↑↓↑ <┐ !・・・・ ↑↓↑↓ !・・・・ ↑↓↑↓
! !・・・・・ ↑↓↑┌┘ !・・・・ ↑↓↑↓ !・・・・ ↑↓↑↓
! !・・・・・ ↑└┘└ < !・・・・ ↑└┘ < !・・・・ ↑└┘↓
! !・・・・・・ └←←←←> !・・・・・ └←←←> !・・・・ └←←┘
!--+----------------------------+------------------------
SUB set_grid_order(x())
LET rn=MOD(M_,vn) !rn: 右端列 の端数
IF rn=0 THEN LET rn=vn ! (端数0不可)
!--
LET mi=0
LET i=0
FOR j=0 TO vn-1 !・
LET x(mi)=ss1*COMPLEX(i,j) !↑
LET mi=mi+1 !・
NEXT j
LET i=i+1
!--
IF MOD(hn,2)=0 THEN
!--------------------------------------------横:even
DO WHILE i< hn-2
LET j=vn-1 !→・
IF i=hn-3 THEN
!--
IF MOD(vn,2)=0 THEN
!-----------------------------------横:even 縦:even
LET w=CEIL(rn/2)*2 !2,2,4,4,6,6
ELSE
!-----------------------------------横:even 縦:odd
LET w=INT(rn/2)*2+1 !1,3,3,5,5,7,7
!--
IF rn=1 THEN
LET x(mi)=ss1*COMPLEX(i,j) !・
LET mi=mi+1
LET x(mi)=ss1*COMPLEX(i+1,j) !→
LET mi=mi+1
LET j=j-1
END IF
END IF
!--
LET d=1
FOR j=j TO w STEP -1
LET x(mi)=ss1*COMPLEX(i,j) !・
LET mi=mi+1
LET i=i+d
LET x(mi)=ss1*COMPLEX(i,j) !←→
LET mi=mi+1
LET d=-d
NEXT j
END IF
!--
LET w=j
FOR j=j TO 1 STEP -1 !→・
LET x(mi)=ss1*COMPLEX(i,j) ! ↓
LET mi=mi+1 ! ・
NEXT j
LET i=i+1
!--
IF i< hn-2 AND 0< w THEN LET w=vn-1 ! ・
FOR j=1 TO w ! ↑
LET x(mi)=ss1*COMPLEX(i,j) !→・
LET mi=mi+1
NEXT j
LET i=i+1
LOOP
!--
FOR j=rn-1 TO 1 STEP -1 !→・
LET x(mi)=ss1*COMPLEX(i,j) ! ↓
LET mi=mi+1 ! ・
NEXT j
ELSE
!--------------------------------------------横:odd
DO WHILE i< hn-3
FOR j=vn-1 TO 1 STEP -1 !→・
LET x(mi)=ss1*COMPLEX(i,j) ! ↓
LET mi=mi+1 !
NEXT j
LET i=i+1
FOR j=1 TO vn-1 ! ・
LET x(mi)=ss1*COMPLEX(i,j) !→↑
LET mi=mi+1 !
NEXT j
LET i=i+1
LOOP
!--
FOR j=vn-1 TO rn STEP -1 !→・
LET x(mi)=ss1*COMPLEX(i,j) ! ↓
LET mi=mi+1 !
NEXT j
!--
LET d=1
FOR j=j TO 1 STEP -1
LET x(mi)=ss1*COMPLEX(i,j) !・
LET mi=mi+1
LET i=i+d
LET x(mi)=ss1*COMPLEX(i,j) !←→
LET mi=mi+1
LET d=-d
NEXT j
END IF
FOR i=hn-1 TO 1 STEP -1 !
LET x(mi)=ss1*COMPLEX(i,j) !
LET mi=mi+1 !←・
NEXT i
END SUB
END
|
|