CS 100: Lecture L28
May 6
import java.io.*; public class L28 { public static void main(String args[]) { TokenReader in = new TokenReader(System.in); // Legal pedal sprocket values: int[] pAvail = {52,48,42,39,32,28}; // An initial bike int[] p = {52,48,42}; int[] w = {42,28,23,20,17,14,13}; Bike bestB = new Bike(p,w); double bestD = bestB.D(); int count=1; Bike B; double D; for(int i0=0;i0< 2;i0++) for(int i1=i0+1;i1< 5;i1++) for(int i2=i1+1;i2< 6;i2++) { // p[0] > p[1]> p[2] p[0]=pAvail[i0]; p[1]=pAvail[i1]; p[2]=pAvail[i2]; // Force highest gear ratio to equal 4 and the lowest gear ratio to be 1. w[0]=p[2]; w[6]=p[0]/4; // Now choose w[1],...,w[5] so that w[0] > w[1] > w[2] > w[3] > w[4] > w[5] > w[6] for(w[5]=w[6]+1;w[5]< w[0];w[5]++) for(w[4]=w[5]+1;w[4]< w[0];w[4]++) for(w[3]=w[4]+1;w[3]< w[0];w[3]++) for(w[2]=w[3]+1;w[2]< w[0];w[2]++) for(w[1]=w[2]+1;w[1]< w[0];w[1]++) { count++; B = new Bike(p,w); D = B.D(); if(D < bestD) { bestD = D; bestB = B; } } } System.out.println("Number of Bikes checked = " + count); bestB.ShowBike(); in.waitUntilEnter(); } }
public class Bike { private int[] pedalSprockets; // pedalSprockets[i] = # teeth on the ith pedal sprocket. private int[] wheelSprockets; // wheelSprockets[i] = # teeth on the ith wheel sprocket. private double[] g; // The gear ratios sorted from smallest to largest. public Bike(int[]p, int[]w) { int n = p.length; pedalSprockets = new int[n]; for(int i=0;i< n;i++) pedalSprockets[i] = p[i]; int m = w.length; wheelSprockets = new int[m]; for(int i=0;i< m;i++) wheelSprockets[i] = w[i]; int nGears = n*m; g = new double[nGears]; int k=0; for(int i=0;i< n;i++) { for(int j=0;j< m;j++) { g[k] = (double)p[i]/w[j]; k++; } } sort(g); } // Objective function that measures the "distance" to the idea bike that has equally spaced // gear ratios from 1 to 4. public double D() { double s = 0; double giPerfect; for(int i=0;i< g.length;i++) { giPerfect = 1 + .15*i; // s = s+Math.abs(g[i] - giPerfect); s = Math.max(s,Math.abs(g[i] - giPerfect)); } return s; } // Permute the values in t so sorted from smallest to largest public static void sort(double[] t) { int n=t.length; double temp; int pass=1; int swaps; boolean Sorted = false; while (!Sorted) { swaps=0; for (int j = 0; j < n - pass; j++) { if (t[j+1]< t[j]) { temp = t[j+1]; t[j+1] = t[j]; t[j] = temp; swaps++; } } pass++; Sorted = (pass == n) || swaps==0; } } // Pretty print the bike. public void ShowBike() { System.out.println(); for(int i=0;i< pedalSprockets.length;i++) System.out.print(pedalSprockets[i] + " "); System.out.println(); for(int i=0;i< wheelSprockets.length;i++) System.out.print(wheelSprockets[i] + " "); System.out.println(""); System.out.println(""); for(int i=0;i< g.length;i++) if (i>0 && i%11==0) Format.println(System.out,"%5.2f ",g[i]); else Format.print(System.out,"%5.2f ",g[i]); System.out.println("\n"); System.out.println("D = "+this.D()); } }